首頁 後端開發 C++ 透過將 matlab/octave 演算法移植到 C 來實現 AEC 的最佳解決方案

透過將 matlab/octave 演算法移植到 C 來實現 AEC 的最佳解決方案

Oct 17, 2024 pm 06:13 PM

完成!對自己有點印象。

我們的產品需要迴聲消除功能,確定了三種可能的技術方案,
1)利用MCU偵測audio out和audio in的音訊訊號,編寫演算法計算兩側聲音訊號的強度,根據audio out和audio in的強弱在兩個通道之間進行可選的切換,實現半雙工通話效果,但現在市面上都是全雙工通話效果,半雙工會讓產品競爭力降低

(2) 使用CPU廠商的迴聲消除演算法,實際測試經過各種可調參數的調優以及與廠商多次討論,迴聲消除效果不夠乾淨,與預期效果相去甚遠。供應商的回饋是改進外殼,使MIC與揚聲器盡可能隔離,但由於ID設計、音質和音量要求,沒有改變外殼的空間。

(3)從網路下載webrtc、speex等開源迴聲消除演算法,交叉編譯後移植到產品中。

4)從專門從事音訊演算法的公司購買演算法,但每個產品都需要額外的成本,這會大大降低產品的競爭力。

權衡之後,我決定深入研究使用開源演算法的解決方案;

所以,我從github、gitee等網站下載了一系列迴聲消除程式碼,都是C語言和matlab語言的。

以八度音程合成兩個聲音,產生一段包含近端麥克風捕捉語音和遠端參考語音的雙講場景。
然後運行線上下載的用於迴聲消除的程式碼,分析輸出音訊並選擇其中最有效的演算法。

從結果來看,webrtc音訊處理的AEC演算法不好,迴聲消除不乾淨,雙講場景有明顯的吞話現象。 webrtc音訊處理的AEC3演算法乾淨,但是對雙講另一端的聲音抑制非常大,聲音斷斷續續,不自然;

speex有輕微的迴聲,最好找一個matlab語言實現的aec演算法,迴聲消除得很乾淨,雙講只有輕微的吞字現象。

然後,我使用Visual Studio編譯偵錯WebRTC AudioProcessing AEC開源程式碼,參考Matlab上面的AEC演算法修改程式碼,使用線上偵錯設定斷點、單步運行等分析語句的值逐步變化,最後得到的資料與matlab語言的aec演算法的結果完全相同最終得到的數據與matlab的aec演算法的結果完全相同;

今天編譯到產品中,將MIC和SPEAKER增益調整到合理值,然後實際通話測試迴聲消除的效果,結果出奇的好。

這樣就有希望設計出一款能夠達到小目標之上銷售的產品。

Best solution to AEC by porting matlab/octave algorithm to C

Best solution to AEC by porting matlab/octave algorithm to C

Best solution to AEC by porting matlab/octave algorithm to C

以上是透過將 matlab/octave 演算法移植到 C 來實現 AEC 的最佳解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Stock Market GPT

Stock Market GPT

人工智慧支援投資研究,做出更明智的決策

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

如何編譯和運行C程序 如何編譯和運行C程序 Sep 16, 2025 am 05:29 AM

InstallaC compilerlikeg usingpackagemanagersordevelopmenttoolsdependingontheOS.2.WriteaC programandsaveitwitha.cppextension.3.Compiletheprogramusingg hello.cpp-ohellotogenerateanexecutable.4.Runtheexecutablewith./helloonLinux/macOSorhello.exeonWi

C自定義分配器示例 C自定義分配器示例 Sep 17, 2025 am 08:45 AM

自定義分配器可用於控制C 容器的內存分配行為,1.示例中的LoggingAllocator通過重載allocate、deallocate、construct和destroy方法實現內存操作日誌記錄;2.分配器需定義value_type和rebind模板,以滿足STL容器類型轉換需求;3.分配器構造與拷貝時觸發日誌輸出,便於追踪生命週期;4.實際應用包括內存池、共享內存、調試工具和嵌入式系統;5.C 17起construct和destroy可由std::allocator_traits默認處理

如何在C中執行系統命令 如何在C中執行系統命令 Sep 21, 2025 am 04:35 AM

使用std::system()函數可執行系統命令,需包含頭文件,傳入C風格字符串命令,如std::system("ls-l"),返回值為-1表示命令處理器不可用。

如何使用CMAKE建立C項目? 如何使用CMAKE建立C項目? Sep 18, 2025 am 01:04 AM

創建項目目錄結構,包含CMakeLists.txt、src/和include/;2.編寫CMakeLists.txt,指定CMake版本、項目名稱、C 標準並添加可執行文件;3.使用mkdirbuild進入目錄並運行cmake..和cmake--build.進行編譯;4.通過add_executable添加多個源文件,用target_include_directories包含頭文件路徑;5.使用find_package查找外部庫並用target_link_libraries鏈接;6.通過tar

如何在C中使用堆棧 如何在C中使用堆棧 Sep 21, 2025 am 05:16 AM

C 的stack是STL中的容器適配器,遵循後進先出原則,需包含頭文件;通過push添加元素,pop移除頂部元素,top訪問棧頂,操作前應檢查是否為空,常用於表達式求值、回溯等場景。

如何在現代C中使用汽車 如何在現代C中使用汽車 Sep 24, 2025 am 04:59 AM

Theautokeywordletsthecompilerdeducevariabletypesfrominitializers,reducingverbosityandimprovingmaintainability.Itsimplifiescodewithcomplextypeslikeiteratorsandlambdas,supportsreferencesandconstqualifierstoavoidunnecessarycopies,andadaptsautomaticallyw

如何在C中實現自定義迭代器 如何在C中實現自定義迭代器 Sep 20, 2025 am 01:13 AM

答案是定義包含必要類型別名和操作的類。首先設置value_type、reference、pointer、difference_type和iterator_category,然後實現解引用、遞增及比較操作,最後在容器中提供begin()和end()方法以返回迭代器實例,使其兼容STL算法和範圍for循環。

C抽像類示例 C抽像類示例 Sep 15, 2025 am 05:55 AM

抽像類是包含至少一個純虛函數的類,不能被實例化,必須作為基類被繼承,且派生類需實現其所有純虛函數,否則仍為抽像類。 1.純虛函數通過virtual返回類型函數名()=0;聲明,用於定義接口規範;2.抽像類常用於統一接口設計,如area()、draw()等,實現多態調用;3.必須為抽像類提供虛析構函數(如virtual~Shape()=default;),確保通過基類指針正確釋放派生類對象;4.派生類繼承後需重寫純虛函數,如Rectangle和Circle分別實現area()計算各自面積;5.可通過

See all articles