基于FPGA的FIR滤波器的实现(2)—采用kaiserord & fir2 & firpm函数设计

前言

本篇文章继续使用matlab设计FIR滤波器,采用kaiserord和fir2来设计滤波器

一、使用kaiserord设计

在这里插入图片描述

在前一篇文章中,我们使用了各种窗函数进行了滤波器的设计比较,凯塞窗因为具有可调参数选项,因此可以根据相关算法,先选择过渡带、纹波参数,根据这些参数计算出凯塞窗的β值,以及滤波器阶数
kaiserord函数:

[n,wn,beta,filtype]=kaiserord(f,a,dev,fs)

各项参数的意义:

  1. f & fs:如果f是一个向量,其中的元素为待设计滤波器的过渡带的起始点和结束点;如果没有fs参数,f中元素的取值范围为0~1,为相对于fs/2的归一化频率;如果有fs参数,则fs为信号采样频率,f中元素即为实际的截止频率。
  2. a:一个向量,f确定了待设计滤波器的过滤带,向量a用于指定这些频率段的理想幅度值,如要求某个频带为通带,则设置为1,阻带则设置为0;其中a与f的对应关系为:a的第一个参数a1对应为f中的0~f1频段,第二个参数a2对应的是f中的f2-f3频段,以此类推。
  3. dev:是一个向量,用于指定通带或者阻带内的容许误差
  4. n:返回值n为函数根据滤波器要求,得到满足设计的最小阶数
  5. wn:返回值wn是一个向量,函数计算得到的滤波器截止频率点
  6. beta:返回值beta是计算得到的β值
  7. ftype:返回值ftype是获得的滤波器类型参数

二、使用fir2设计

使用fir1和kaiserord函数无法解决任意响应滤波器的设计;
任意相应滤波器:指滤波器的幅度频率响应在指定的频段范围内有不同的幅值。fir2函数首先根据要求的幅频响应的向量形式进行插值,而后进行傅里叶变换得到理想滤波器的单位脉冲响应,最后利用窗函数对理想滤波器的单位脉冲响应进行截短处理,获得滤波器的系数。
fir2函数的表达形式:

b=fir2(n,f,m)
b=fir2(n,f,m,window)
b=fir2(n,f,m,npt)
b=fir2(n,f,m,npt,window)
b=fir2(n,f,m,npt,lap)
b=fir2(n,f,m,npt,lap,window)

参数意义:

  1. n和b:滤波器的阶数,与fir1函数类似,返回值b为滤波器系数,长度为n+1,当设计的滤波器在归一化频率为1处的幅度值不为0时,n不能为奇数
  2. f和m:f是一个向量,取值为0-1之间,对应为滤波器的归一化频率,m是与f长度相同的向量,用于设置对应频段范围内的理想幅值。
  3. window:指定窗函数的种类
  4. npt:正整数,用于指定在对幅度响应进行插值时的插值点个数,默认值为512
  5. lap:正整数,用于指定对幅度响应进行插值时,对于不连续点转变成连续点的点数,默认值为25

fir2函数设计实例

eg:利用fir2函数设计120阶的FIR滤波器,要求设计的滤波器在归一化频率0-0.125范围内幅度为1,在0.125-0.25范围内幅度为0.5,在0.25-0.5范围内幅度为0.25,在0.5-1范围内幅度为0.125

N=120;              %滤波器阶数
fc=[0 0.125 0.125 0.25 0.25 0.5 0.5 1]; %截止频率
mag=[1 1 0.5 0.5 0.25 0.25 0.125 0.125];    %理想滤波器幅度
b=fir2(N,fc,mag);       %设计海明窗滤波器
freqz(b);               %绘制频率响应函数

频率响应曲线为:
在这里插入图片描述

三、使用firpm函数设计

firpm对应的是最优滤波器设计方法
firpm表现形式:

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,delta]=firpm(...)

参数意义:

  1. w:长度为f的1/2的向量,表示设计滤波器时,实现对应频段幅度值的权值,w0对应f0-f1频段,w1对应f2-f3频段,依次类推。权值越高,实现时响应频段的幅值越接近理想状态
  2. ftype:用于指定滤波器的结构类型,如果没有设置该参数,则表示设计偶对称脉冲响应的滤波器;如设置为‘hilbert’,则表示设计及对称结构的滤波器,具有90°的相移特性;如设置为‘differentiator’,则表示设计奇对称结构的滤波器,且设计时针对非零幅度的频带进行了加权处理,使滤波器的频带越低,则幅值误差越小
  3. delta:返回的滤波器的最大纹波值

kaiserord & firpm函数的设计实例

eg:利用凯塞窗函数设计一个低通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;

幅度频率响应曲线
在这里插入图片描述
如图,使用kaiserord函数获得的滤波器的阶数为36,截止频率为0.3125,凯塞窗的β值为3.3953.

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值