采用海明窗,设计FIR滤波器
1、标准频率响应的 FIR 滤波器设计
在 Matlab 中,标准频率响应的 FIR 滤波器设计函数为 fir1,其调用形式为:
- b = fir1(n,Wn)使用汉明窗来设计具有线性相位的n阶低通,带通或多频FIR滤波器。滤波器类型取决于Wn的元素数量。
- b = fir1(n,Wn,ftype)设计低通,高通,带通,带阻或多频带滤波器,取决于ftype的值和Wn的元素数量。
- b = fir1(___,window)使用window中指定的向量和上面语法中的任何参数设计滤波器。
- b = fir1(___,scaleopt)scaleopt 指定是否归一化滤波器的幅度响应。
clc; % 清空命令行窗口
clear; %清空工作区
close all;
% fir1函数使用方法
b = fir1(48,[0.35 0.65]);
freqz(b,1,512)
figure
b1 = fir1(11,0.2);
plot(20*log(abs(fft(b1)))/log(10))
2、采用海明窗,设计 FIR 滤波器
% E4_1_fir1.m文件的源码
%
% 采用海明窗,分别设计长度为41(阶数为40)的低通(截止频率为200Hz)、
% 高通(截止频率为200Hz)、带通(通带为200~400Hz)、
% 带阻滤波器(阻带为200~400Hz)FIR滤波器,
% 采样频率为2000Hz,画出其脉冲响应及幅频响应图。
figure
% E4_1_fir1.m文件的源码
%
% 采用海明窗,分别设计长度为41(阶数为40)的低通(截止频率为200Hz)、
% 高通(截止频率为200Hz)、带通(通带为200~400Hz)、
% 带阻滤波器(阻带为200~400Hz)FIR滤波器,
% 采样频率为2000Hz,画出其脉冲响应及幅频响应图。
N = 41; %滤波器长度
fs = 2000; %采样频率
%g各种滤波器的特征频率
fc_lpf = 200;
fc_hpf = 200;
fp_bandpass = [200 400];
fc_stop = [200 400];
%以采样频率的一半,对频率进行归一化处理
wn_lpf = fc_lpf*2/fs;
wn_hpf = fc_hpf*2/fs;
wn_bandpass = fp_bandpass*2/fs;
wn_stop = fc_stop*2/fs;
%采用fir1 函数涉及FIR滤波器
b_lpf = fir1(N-1,wn_lpf);
b_hpf = fir1(N-1, wn_hpf,"high");
b_bandpass = fir1(N-1,wn_bandpass,'bandpass');
b_stop = fir1(N-1,wn_stop,'stop');
%求滤波器的幅频响应
m_lpf = 20*log(abs(fft(b_lpf)))/log(10);
m_hpf = 20*log(abs(fft(b_hpf)))/log(10);
m_bandpass = 20*log(abs(fft(b_bandpass)))/log(10);
m_stop = 20*log(abs(fft(b_stop)))/log(10);
%设置幅频响应的横坐标单位为Hz
x_f = 0:(fs/length(m_lpf)):fs/2;
%绘制单位脉冲响应
subplot(421); stem(b_lpf); xlabel('n'); ylabel('h(n)');
title('低通滤波器的单位脉冲响应','FontSize',8);
subplot(423); stem(b_hpf); xlabel('n'); ylabel('h(n)');
title('高通滤波器的单位脉冲响应','FontSize',8);
subplot(425); stem(b_bandpass); xlabel('n'); ylabel('h(n)');
title('带通滤波器的单位脉冲响应','FontSize',8);
subplot(427); stem(b_stop); xlabel('n'); ylabel('h(n)');
title('带阻通滤波器的单位脉冲响应','FontSize',8);
%绘制幅频响应曲线
subplot(422); plot(x_f,m_lpf(1:length(x_f)));
xlabel('频率(Hz)','FontSize',8); ylabel('幅度(dB)','FontSize',8);
title('低通滤波器的幅频响应','FontSize',8);
subplot(424); plot(x_f,m_hpf(1:length(x_f)));
xlabel('频率(Hz)','FontSize',8); ylabel('幅度(dB)','FontSize',8);
title('高通滤波器的幅频响应','FontSize',8);
subplot(426); plot(x_f,m_bandpass(1:length(x_f)));
xlabel('频率(Hz)','FontSize',8); ylabel('幅度(dB)','FontSize',8);
title('带通滤波器的幅频响应','FontSize',8);
subplot(428); plot(x_f,m_stop(1:length(x_f)));
xlabel('频率(Hz)','FontSize',8); ylabel('幅度(dB)','FontSize',8);
title('带阻滤波器的幅频响应','FontSize',8);