编写自有函数,利用窗函数的方法来构建低通FIR滤波器
其要求如上图,函数形式为第一段"The syntax is:xxxxxxxxxxxx"。
传入的参数有1.通带截止频率f_pass 2.阻带截止频率f_stop 3.采样频率fs 4.阻带衰减A_stop
思路:将传入的模拟频率转为数字频率,然后通过阻带截止频率和通带截止频率计算过渡带宽,根据传入参数A_stop进行窗函数的选择,确定好利用哪个窗函数后根据图标公式计算滤波器阶数,利用b=fir1(N,Wn,window)函数通过不同的窗函数来计算出b。最后利用freqz函数可计算出滤波器的频响特性。自定义滤波器参数:采样频率100Hz、通带截止频率3Hz、阻带截止频率5Hz、衰减分七种情况。核心代码如下(省略了画图部分)
function b = firwindow(f_pass,f_stop,fs,A_stop)%f_pass通带边缘 f_stop阻带边缘 fs抽样频率 A_stop衰减度
Wp = f_pass*2*pi/fs;
Ws = f_stop*2*pi/fs;
TW = f_stop - f_pass;
deltaw = Ws-Wp;
if(A_stop<= 21) %选择矩形窗
N = ceil(1.8*pi/ deltaw) + 1; % 按矩形窗计算所需的滤波器阶数N0
window = (boxcar(N+1))'; % 矩形窗计算
Wn=(f_pass+f_stop)/fs;
b=fir1(N,Wn,window);
[H,w]=freqz(b,1);
db=20*log10(abs(H));
[phi, w1]=phasez(b,1);
elseif(A_stop<=44)%选择汉宁窗
N = ceil(6.2*pi/ deltaw) + 1; % 按汉宁计算所需的滤波器阶数N0
window = (hann(N+1))'; % 汉宁计算
Wn=(f_pass+f_stop)/fs;
b=fir1(N,Wn,window);
[H,w]=freqz(b,1);
db=20*log10(abs(H));
[phi, w1]=phasez(b,1);
elseif(A_stop<=55)%选择海明窗
N = ceil(6.6*pi/ deltaw) + 1; % 按海明窗计算所需的滤波器阶数N0
window = (hamming(N+1))'; % 海明窗计算
Wn=(f_pass+f_stop)/fs;
b=fir1(N,Wn,window);
[H,w]=freqz(b,1);
db=20*log10(abs(H));
[phi, w1]=phasez(b,1);
elseif(A_stop<=64)%选择凯瑟窗 belt = 6
N = ceil(4.33*fs/TW); % 按海明窗计算所需的滤波器阶数N0
window = kaiser((N+1),6)';%使用凯撒窗
Wn=(f_pass+f_stop)/fs;
b=fir1(N,Wn,window);
[H,w]=freqz(b,1);
db=20*log10(abs(H));
[phi, w1]=phasez(b,1);
elseif(A_stop<=75)%选择布莱克曼窗
N = ceil(11*pi/ deltaw) + 1; % 按布莱克曼计算所需的滤波器阶数N0
window = (blackman(N+1))'; % 布莱克曼计算
Wn=(f_pass+f_stop)/fs;
b=fir1(N,Wn,window);
[H,w]=freqz(b,1);
db=20*log10(abs(H));
[phi, w1]=phasez(b,1);
end
以下为函数调用:
b=firwindow(3,5,100,21)