FIR滤波器matlab实现;三种滤波器比较。

FIR低通滤波器过滤带300-600Hz,采样频率8000Hz,通带、阻带纹波0.04,截止频率600Hz。

%《锁相环技术原理及FPGA实现-杜勇》第100页。
%filtercompare.m
%用kaiserord计算满足性能要求的最小滤波器阶数;
%用firpm和firm1分别设计最优滤波器,以及窗函数滤波器,并绘制其幅频特性
%输出最优滤波器系数

function h_pm = filtercompare0;
clc;
clear all;
close all;
fs = 8000;%采样频率8000Hz;
fc=[300 600];%过滤带
mag = [1 0];%窗函数的理想滤波器幅度
dev = [0.04 0.04];%纹波
[n,wn,beta,ftype] = kaiserord(fc,mag,dev,fs);
%获取凯塞窗参数
%fc:滤波器过滤带的起始点和结束点;在此处设置为300-600Hz;
%mag:对应f中各频段的理想幅度值;在此设置0-300Hz幅度值为1,300-600幅度值为0
%dev:对应f各频段容许误差;在此设置0-300Hz误差为0.04,300-600Hz误差为0.04
     %其实也就是通带和阻带的纹波分别为0.04;
%fs:采样频率,8000Hz
%n:返回值,为kaiserord()函数根据滤波器要求,得到满足设计的最小阶数;
%wn:返回值,为一个向量,kaiserord()得到的滤波器截止频率;
%beta:返回值,为根据滤波器要求,kaiserord()计算得到的β值;
%ftype:返回值,为根据要求获得的滤波器类型参数
fpm = [0 fc(1)*2/fs fc(2)*2/fs 1];%firpm函数的频段向量;
magpm = [1 1 0 0];%firpm函数的幅度向量;
format long;

%设计凯塞窗及海明窗滤波器
h_kaiser = fir1(n,wn,ftype,kaiser(n+1,beta));
%fir滤波器
%h_kaiser,返回的FIR滤波器单位脉冲响应,脉冲响应为偶对称,长度为n+1;
%n,滤波器的阶数,需要注意的是,设计出的滤波器长度为n+1;
%wn,滤波器截止频率,
h_hamn = fir1(n,fc(2)*2/fs);
%fc(2)*2/fs:截止频率,取值范围0-1,1对应采样频率8000的一半。
%设计最优滤波器
h_pm = firpm(n,fpm,magpm);
%h_pm:滤波器系数,长度为n+1;
%n:滤波器的阶数;
%fpm:滤波器的归一化频率;
%magpm:fpm对应的理想幅值;
%求滤波器的幅频响应
m_kaiser = 20*log10(abs(fft(h_kaiser,1024)));
%fft(x,n),n为返回n点DFT;
m_hamm=20*log10(abs(fft(h_hamn,1024)));
m_pm = 20*log10(abs(fft(h_pm,1024)));
%转化为db,db=20*log10(Vo/Vi)
%设置幅频响应的横坐标单位为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,'--');
title('三种滤波器比较');
xlabel('频率(Hz)');
ylabel('幅度(dB)');
legend('凯塞窗','海明窗','最优滤波器');
grid;


end

幅频响应特性如图:

仅供学习。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值