华工信工实验参考——《DSP实验 5 有限冲激响应数字滤波器设计》

        博客中的代码不出意外的话应该都是直接可以跑的,如果出了意外的话可以邮箱1902946954@qq.com

实验 5 有限冲激响应数字滤波器设计

  • 实验目的:

1、加深对数字滤波器的常用指标理解。

2、学习数字滤波器的设计方法。

二、预习要求

1. 在 MATLAB 中,熟悉函数 fir1、kaiserord 、remezord、remez 的使用; B = fir1(n,Wn,'high','noscale')设计滤波器; [n,Wn,beta,ftype] = kaiserord(f,a,dev)估计滤波器阶数; [n,fo,ao,w] = remezord (f,a,dev,fs)计算等波纹滤波器阶数 n 和加权函数 w(ω); B=remez(n,f,a)进行等波纹滤波器的设计。

2. 阅读扩展练习中的实例,学习 FIR 滤波器的设计方法及其在 MATLAB 中的实现;

3. 给出 FIR 数字滤波器的冲激响应,绘出它们的幅度和相位频响曲线,讨论它们各自的实 现形式和特点。 数字滤波器有 IIR 和 FIR 两种类型,它们的特点和设计方法不同

三、实验内容

四、窗函数法设计FIR数字滤波器

4.1代码思路

      我们查阅matlab帮助手册可以看到kaiserord和fir1函数的使用方法:

      即kaiserord用来估计滤波器阶数,输入的参数分别为边界频率,mags(可理解为滤波器的形状,带通为“010”)和通带阻带指标。因此我们只需要将要求中的dB单位换掉,用kaiseord估计滤波器阶数等参数,再代到fir1函数中即可得到滤波器的系数b。

4.2 实验源代码

clc;clear;
fcuts = [0.3 0.45 0.65 0.75];  	%边界频率
mags = [0 1 0];  				%滤波器形状描述
devs = [0.01 0.1 0.01];  		%通带阻带指标
[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs);   %滤波器阶数估计
n = n + rem(n,2);
bandpass_window = fir1(n,Wn,ftype,kaiser(n+1,beta),'noscale');   %生成滤波器系数
figure(1);
freqz(bandpass_window);%画出频率响应

4.3 实验结果及分析

用窗函数法设计FIR带通滤波器频率响应曲线入图1所示,我们可以看到该滤波器边界频率处能达到要求,并且在工作区具有线性的相位。

图1 用窗函数法设计FIR带通滤波器频率响应曲线

      我们同样可以用直接向滤波器输入频率为0.3Π,0.55Π,0.75Π的正弦波,观察是否能够滤除0.3Π和0.75Π的频率分量并且让0.55Π幅度损失在1dB以内。实现代码如下:

N=512;
n=0:N-1;
cos_test=cos((2*pi/N)*140*n)+cos((2*pi/N)*64*n)+cos((2*pi/N)*205*n);
cos_test_128=[cos_test,zeros(1,512)];
figure(2);
stem(0:length(cos_test)-1,cos_test);
test_before=fft(cos_test_128);
test_before=abs(test_before);
figure(3);
stem(0:length(cos_test_128)-1,test_before);
test_after=filter(bandpass_window,1,cos_test);
figure(4)
stem(0:length(test_after)-1,test_after);
test_after=[test_after,zeros(1,512)];
test_after=fft(test_after);
test_after=abs(test_after);
figure(5);
stem(0:length(test_after)-1,test_after);

我们可以对比滤波前后通过FFT变化得到的频谱。

图2 滤波前后频谱

我们可以清晰的看到滤波后低频和高频被滤除,而0.55Π的分量幅度从256下降至246,损失在1dB以内,也证明了该带通滤波器达到了要求的指标。

五、等波纹法设计带通滤波器

5.1代码思路

   函数remezord和remez的用法和kaiserord和fir1很相近。前者输入滤波器指标,输出滤波器阶数等参数,后者通过参数设计出滤波器最后的系数。

5.2 实验源代码

clc;clear;
fcuts=[0.3 0.45 0.65 0.75];
mval=[0 1 0];%幅值
dev=[0.01 0.1 0.01];%通带和阻带波纹系数
[N,fpts,mag,wt]=remezord(fcuts,mval,dev);
b=remez(N,fpts,mag,wt);
figure(6);
freqz(b);

5.3 结果与分析

我们看到该滤波器在通带峰值起伏上能够达到指标,但在阻带衰减上不能达到。(如0.3Π时衰减仅有37dB<40db)

图3 等波纹法设计带通滤波器频率响应曲线

      因此,我们需要增加滤波器的阶数来让其达到指标要求,我们查看MATLAB工作区,发现用remezord估计的阶数为N=25。我们逐渐增加N,发现在N=28时能够达到滤波器的最小阻带衰减。频率响应如下图所示

 

图4 修正过阶数的带通滤波器频率响应曲线

对于有限长单位冲激响应(FIR)数字滤波器设计,常用的方法之一是窗函数法(Windowing Method)。以下是使用Matlab代码实现该方法的步骤: 步骤1:确定滤波器的截止频率和阶数 根据设计,确定滤波器的截止频率和阶数。截止频率决定了滤波器的频率响应特性,阶数决定了滤波器的陡峭度。 步骤2:计算理想的单位冲激响应 使用Matlab中的fir1函数计算理想的单位冲激响应。该函数使用了窗函数来实现FIR滤波器设计。 步骤3:选择窗函数 选择一个合适的窗函数来加权理想响应。常见的窗函数有矩形窗、汉宁窗、汉明窗等。 步骤4:应用窗函数到理想单位冲激响应上 使用Matlab中的fir1函数的第三个参数来指定所选窗函数。将理想单位冲激响应与窗函数进行卷积操作,得到最终的FIR滤波器的单位冲激响应。 下面是一个示例的Matlab代码,演示了如何使用窗函数法设计FIR数字滤波器: ```matlab % 步骤1:确定滤波器的截止频率和阶数 cutoff_freq = 0.3; % 截止频率 filter_order = 100; % 阶数 % 步骤2:计算理想的单位冲激响应 ideal_response = fir1(filter_order, cutoff_freq); % 步骤3:选择窗函数 window = hamming(filter_order+1); % 使用Hamming窗函数 % 步骤4:应用窗函数到理想单位冲激响应上 filtered_response = ideal_response .* window'; ``` 这段代码首先确定了滤波器的截止频率为0.3,阶数为100。然后使用fir1函数计算了理想的单位冲激响应。接着选择了Hamming窗函数,并将其应用到理想响应上,得到了最终的FIR滤波器的单位冲激响应。 请注意,这只是窗函数法的一种实现方法,还有其他方法可以用于FIR数字滤波器设计
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值