matlab/octave アルゴリズムを C に移植することによる AEC への最適なソリューション
完了!自分自身に少し感動しました。
当社の製品にはエコーキャンセル機能が必要であり、考えられる技術的解決策が 3 つ特定されました。
1) MCU を使用してオーディオ信号のオーディオ出力とオーディオ入力を検出し、オプションの 2 つのチャネル切り替えの間のオーディオ出力とオーディオ入力の強度に応じて、サウンド信号の両側の強度を計算するアルゴリズムを作成します。半二重通話効果ですが、現在市場には全二重通話効果があり、半二重では製品の競争力が低下します
(2) CPU ベンダーのエコー キャンセル アルゴリズムを使用します。実際のテストのエコー除去は、すべての調整可能なパラメーターの調整とベンダーとの多くのラウンド ディスカッションによって十分にきれいではなく、期待される効果とは程遠いものです。ベンダーからのフィードバックは、マイクをスピーカーから可能な限り隔離するためにハウジングを改善することですが、ID 設計、音質、音量の要件によりハウジングを変更する余地はありません。
(3) webrtc や speex などのオープンソースのエコーキャンセルアルゴリズムをインターネットからダウンロードし、クロスコンパイル後に製品に移植します。
4) オーディオ アルゴリズムを専門とする会社からアルゴリズムを購入しますが、製品ごとに追加コストが必要となり、製品の競争力が大幅に低下します。
選択肢を比較検討した結果、オープンソース アルゴリズムを使用するソリューションについて徹底的に調査することにしました。
そこで、github、gitee、その他のサイトから C と matlab の両方で一連のエコー キャンセル コードをダウンロードしました。
2 つの音声をオクターブで合成し、近端のマイク キャプチャ音声と遠端の基準音声を含むダブルトーク シーンのセクションを生成します。
次に、オンラインでダウンロードしたエコーキャンセル用のコードを実行し、出力音声を分析して、その中から最適に機能するアルゴリズムを選択します。
結果から、webrtc オーディオ処理の AEC アルゴリズムは良好ではなく、エコー キャンセルはきれいではなく、ダブルトーク シーンでは明らかな言葉の飲み込みがあります。 webrtc オーディオ処理の AEC3 アルゴリズムはクリーンですが、ダブルトークの相手の音を非常に抑制し、音が断続的で不自然です。
Speex にはわずかなエコーがあります。AEC アルゴリズムの Matlab 言語実装を見つけるのが最善です。エコー除去は非常にきれいです。二重スピーキングはわずかな言葉の飲み込み現象のみです。
次に、Visual Studio を使用して webrtc audioprocessing aec のオープン ソース コードをコンパイルおよびデバッグします。上記の matlab の aec アルゴリズムを参照してコードを変更し、オンライン デバッグを使用してブレークポイントを設定し、シングル ステップの実行やその他の分析を行います。ステートメントごとに値が変更され、最終的に取得されるデータと matlab 言語の aec アルゴリズムの結果は同一です。 取得される最終データは、matlab の aec アルゴリズムの結果とまったく同じです。
今日、製品にコンパイルし、マイクとスピーカーのゲインを適切な値に調整し、実際に呼び出してエコー キャンセルの効果をテストしました。結果は驚くほど良好です。
これにより、小さな目標を上回る売上を達成できる製品を設計することが期待されます。
以上がmatlab/octave アルゴリズムを C に移植することによる AEC への最適なソリューションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Stock Market GPT
AIを活用した投資調査により賢明な意思決定を実現

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

installac compilerlikegを使用して、packagemanagordedordementtoolsdependingontheos.2.writeac andsaveitwitha.cppextension.3.compiletheprogramusingg hello.cpp-ohellotogenerateanexecutable.4.runtheexecutable

std :: system()関数を使用してシステムコマンドを実行します。システムコマンドは、ヘッダーファイルを含めてstd :: system( "ls-l")などのcスタイルの文字列コマンドに渡す必要があり、リターン値は-1です。つまり、コマンドプロセッサは使用できません。

カスタムアロケーターを使用して、Cコンテナのメモリ割り当て挙動を制御できます。 1.例のログインガロカーターは、オーバーロードをオーバーロードすることにより、メモリ操作を実装します。 2。アロケーターは、STLコンテナタイプの変換要件を満たすために、value_typeを定義し、テンプレートを再構築する必要があります。 3.アロケーターは、建設とコピー中にログ出力をトリガーします。これは、ライフサイクルの追跡に便利です。 4.実際のアプリケーションには、メモリプール、共有メモリ、デバッグツール、組み込みシステムが含まれます。 5。c 17以来、コンストラクトと破壊はdefaultでstd :: allocator_traitsによって処理できます

Cのスタックは、STLのコンテナアダプターです。バックインファーストアウトの原則に従い、ヘッダーファイルを含める必要があります。プッシュで要素を追加し、ポップが上部要素を削除し、上部がスタックの上部にアクセスします。操作の前に、それが空であるかどうかを確認します。これは、表現評価やバックトラッキングなどのシナリオでよく使用されます。

答えは、必要なタイプのエイリアスと操作を含むクラスを定義することです。まず、value_type、参照、ポインター、Difference_Type、およびIterator_categoryを設定し、その後、控除、増分、および比較操作を実装します。最後に、容器内のbegin()およびend()メソッドをiteratorインスタンスを返すように提供し、stlアルゴリズムとループの範囲と互換性があります。

抽象クラスは、少なくとも1つの純粋な仮想関数を含むクラスです。インスタンス化することはできず、基本クラスとして継承する必要があります。派生クラスは、そのすべての純粋な仮想関数を実装する必要があります。そうしないと、抽象クラスになります。 1。純粋な仮想関数は、仮想リターンタイプfunction name()= 0によって宣言されます。インターフェイス仕様を定義するには。 2。抽象クラスは、領域()、draw()などの統一されたインターフェイス設計によく使用され、多型呼び出しを実装します。 3。抽象クラス(仮想〜shape()= default;などなど、派生クラスオブジェクトが基本クラスのポインターを通じて正しくリリースされるようにするために、仮想デストラクタを提供する必要があります。 4。導出されたクラスが継承した後、それぞれの領域を計算するために領域()を実装する長方形や円などの純粋な仮想関数を書き直す必要があります。 5。

theautokeywordletsthecompilredededucevariabletypesfrominitializers、還元versを抑制し、誘惑性を促進します

cmakelists.txt、src/を含むプロジェクトディレクトリ構造を作成します。 2。CMAKELISTS.TXTを書き込み、CMAKEバージョン、プロジェクト名、C標準を指定し、実行可能ファイルを追加します。 3. mkdirbuildを使用してディレクトリを入力し、cmake ..およびcmake - buildを実行します。編集用; 4. add_executableを介して複数のソースファイルを追加し、ターゲット_include_directoriesを使用してヘッダーファイルパスを含めます。 5。Find_Packageを使用して外部ライブラリを見つけ、ターゲット_link_librariesにリンクします。 6。
