【建議收藏】用MATLAB自動生成濾波器的傻瓜方法

本文介紹MATLAB中濾波器的定義和設(shè)置,以及各個參數(shù)的含義。
一、讀取信號
>> [y,Fs] =?audioread(filename)
y是信號,F(xiàn)s是采樣率,filename是音頻文件路徑。
二、傅里葉變換
>> Fs = 1000; ? ? ? ? ? ?%采樣率? ? ? ? ? ? ?
>> T = 1/Fs; ? ? ? ? ? ? %采樣周期?? ??
>> L = 1500; ? ? ? ? ? ? %信號長度
>> t = (0:L-1)*T; ? ? ? ?%時間向量
%構(gòu)造一個信號,其中包含振幅為 0.7 的 50 Hz 正弦信號和振幅為?1 的 120 Hz 正弦信號。
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
%傅里葉變換
>> Y = fft(S);?
>> P2 = abs(Y/L);?
>> P1 = P2(1:L/2+1);?
>> P1(2:end-1) = 2*P1(2:end-1);?
>> plot(f,P1)?
>> title('Single-Sided Amplitude Spectrum of S(t)')?
>> xlabel('f (Hz)') ylabel('|P1(f)|')

見說明文檔:
三、自相關(guān)
互相關(guān)用于拾取相似信號。
>> r = xcorr(signal1,signal2);
>> plot(r);
四、濾波器
簡單來說濾波器就是濾掉特定頻率范圍的信號,例如對于一首歌,我們可以濾掉人聲的頻率范圍,以得到純音樂。
濾波器:
我們可以使用MATLAB的濾波器設(shè)計(jì)器,在命令行中輸入
>> designfilt
然后就會彈出濾波器類型:
低通(Lowpass),高通(Highpass),帶通(Bandpass),帶阻(Bandstop)等等。其中FIR和IIR分別是有限/無限(Finite,Infinite)脈沖響應(yīng)的意思。

我們選用常用的低通濾波器,也就是只允許某個????頻率以下的成分通過。點(diǎn)擊確認(rèn)彈出界面:

注意到有一些參數(shù)

1.Frequency Units:頻率單位。這里建議選擇具體的頻率,即Hz
2.Input sample rate:輸入的信號采樣率,也就是一秒鐘采樣多少個點(diǎn)。采樣率越高信號質(zhì)量越好。
3.Passband frequency和Stopband frequency:有人問,低通濾波不就一個低通上限嗎,為什么是兩個參數(shù)。這是因?yàn)槟隳X子里的這種只有一個低通上限的濾波器是理想矩形濾波器,即低于上限頻率的全通過,高于上限頻率的全不通過;

而實(shí)際上,上面的濾波器是做不出來的。上限頻率是一個范圍,是逐漸衰減的。因此你要選擇從多大的頻率衰減,到多大的頻率衰減到0.如下圖所示:

一般來說,你要確保截止頻率以上的頻率成分全都不能通過,因此你就要設(shè)置Stop Frequency為截止頻率。而Pass frequency設(shè)多少,取決于你自己的需求:設(shè)置得越陡峭,對截止頻率以下的成分的影響越小,則濾波效果越好,而濾波器的階數(shù)也越高,則計(jì)算時間也越長;反之,設(shè)置得越平緩,則對截止頻率附近的信號影響越大。
下面是振幅參數(shù):

Passband ripple和Stopband attenuation就是下面的意思:說白了就是描述你截止頻率附近的起伏大小,也就是對截止頻率附近信號成分的畸變作用的大小。

最后是選擇算法

請注意,如果你看不懂下面的內(nèi)容,你根本無需在意選擇哪種算法:
Kaiser window就是用Kaiser窗函數(shù)來濾波,它使得信號主瓣和旁瓣的能量比最大,也就是說,抑制旁瓣能量。


而equiripple,顧名思義,就是讓ripple等大小波動,這是為了抑制截止頻率附近的信號畸變。

設(shè)置完成!點(diǎn)擊OK后matlab會自動計(jì)算符合條件的濾波器,請耐心等待。

計(jì)算完成后會把設(shè)計(jì)好的濾波器輸出在命令行中:

生成的第一行就是我們要的濾波器代碼
>> designfilt('lowpassfir', 'PassbandFrequency', 10, 'StopbandFrequency', 12, 'PassbandRipple', 1, 'StopbandAttenuation', 60, 'SampleRate', 1000);
然后怎么用呢?
1.首先令myfilt=前面一串,定義了名字為"myfilt"的濾波器
>>? myfilt=designfilt('lowpassfir', 'PassbandFrequency', 10, 'StopbandFrequency', 12, 'PassbandRipple', 1, 'StopbandAttenuation', 60, 'SampleRate', 1000);
注意到參數(shù)實(shí)際上是可以直接在這里改的。
2.查看濾波器,以檢查是否滿足你的需求
>>?fvtool(myfilt);

3.進(jìn)行零相移濾波
>> signal_filt=filtfilt(myfilt,signal);
注意你信號的采樣率要和你之前設(shè)計(jì)的濾波器的采樣率一樣。
什么叫零相移濾波呢,就是說濾波以后信號不因?yàn)V波器的影響發(fā)生相移。MATLAB的實(shí)現(xiàn)方法就是濾波兩次,使得相移相抵消。
貼一段MATLAB官方教程演示這個問題:
>> wform = ecg(500);?
>> plot(wform);
>> axis([0 500 -1.25 1.25]);
>> text(155,-0.4,'Q');
>> text(180,1.1,'R');
>> text(205,-1,'S')
生成模擬信號:

>> rng default
>> x = wform' + 0.25*randn(500,1);?
>> d = designfilt('lowpassfir', ... ? ?'PassbandFrequency',0.15,'StopbandFrequency',0.2, ... ? ?'PassbandRipple',1,'StopbandAttenuation',60, ... ? ?'DesignMethod','equiripple');
>> y = filtfilt(d,x);?
>> y1 = filter(d,x);?
>> subplot(2,1,1)?
>> plot([y y1])
>> title('Filtered Waveforms')
>> legend('Zero-phase Filtering','Conventional Filtering')?
>> subplot(2,1,2)
>> plot(wform)
>> title('Original Waveform')
零相移濾波器和非零相移濾波器的濾波結(jié)果與原始信號對比,結(jié)果顯示非零相移濾波器導(dǎo)致信號峰值位置發(fā)生移動,也就是所謂“相移”。

至于高通濾波、帶通濾波,和低通濾波的定義大同小異,都是要設(shè)置開始衰減的頻率,和結(jié)束衰減的頻率。