当前位置 - 股票行情交易網 - 股票交易 - MATLAB 回聲信號的產生與消除

MATLAB 回聲信號的產生與消除

%我們使用QQ語音聊天的時候,如果不帶耳機,而使用喇叭。那麽麥克風會收到兩個信號:第壹個人聲,第二個,從喇叭傳出的聲音(回聲)。本程序用語消除回聲。

%首先使長時間的FIR濾波器產生回聲。(產生房間的沖擊響應)

M = 4001;

fs = 8000;

[B,A] = cheby2(4,20,[0.1 0.7]);

Hd = dfilt.df2t([zeros(1,6) B],A);

hFVT = fvtool(Hd); % Analyze the filter

set(hFVT, 'Color', [1 1 1])

H = filter(Hd,log(0.99*rand(1,M)+0.01).*sign(randn(1,M)).*exp(-0.002*(1:M)));

H = H/norm(H)*4; % Room Impulse Response

plot(0:1/fs:0.5,H);

xlabel('Time [sec]');

ylabel('Amplitude');

title('Room Impulse Response');

set(gcf, 'Color', [1 1 1])

%然後讀取matlab裏面自帶的人聲,並且播放(不必緊張,這不是英語聽力)

load nearspeech

n = 1:length(v);

t = n/fs;

plot(t,v);

axis([0 33.5 -1 1]);

xlabel('Time [sec]');

ylabel('Amplitude');

title('Near-End Speech Signal');

set(gcf, 'Color', [1 1 1])

p8 = audioplayer(v,fs);

playblocking(p8);

The Far-End Speech Signal

%現在播放回聲:就是從喇叭發出,房間反彈,最後被麥克風接收到的聲音。這把聲音是通過我們上面設計的FIR濾波器產生的

load farspeech

x = x(1:length(x));

dhat = filter(H,1,x);

plot(t,dhat);

axis([0 33.5 -1 1]);

xlabel('Time [sec]');

ylabel('Amplitude');

title('Far-End Echoed Speech Signal');

set(gcf, 'Color', [1 1 1])

p8 = audioplayer(dhat,fs);

playblocking(p8);

%人聲和回聲加在壹起,麥克風接收到的實際聲音是:

d = dhat + v+0.001*randn(length(v),1);

plot(t,d);

axis([0 33.5 -1 1]);

xlabel('Time [sec]');

ylabel('Amplitude');

title('Microphone Signal');

set(gcf, 'Color', [1 1 1])

p8 = audioplayer(d,fs);

playblocking(p8);

%使用頻域自適應濾波器去除回聲

mu = 0.025;

W0 = zeros(1,2048);

del = 0.01;

lam = 0.98;

x = x(1:length(W0)*floor(length(x)/length(W0)));

d = d(1:length(W0)*floor(length(d)/length(W0)));

% Construct the Frequency-Domain Adaptive Filter

hFDAF = adaptfilt.fdaf(2048,mu,1,del,lam);

[y,e] = filter(hFDAF,x,d);

n = 1:length(e);

t = n/fs;

pos = get(gcf,'Position');

set(gcf,'Position',[pos(1), pos(2)-100,pos(3),(pos(4)+85)])

subplot(3,1,1);

plot(t,v(n),'g');

axis([0 33.5 -1 1]);

ylabel('Amplitude');

title('Near-End Speech Signal');

subplot(3,1,2);

plot(t,d(n),'b');

axis([0 33.5 -1 1]);

ylabel('Amplitude');

title('Microphone Signal');

subplot(3,1,3);

plot(t,e(n),'r');

axis([0 33.5 -1 1]);

xlabel('Time [sec]');

ylabel('Amplitude');

title('Output of Acoustic Echo Canceller');

set(gcf, 'Color', [1 1 1])

p8 = audioplayer(e/max(abs(e)),fs);

playblocking(p8);

%凳凳凳凳,大功告成

%回聲的產生方法很多,還有壹種鏡像法,模擬聲音在壹個六面體房間內墻面的每次反彈。澳洲某個大學的哥們的個人主頁上有程序,有興趣可以找找。