ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

音響エコー キャンセリング (AEC)

この例では、音響エコー キャンセル (AEC) に適応フィルターを適用する方法を示します。

著者: Scott C. Douglas

はじめに

音響エコー キャンセルは、音声の同時通信 (または全二重伝送) が必要な場合、音声テレビ会議において重要な役割を果たします。音響エコー キャンセルでは、測定されたマイク信号 d(n) には、次の2 つの信号が含まれます。近端音声信号 v(n) および遠端エコー音声信号 dhat(n)。この目的は、近端音声信号だけが伝送されるようにマイク信号から遠端エコー音声信号を除去することです。この例にはサウンド クリップがあるので、コンピューターのボリュームを調整しておくことをお勧めします。

室内インパルス応答

まず、ラウドスピーカーからマイクまでの信号パス (スピーカーホンが置かれている信号パス) の音響を記述します。長い有限インパルス応答フィルターを使用して、これらの特性を記述します。次のコマンドのシーケンスは、fs = 8000 Hz のシステム サンプルレートの場合に会議室で発生する可能性の少ないランダムなインパルス応答を生成します。

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])

近端音声信号

一般的に、テレビ会議システムのユーザーは、システムのマイクの近くに位置します。マイクでの男性の音声の例を次に示します。

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);

遠端音声信号

次に遠端音声信号のパスを記述します。スピーカーで拡声された男性の声は室内を反響し、システムのマイクで拾われます。近端音声なしでマイクで拾われた場合の音声を聞いてみましょう。

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);

周波数領域適応フィルター (FDAF)

この例で使用するアルゴリズムは、周波数領域適応フィルター (FDAF) です。このアルゴリズムは、識別するシステムのインパルス応答が長い場合に非常に便利です。FDAF は、高速のたたみ込み手法を使用して、出力信号およびフィルター更新を計算します。この計算は、MATLAB ですばやく実行されます。また、周波数ビン ステップ サイズの正規化を介して収束のパフォーマンスも向上します。次に、フィルターの初期パラメーターを設定して、誤差信号内の遠端音声がどのようにキャンセルされるかを見てみましょう。

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);

エコー リターン ロス拡張 (ERLE)

近端と遠端の両方の音声信号にアクセスできるので、エコー リターン ロス拡張 (ERLE) を計算できます。これは、エコーが減衰した量を dB 単位で示す滑らかな尺度です。プロットから、収束期間の最後に約 30 dB の ERLE が達成されたことがわかります。

Hd2 = dfilt.dffir(ones(1,1000));
setfilter(hFVT,Hd2);

erle = filter(Hd2,(e-v(1:length(e))).^2)./ ...
    (filter(Hd2,dhat(1:length(e)).^2));
erledB = -10*log10(erle);
plot(t,erledB);
axis([0 33.5 0 40]);
xlabel('Time [sec]');
ylabel('ERLE [dB]');
title('Echo Return Loss Enhancement');
set(gcf, 'Color', [1 1 1])

異なるステップ サイズ値の効果

高速な収束を得るために、大きなステップ サイズ値を使用してみます。しかし、ステップ サイズ値を大きくすると、近端の発話者が話している間に適応フィルターが "誤調整" されるという別の影響が生じます。以前よりも 60\% 大きいステップ サイズを選択した場合のサンプルを聴いてみましょう。

newmu = 0.04;
set(hFDAF,'StepSize',newmu);
[y,e2] = filter(hFDAF,x,d);
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,e(n),'r');
axis([0 33.5 -1 1]);
ylabel('Amplitude');
title('Output of Acoustic Echo Canceller, \mu = 0.025');
subplot(3,1,3);
plot(t,e2(n),'r');
axis([0 33.5 -1 1]);
xlabel('Time [sec]');
ylabel('Amplitude');
title('Output of Acoustic Echo Canceller, \mu = 0.04');
set(gcf, 'Color', [1 1 1])
p8 = audioplayer(e2/max(abs(e2)),fs);
playblocking(p8);

エコー リターン ロス拡張の比較

ステップ サイズが大きい場合、近端音声によって生じる誤調整が原因で ERLE のパフォーマンスは低下します。このパフォーマンスの問題に対処するために、音響エコー キャンセラーには、近端音声が検出されたときにステップ サイズ値を低くするスキームが含まれています。ERLE プロットが示すように、このような検出スキームがない場合、大きいステップ サイズが設定されたシステムのパフォーマンスは前者ほど向上しません。

close;
erle2 = filter(Hd2,(e2-v(1:length(e2))).^2)./...
    (filter(Hd2,dhat(1:length(e2)).^2));
erle2dB = -10*log10(erle2);
plot(t,[erledB erle2dB]);
axis([0 33.5 0 40]);
xlabel('Time [sec]');
ylabel('ERLE [dB]');
title('Echo Return Loss Enhancements');
legend('FDAF, \mu = 0.025','FDAF, \mu = 0.04');
set(gcf, 'Color', [1 1 1])

この情報は役に立ちましたか?