オーディオシステムからエコーを識別して除去するには、どのような方法を使用できますか?


14

バックグラウンド

電話の種類の設定で使用する単一の小さなマイクとスピーカーを持つシステムを設計しています。最も簡単な例は、コンピューターのスピーカーとデスクトップマイクを使用しているSkypeの会話です。

スピーカーからの音声がマイクに拾われて元の人に返送されるのが心配です。VoIP会話の初期の頃は、これが常に発生するのを聞いていましたが、それ以上聞こえることはほとんどありませんでした。

私の想定では、グループはエコーをキャンセルする方法を考え出していますが、どのようにそれを行うのでしょうか?

アプローチ

私が最初に考えたのは、マイク信号からスピーカーに送信される信号を単純に差し引くことでした。ただし、この方法では遅延に注意する必要があります。何らかの事前キャリブレーションなしで遅延が何であるかを判断する方法がわかりませんが、これは避けたいと思います。また、信号を減算する前に信号をどれだけスケーリングするかという問題もあります。

次に、マイク信号がエコーである可能性を判断し、実際の遅延を判断できるようにするために、スピーカー信号とマイク信号の間で何らかの相関を行うことを考えました。この方法は、記録された信号で遊んでいたときは問題なく動作しましたが、リアルタイムシステムで役立つ相関を計算する際の遅延は非常に長いと思われました。また、スピーカーの音量を調整できるため、実際に何かが相関しているかどうかを判断することが困難でした。

私の次の考えは、インターネット上でこれまでに成功した人がいるに違いないと思いますが、素晴らしい例は見つかりませんでした。そこで、この種の問題を解決するために使用できる方法を確認するためにここに来ました。


1
アコースティックエコーキャンセレーションは、このテーマに関する多くの書籍と数十年に及ぶ研究論文が収められた大きな主題分野です。このトピックに関するSO Q&Aが1つあります:stackoverflow.com/questions/3403152/acoustic-echo-cancellation-in-java
hotpaw2

1
@ hotpaw2 Javaリンクでのアコースティックエコーキャンセルがクリック可能でなかった理由がわかりません。
マークブース

私に提案してください、私はスピーチに存在するエコー、講堂の単一のマイクへの入力をキャンセルしようとしています。あなたが適応フィルタについて言及したように、私はそれを試しています、それはあなたが遠端話として参照信号を与えているからです。しかし、ここには基準信号がありません。私の信号は、マイクへのスピーカー信号で、たとえば500msを受信して​​いる元の信号のエコーです。

回答:


15

あなたは正しいです。エコーキャンセレーションには多くの方法がありますが、どれもまったく簡単なものではありません。最も一般的で一般的な方法は、適応フィルターによるエコーキャンセレーションです。ある文では、適応フィルターの役割は、入力からの情報量を最小限に抑えることで、再生する信号を変更することです。

適応フィルター

適応(デジタル)フィルターは、係数を変更し、最終的に最適な構成に収束するフィルターです。この適応のメカニズムは、フィルターの出力を望ましい出力と比較することで機能します。以下は、一般的な適応フィルターの図です。

ここに画像の説明を入力してください

図からわかるように、信号はによってフィルター処理(畳み込み)され、出力信号ます。次に、目的の信号からを減算して、エラー信号を生成します。は係数のベクトルであり、数値ではないことに注意してください(したがって記述しません)。反復ごと(サンプルごと)に変化するため、これらの係数の現在のコレクションにを添え字付けします。を取得したら、それを使用してを更新しますWのn D [ N ] 、D [ N ] 、D [ N ] 、E [ N ] W N W [ N ] N E [ N ] W N wの n個のD [ N ] 、D [ n ]バツ[n]wnd^[n]d^[n]d[n]e[n]wnw[n]ne[n]wn選択した更新アルゴリズムによって(詳細は後ほど)。入力と出力が時間とともに変化しない線形関係を満たし、適切に設計された更新アルゴリズムが与えられると、は最終的に最適なフィルターに収束し、はに密接に従います。。wnd^[n]d[n]

エコー・キャンセリング

