一種簡單高效的音頻降噪算法示例(附完整C代碼)


近期比較忙,

抽空出來5.1開源獻禮.

但凡學習音頻降噪算法的朋友,肯定看過一個算法.

<<語音增強-理論與實踐>> 中提及到基於對數的最小均方誤差的降噪算法,也就是LogMMSE.

資料見:

<<Speech enhancement using a minimum  mean-square error log-spectral amplitude estimator.>> 

-----Ephraim, Y. and Malah, D. (1985)

之前也是花了不少時間去查閱降噪相關的思路,

但是最終發現前人的思路,有很多局限性或者說弊端.

一般都是提出一種數學先驗的假設,換句話說,在paper里講點故事.

然后最終,故事的結局都是it works.

但實際應用卻差強人意.

 

 而一般的圖像降噪流程,見圖:

也就是,一個降噪算法的基本組成部分有:

1.噪聲提取(用於提取噪聲)

2.靜音檢測(一般檢測是否為人聲,減少誤判)

3.數學先驗假設(用於降噪)

 

當然最小均方誤差的降噪思路,用在圖像上一樣適用.

 

但是,大多數音頻降噪算法僅僅適配某種特殊情況(特例).

工程化應用時,會發現,

一個坑接着一個坑,

然后不得不妥協.勉強能用就行,

要求太高不現實.

 

而當年看了logMMSE的思路之后,就很清楚地明白,

這思路是可行的,但是特別雞肋.

 

話說如此,但是對作為學習信號處理,音頻降噪來說,

這個是一個特別好的入門示例算法.

至少經過實踐之后,你心中能有了個大概的印象.

音頻降噪是一個什么樣的工作,會碰到什么樣的難點.

 

 logmmse的各種實現,在github搜索一下,都能找得到.

這里,並不打算解析logmmse的算法細節.

 

只是分享一段非常簡單有效的類似logmmse算法的c語言實現.

說是類似,不如說,

思路來自logmmse,只是更加的簡潔明了.(自我以為)

自己動手,豐衣足食.

稍微改進一下,可以進一步適配各種環境和情況,

當然也不是那么容易,

例如:

+vad.

+延時記憶機制諸如此類

 

代碼基於本人最近開源的基於傅里葉變換的重采樣算法.

https://github.com/cpuimage/FFTResampler

題外話:

在之前為了找各種重采樣算法,費心死了.

所以,寫一個通用簡潔的重采樣算法是我的一個待辦事項.

重采樣算法算是暫時結束了.

https://github.com/cpuimage/resampler

https://github.com/cpuimage/FFTResampler

這兩個平時應該是夠用了,

下一步要繼續做的話,

可能就是音頻超分辨率算法了.

 

除了懶,沒別的,能復用就復用了.

回到主題上,這個簡易的算法用來去除平穩噪聲或底噪,是非常合適的,

當然當前開源實現的算法,是非實時的,

當然稍微改進下可以應用在實時的環境.

 

值5.1放假之際,開源出來,給大家參考學習.

權當拋磚引玉,一起玩耍.

 

項目地址:

https://github.com/cpuimage/SimpleAudioDenoise


若有其他相關問題或者需求也可以郵件聯系俺探討。

當然一些基礎性的問題,一概忽略.

有時間給我寫郵件,不如多看點資料書籍.

 

郵箱地址是: 
gaozhihan@vip.qq.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM