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

近期比較忙,git

抽空出來5.1開源獻禮.github

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

<<語音加強-理論與實踐>> 中說起到基於對數的最小均方偏差的降噪算法,也就是LogMMSE.學習

資料見:ui

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

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

以前也是花了很多時間去查閱降噪相關的思路,get

可是最終發現前人的思路,有不少侷限性或者說弊端.數學

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

而後最終,故事的結局都是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

相關文章
相關標籤/搜索