Generación y eliminación de señales de eco en MATLAB
Cuando utilizamos el chat de voz QQ, si no usamos auriculares, utilizamos altavoces. Entonces el micrófono recibirá dos señales: primero la voz humana y segundo, el sonido proveniente del altavoz (eco). Este programa utiliza palabras para eliminar el eco.
Primero haga eco del filtro FIR de larga duración. (Genera respuesta de impulso de la habitación)
M = 4001;
fs = 8000;
[B, A] = cheby2(4, 20, [0.1 0.7) ]);
Hd = dfilt.df2t([zeros(1,6) B],A);
hFVT = fvtool(Hd); Analizar el filtro
set(hFVT, 'Color', [1 1 1])
H = filtro(Hd, log(0.99*rand(1, M) 0.01).*sign(randn(1 , M)).*exp(-0.002*(1:M)));
H = H/norm(H)*4; Respuesta al impulso de la habitación
plot(0: 1/fs: 0,5, H);
xlabel('Tiempo [seg]');
ylabel('Amplitud');
título( ' Room Impulse Response');
set(gcf, 'Color', [1 1 1])
Luego lee la voz humana que viene con matlab y reprodúcela (no es necesario Nervous , esto no es escuchar inglés)
cargar nearspeech
n = 1: length(v);
t = n/fs;
plot(t, v);
axis([0 33.5 -1 1]);
xlabel('Tiempo [seg]');
ylabel('Amplitud');
title('Señal de voz cercana');
set(gcf, 'Color', [1 1 1])
p8 = audioplayer(v,fs);
playblocking(p8);
La señal de voz del extremo lejano
Ahora reproduce el eco: Ese es el sonido que se emite desde el altavoz, rebota por la habitación y finalmente es captado por el micrófono.
Este sonido se genera a través del filtro FIR que diseñamos anteriormente
cargar voz lejana
x = x(1:length(x));
dhat = filter( H, 1, x);
plot(t, dhat);
axis([0 33.5 -1 1]);
xlabel ('Tiempo). [seg]');
ylabel('Amplitud');
title('Señal de voz con eco del extremo lejano'); 'Color', [1 1 1])
p8 = audioplayer(dhat, fs);
playblocking(p8);
Voz Agregada junto con el eco, el sonido real recibido por el micrófono es:
d = dhat v 0.001*randn(length(v), 1);
plot(t, d) ; p>
axis([0 33.5 -1 1]);
xlabel('Tiempo [seg]');
ylabel('Amplitud'); >
title('Señal de micrófono');
set(gcf, 'Color', [1 1 1])
p8 = audioplayer(d, fs ); /p>
playblocking(p8);
Usar filtro adaptativo de dominio de frecuencia para eliminar el eco
mu = 0.025
W0 = zeros(1, 2048);
del = 0,01;
lam = 0,98;
x = x(1:longitud(W0)*piso(longitud (x)/ length(W0)));
d = d(1:length(W0)*floor(length(d)/length(W0)));
Construya la frecuencia- Filtro adaptativo de dominio
hFDAF = adaptfilt.fdaf(2048, mu, 1, del, lam
[y, e] = filter(hFDAF, x, d);
n = 1: longitud(e);
t = n/fs;
pos = get(gcf,'Posición');
set(gcf, 'Posición', [pos(1), pos(2)-100, pos(3), (pos(4) 85)])
subtrama (3, 1 , 1);
plot(t, v(n), 'g');
eje([0 33.5 -1 1]); ylabel('Amplitud');
title('Señal de voz cercana');
subplot(3, 1, 2);
plot( t, d(n), 'b');
axis([0 33.5 -1 1]);
ylabel('Amplitud');
p>title('Señal de micrófono');
subpl
ot(3, 1, 3);
plot(t, e(n), 'r');
eje([0 33.5 -1 1]); p> p>
xlabel('Tiempo [seg]');
ylabel('Amplitud');
title('Salida del cancelador de eco acústico');
set(gcf, 'Color', [1 1 1])
p8 = audioplayer(e/max(abs(e)), fs);
playblocking (p8);
Taburete, taburete, taburete, ya está.
Hay muchas formas de generar ecos y también existe un método de duplicación, que simula cada rebote. del sonido en las paredes de una habitación hexaédrica. Hay un programa en la página personal de un amigo de una universidad en Australia. Si estás interesado, puedes buscarlo.