ドキュメンテーション

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

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

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

著者: Scott C. Douglas

はじめに

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

室内インパルス応答

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

fs = 16000;
M = fs/2 + 1;
FrameSize = 8192;

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

Hd1 = dsp.IIRFilter('Numerator', [zeros(1,6) B], 'Denominator', A);
hFVT = fvtool(Hd1);  % Analyze the filter
hFVT.Color = [1 1 1];

H = step(Hd1, ...
         (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');
fig = gcf;
fig.Color = [1 1 1];

Hd2 = dsp.FIRFilter('Numerator', H');

近端音声信号

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

load nearspeech
waudiod = warning('off','dsp:system:toAudioDeviceDroppedSamples');

hsr1  = dsp.SignalSource('Signal', v, 'SamplesPerFrame', FrameSize);
Hap   = dsp.AudioPlayer('SampleRate', fs);
Hts1  = dsp.TimeScope('SampleRate', fs, ...
                      'TimeSpan', 35, ...
                      'YLimits', [-1.5 1.5], ...
                      'BufferLength', length(v), ...
                      'Title', 'Near-End Speech Signal', ...
                      'ShowGrid', true);

% Streaming loop
while(~isDone(hsr1))
    % Extract the speech samples from the input signal
    ne_speech = step(hsr1);
    % Send the speech samples to the output audio device
    step(Hap, ne_speech);
    % Plot the signal
    step(Hts1, ne_speech);
end

遠端音声信号

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

load farspeech

hsr2  = dsp.SignalSource('Signal', x, 'SamplesPerFrame', FrameSize);
hlog2 = dsp.SignalSink;
Hts2  = dsp.TimeScope('SampleRate', fs, ...
                      'TimeSpan', 35, ...
                      'YLimits', [-0.5 0.5], ...
                      'BufferLength', length(x), ...
                      'Title', 'Far-End Speech Signal', ...
                      'ShowGrid', true);

% Streaming loop
while(~isDone(hsr2))
    % Extract the speech samples from the input signal
    fe_speech = step(hsr2);
    % Add the room effect to the far-end speech signal
    dhat = step(Hd2, fe_speech);
    % Send the speech samples to the output audio device
    step(Hap, dhat);
    % Plot the signal
    step(Hts2, fe_speech);
    % Log the signal for further processing
    step(hlog2, dhat);
end

マイク信号

マイクの信号には、近端音声だけでなく、室内をエコーした遠端音声の両方が含まれています。音響エコー キャンセラーの目的は、近端音声だけが遠端のリスナーに伝送されるように遠端音声をキャンセル アウトすることです。

reset(hsr1);
hsr3  = dsp.SignalSource('Signal', hlog2.Buffer, ...
                         'SamplesPerFrame', FrameSize);
hlog3 = dsp.SignalSink;
Hts3  = dsp.TimeScope('SampleRate', fs,...
                      'TimeSpan', 35,...
                      'YLimits', [-1 1],...
                      'BufferLength', length(x),...
                      'Title', 'Microphone Signal',...
                      'ShowGrid', true);

% Streaming loop
while(~isDone(hsr3))
    % Microphone signal = echoed far-end + near-end
    d = step(hsr3) + step(hsr1) + 0.001*randn(8192,1);
    % Send the speech samples to the output audio device
    step(Hap, d);
    % Plot the signal
    step(Hts3, d);
    % Log the signal
    step(hlog3, d);
end

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

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

mu = 0.025;
del = 0.01;
lam = 0.98;

% Construct the Frequency-Domain Adaptive Filter
Hfdaf = dsp.FrequencyDomainAdaptiveFilter('Length', 2048, ...
                                          'StepSize', mu, ...
                                          'InitialPower', del, ...
                                          'AveragingFactor', lam, ...
                                          'Method','Unconstrained FDAF');

Hts4 = dsp.TimeScope(4, fs, ...
              'LayoutDimensions', [4,1], ...
              'TimeSpan', 35, ...
              'BufferLength', length(x));

Hts4.ActiveDisplay = 1;
Hts4.ShowGrid = true;
Hts4.YLimits = [-1.5 1.5];
Hts4.Title = 'Near-End Speech Signal';

Hts4.ActiveDisplay = 2;
Hts4.ShowGrid = true;
Hts4.YLimits = [-1.5 1.5];
Hts4.Title = 'Microphone Signal';

Hts4.ActiveDisplay = 3;
Hts4.ShowGrid = true;
Hts4.YLimits = [-1.5 1.5];
Hts4.Title = 'Output of Acoustic Echo Canceller mu=0.025';

Hts4.ActiveDisplay = 4;
Hts4.ShowGrid = true;
Hts4.YLimits = [0 50];
Hts4.YLabel = 'ERLE [dB]';
Hts4.Title = 'Echo Return Loss Enhancement mu=0.025';

hsr4 = dsp.SignalSource('Signal', hlog3.Buffer, ...
                        'SamplesPerFrame', FrameSize);
% Near-end speech signal
release(hsr1);
hsr1.SamplesPerFrame = FrameSize;

% Far-end speech signal
release(hsr2);
hsr2.SamplesPerFrame = FrameSize;

% Far-end speech signal echoed by the room
release(hsr3);
hsr3.SamplesPerFrame = FrameSize;

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

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

Hd3 = dsp.FIRFilter('Numerator', ones(1,1024));
Hd4 = clone(Hd3);
setfilter(hFVT,Hd3);

% Streaming loop with mu = 0.025
while(~isDone(hsr1))

    vsr = step(hsr1);
    xsr = step(hsr2);
    dhatsr = step(hsr3);
    dsr = step(hsr4);
    % Apply FDAF
    [y,e] = step(Hfdaf, xsr, dsr);
    % Send the speech samples to the output audio device
    step(Hap, e);
    % Compute ERLE
    erle = step(Hd3,(e-vsr).^2)./(step(Hd4, dhatsr.^2));
    erledB = -10*log10(erle);
    % Plot near-end, far-end, microphone, AEC output and ERLE
    step(Hts4, vsr, dsr, e, erledB);
end

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

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

newmu = 0.04;

% Change the step size value in FDAF
reset(Hfdaf);
Hfdaf.StepSize = newmu;

Hts4b = clone(Hts4);
Hts4b.ActiveDisplay = 3;
Hts4b.Title = 'Output of Acoustic Echo Canceller mu=0.04';
Hts4b.ActiveDisplay = 4;
Hts4b.Title = 'Echo Return Loss Enhancement mu=0.04';

reset(hsr1);
reset(hsr2);
reset(hsr3);
reset(hsr4);
reset(Hd3);
reset(Hd4);

% Streaming loop with newmu = 0.04
while(~isDone(hsr1))

    vsr = step(hsr1);
    xsr = step(hsr2);
    dhatsr = step(hsr3);
    dsr = step(hsr4);
    % Apply FDAF
    [y,e] = step(Hfdaf, xsr, dsr);
    % Send the speech samples to the output audio device
    step(Hap, e);
    % Compute ERLE
    erle = step(Hd3,(e-vsr).^2)./(step(Hd4, dhatsr.^2));
    erledB = -10*log10(erle);
    % Plot near-end, far-end, microphone, AEC output and ERLE
    step(Hts4b, vsr, dsr, e, erledB);
end

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

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

warning(waudiod);
この情報は役に立ちましたか?