【滤波器】基于Matlab实现直接型、级联型、频率抽样型FIR滤波器

本文通过MATLAB程序介绍了FIR滤波器的软件设计方法,以窗函数法为例,详细展示了低通、带通、高通和带阻滤波器的设计过程,并探讨了频率响应和量化对滤波器性能的影响。该方法在现代电子系统设计中有广泛应用价值。
摘要由CSDN通过智能技术生成

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信       无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机 

⛄ 内容介绍

相对于硬件方式,采用软件方式可以通过对滤器参数的改变来调整滤波器的性能以达到实现滤波目标.以窗函数法为实例,采用MATLAB程序法介绍了FIR滤波器的设计理念,提出了一款低通滤波器的模型和仿真过程,并对带通,高通,带阻滤波器的设计进行了讨论.实践证明,此种滤波器的设计方法可以很好地实现各种FIR滤波器的设计,能在要求相位线性信道的现代电子系统设计中得到广泛应用,具有一定的工程实践价值.

⛄ 部分代码

clc;

clear all;

close all;

imtool close all;

tic

%*********************************************************%

%****************** FIR 直接型****************************%

%*********************************************************%

%% FIR 滤波器

b = [1, 1.5, 5, 2];  % 系统传递函数的分子系数

a = 1;               % 系统传递函数的分母系数,IIR的分母变为1就是FIR

figure(1);set(gcf,'color','w','position',[150,50,512,700]);

%% 单位冲激响应h(n)

N = 30;

delta = impseq(0, 0, N);

h = filter(b, a, delta);

subplot(311); stem(h); title('直接型FIR单位冲激响应h(n)');

%% 单位阶跃响应

X = [ones(1,5), zeros(1, N-5)];

y = filter(b, a, X);

subplot(312); stem(y); title('直接型FIR单位阶跃响应y(n)');

%% 频率响应

b_iir=[1,-3,11,27,18];

a_iir=[16,12,2,-4,-1];

[sos,g]=tf2sos(b_iir,a_iir);

w=linspace(-2*pi,2*pi,500);

N = size(sos);

w=linspace(-2*pi,2*pi,500);

H0=ones(1,length(w));

for k=1:N

    b1=sos(k,1:3);

    a1=sos(k,4:6);

    H1=freqz(b1,a1,w);

    H0=H0.*H1;

end

H0=g*H0;

H0=20*log10(abs(H0));

[sos,g]=tf2sos(b,a);

for k=1:N

    b1=sos(k,1:3);

    a1=sos(k,4:6);

    H1=freqz(b1,a1,w);

    H0=H0.*H1;

end

H0=g*H0;

H0=20*log10(abs(H0));

H_dir_norm = H0;

subplot(3,1,3),plot(w/pi,H0,'b-','LineWidth',2);hold on

axis tight

title('直接型FIR频率响应');

axis([0,1,-50,40]);

xlabel('单位:pi');

ylabel('单位:dB');

toc

%*********************************************************%

%*********************************************************%

%% 量化系数

bit_num=4;

m = max(max(abs(a),abs(b)));

Qm = floor(log2(m/a(1)));

if Qm < log2(m/a(1))

    Qm = Qm + 1;

end

Qm = 2^Qm;

bd = round(b/Qm*(2^(bit_num-1)-1));

ad = 1;

b_iir=[1,-3,11,27,18];

a_iir=[16,12,2,-4,-1];

[sos,g]=tf2sos(b_iir,a_iir);

w=linspace(-2*pi,2*pi,500);

N = size(sos);

w=linspace(-2*pi,2*pi,500);

H0=ones(1,length(w));

for k=1:N

    b1=sos(k,1:3);

    a1=sos(k,4:6);

    H1=freqz(b1,a1,w);

    H0=H0.*H1;

end

H0=g*H0;

H0=20*log10(abs(H0));

[sos,g]=tf2sos(bd,ad);

for k=1:N

    b1=sos(k,1:3);

    a1=sos(k,4:6);

    H1=freqz(b1,a1,w);

    H0=H0.*H1;

end

H_dir_quatify=g*H0;

H_dir_quatify=20*log10(abs(H_dir_quatify));

subplot(3,1,3),plot(w/pi,H_dir_quatify,'k--','LineWidth',2);hold on

legend('量化前','4bit量化','location','southeast');

⛄ 运行结果

[1] 冯冠超. FIR数字滤波器设计及MATLAB实现[J]. 信息系统工程, 2010(6):1.

[2] 张驰, 郭黎利. 基于Matlab的FIR滤波器设计及FPGA实现[J]. 应用科技, 2006, 33(6):4.

[3] 李洋洋, 江亮亮. 基于MATLAB的FIR数字滤波器的设计与实现[J]. 黑龙江科技信息, 2008(27):2.

[4] 李茂清王洁陈强柯淋. 基于MATLAB程序的FIR滤波器设计实现[J]. 电力学报, 2008, 023(002):87-90.

⛄ 参考文献

⛳️ 完整代码

❤️部分理论引用网络文献,若有侵权联系博主删除

❤️ 关注我领取海量matlab电子书和数学建模资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值