1. 程式人生 > >音訊噪聲抑制(1):經典濾波器篇

音訊噪聲抑制(1):經典濾波器篇

好久沒有寫音訊訊號處理的文章了……

因為我從零開始學C++去了……

前面有一些文章簡要介紹了IIR和FIR濾波器的設計方法。

Review:IIR

Review:FIR

濾波器是一種工具,可以完成許多事情。

用濾波器去除噪聲,是很常見的。

用經典濾波器抑制噪聲,非常簡單。如果噪聲的功率譜PSD和有用訊號功率譜PSD沒有重疊的話,那可以實現非常好的效果。

但是,如果有重疊,去噪的效果就不是特別理想了。因為在復指數訊號空間裡面,沒辦法把有用訊號和噪聲訊號分離啊。

當然,如果先知道噪聲本身的性質,是可以幫助我們實現噪聲抑制的。

如果,噪聲是覆蓋整個頻率範圍的白噪聲,那去除噪聲的步驟大致如下。

1. 需要了解有用訊號大致是分佈在 多少 Hz  到 多少 Hz之間。

2. 設計濾波器,指標就選儘可能多得抑制帶外噪聲的那些指標。

3. 讓訊號通過濾波器,實現噪聲抑制。

如果,噪聲是某個特定頻率的噪聲,比如 50Hz 的工頻訊號(50Hz交流電),

就需要設計一個陷波器。



雖然看起來,用陷波器去掉50 Hz的工頻訊號效果比較好,但是!但是!但是!

實際上,交流電不一定是剛好50 Hz的嘛,可能是51,52,甚至53,……

所以,實際上,還應該結合一些別的手段,去追蹤一下工頻訊號的頻率。

另外,由於有非線性效應,所以,不一定只有基波,還有可能有二次諧波,三次諧波,……

為什麼會這樣?微積分裡面Taylor級數嘛…。我想,進一步的原理在“電路原理”、“類比電子技術基礎”等課程裡都講過。

引用某位老師的話:“哎,跟一群數學不好的、靠經驗搞工程的人交流起來,真的是費勁!”

我很欣賞這句話。儘管很多人覺得這句話說得有點驕傲了。但是別人有水平,有水平的人不驕傲,難道還要一群渣渣去驕傲?

需要注意的是:

1. 在matlab裡,如果設計IIR濾波器去抑制噪聲,用filter函式就好。函式的輸出訊號y和輸入訊號x的長度是一樣的。y就是去除噪聲後的訊號。

2. 在matlab裡,如果設計FIR濾波器去抑制噪聲,一般是得到一個單位脈衝響應h,於是用 y = conv(h,x) 就好。但是y的長度和x的長度不一致。這是由卷積的性質決定的。

L = M + N - 1。因為是FIR,所以y基本上就是x的時延,所以把y從 n0 時刻開始,往後走(x長度-1)個點,就是消除噪聲後的訊號。至於n0等於多少,這個去算一下就好了。

大概是 (N-1) / 2 個時刻吧。這個自己動筆算一下,算一下。 當然,N取奇數還是偶數,要看實際的需求。有些濾波器的長度N是不能滿足某種特定的功能的。比如 z = 1的地方有零點(相當於 H(exp(j0)) = 0),是不能作為低通濾波器的。