通过Matlab不同函数设计的低通滤波器性能对比

感情迁移 提交于 2020-02-16 23:29:36

所有的设计均是为了得到更逼近理想滤波器的滤波器,而衡量逼近程度的准则有多种,其中最常用的是最大误差最小准则。采用这种准则进行滤波器设计的函数就是firpm函数。

firpm函数语法的5种基本形式

b = firpm(n,f,a)
b = firpm(n,f,a,w)
b = firpm(n,f,a,'ftype')
b = firpm(n,f,a,w,'ftype')
[b,data] = firpm(...)

利用凯塞窗函数设计一个低通FIR滤波器,过渡带为1000~1500Hz,采样频率为8000Hz,通带波纹最大为0.01,阻带波纹最大为0.05,。利用海明窗以及firpm函数设计相同的低通滤波器,截止频率为1500Hz,滤波器阶数为凯塞窗函数求取的值。绘制出三种方法设计的幅度响应曲线。

实现代码

fs = 8000;                                      % 采样频率
fc = [1000 1500];                               % 过渡带
mag = [1 0];                                    % 窗函数的理想滤波器幅度
dev = [0.01 0.05];                              % 纹波
[n,wn,beta,ftype] = kaiserord(fc,mag,dev,fs);   % 获取凯塞窗参数
fpm = [0 fc(1)*2/fs fc(2)*2/fs 1];              % firpm 函数的频段向量
magpm = [1 1 0 0];                              % firpm 函数的幅值向量

% 设计凯塞窗及海明窗滤波器
h_kaiser = fir1(n,wn,ftype,kaiser(n+1,beta));
h_hamm = fir1(n,fc(2)*2/fs);

% 设计最优滤波器
h_pm = firpm(n,fpm,magpm);

% 求滤波器的幅频响应
m_kaiser = 20*log(abs(fft(h_kaiser,1024)))/log(10);
m_hamm = 20*log(abs(fft(h_hamm,1024)))/log(10);
m_pm = 20*log(abs(fft(h_pm,1024)))/log(10);

% 设置幅频响应的横坐标单位为Hz
x_f = [0:(fs/length(m_kaiser)):fs/2];

% 只显示正频率部分的幅频响应
m1 = m_kaiser(1:length(x_f));
m2 = m_hamm(1:length(x_f));
m3 = m_pm(1:length(x_f));

% 绘制幅频响应曲线
plot(x_f,m1,'-',x_f,m2,'-',x_f,m3,'-');
xlabel('频率(Hz)');ylabel('幅度(dB)');
legend('凯塞窗','海明窗','最优滤波器');grid;

绘制波形

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!