エコーキャンセルの問題は、入力と出力の関係を満たす最適なフィルターを見つけることにより、入力が与えられた場合に既知の理想的な出力を生成しようとする適応フィルターの問題として表すことができます。特に、ヘッドセットをつかんで「こんにちは」と言うと、ネットワークの反対側で受信され、部屋の音響応答によって変更され(大音量で再生されている場合)、ネットワークにフィードバックされて戻りますエコーとしてあなたに。ただし、システムは最初の「hello」の音を認識し、残響と遅延の「hello」の音を認識しているため、適応フィルタを使用してその部屋の応答を推測できます。次に、その推定値を使用できます。すべての着信信号をそのインパルス応答で畳み込み(これによりエコー信号の推定値が得られます)、呼び出した人のマイクに入るものから減算します。次の図は、適応エコーキャンセラを示しています。

ここに画像の説明を入力してください

d [ n ]バツ[n]d[n]wnバツ[n]y[n]d[n]e[n]=d[n]y[n]回線の反対側で誰も話していないので、最終的にはゼロになります。これは、通常、ヘッドセットを取り上げて「こんにちは」と言った場合です。これは常に当てはまるわけではなく、理想的でないケースの考慮事項については後で説明します。

wn

バツn=バツ[n]バツ[n1]バツ[nN+1]T

Nwnバツ

wn=w[0]w[1]バツ[N1]T

y[n]=バツn=wn

y[n]=バツnTwn=バツnwn

w

wn+1=wn+μバツne[n]バツnTバツn=wn+μバツnバツnTwnd[n]バツnTバツn

μ0μ2

実際のアプリケーションと課題

エコーキャンセルのこの方法では、いくつかのことが困難になる場合があります。まず、前述のように、相手があなたの「こんにちは」信号を受信して​​いる間、沈黙しているとは限りません。入力信号とエコーが存在するため、回線の反対側にかなりの量の入力が存在する場合でも、インパルス応答を推定することが有用な場合があることを示すことができます(ただし、この応答の範囲外です)。統計的に独立していると想定される; したがって、エラーを最小限に抑えることは依然として有効な手順です。一般に、エコー推定のための適切な時間間隔を検出するには、より洗練されたシステムが必要です。

一方、受信信号がほぼ無音(実際にはノイズ)であるときにエコーを推定しようとするとどうなるかを考えてください。意味のある入力信号がない場合、適応アルゴリズムは発散し、意味のない結果の生成をすぐに開始し、最終的にランダムエコーパターンに達します。これは、音声検出も考慮する必要があることを意味します。最近のエコーキャンセラは、下図のように見えますが、上記の説明はその要点です。

ここに画像の説明を入力してください

アダプティブフィルターとエコーキャンセレーションの両方に関する文献が豊富にあり、利用できるオープンソースライブラリもあります。


2
「適応フィルターの役割は信号にあります」誤って一言。
エンドリス14年

@endolithありがとう。私はそれを修正する良い方法を考えることができなかったので、alterを使用しました。もっと面白いもので編集してください。=)
フォノン14年

3

何らかの事前キャリブレーションなしで遅延が何であるかを判断する方法がわかりません

Shazamで使用されいるような音響指紋アルゴリズムを変更することから始めます。

要件は多くの点でShazamの要件に似ています(機能は電話用に設計された圧縮アルゴリズムに耐える必要があり、低品質のマイクも通過する必要があります)。周波数分解能を犠牲にして時間分解能を上げることができます。

また、信号を減算する前に信号をどれだけスケーリングするかという問題もあります。

均一なスケーリングは、ほぼ確実に十分に正確ではありません。FIRフィルターで周波数応答を近似し、(遅延した)マイク信号を逆フィルターに通してから、受信信号から減算するようなことをする必要があります。


Shazamフィンガープリントでは、正確な遅延近似を生成できません。オーディオサンプルを比較するために多くの複雑な特徴抽出プロセスを使用しますが、そのすべてが時間ベースではありません。
フォノン

@ Phonon、Shazamは現在、追加のアルゴリズムを使用している可能性がありますが、リンクされた論文のアルゴリズムは時間ベースであり、遅延の適切な推定値を提供します。
finnw

送信されたスペクトログラムと受信されたスペクトログラムの相互相関のようなものが遅延を教えてくれるかもしれません。フィルタリングとノイズの追加の影響に耐える必要があります
Endolith 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.