【FPGA】fir滤波器-半带滤波器

1. 半带滤波器的定义

    半带滤波器是一种特殊的FIR滤波器,其阶数只能为偶数,长度为奇数(N阶滤波器,N+1个抽头)。滤波器系数除了中间值为0.5外,其余偶数序号的系数都为0(因此也大大节省了滤波时的乘法和加法运算),半带滤波器是一种特殊的低通FIR数字滤波器。这种滤波器由于通带和阻带相对于二分之一Nyquist频率对称,因而有近一半的滤波器系数精确为零。
    半带 FIR滤波器的一般频率响应:
在这里插入图片描述
幅度频率响应关于π/ 2(fs/4)对称 ,采样率归一化为 2π radians/sec,通带与阻带频率的关系为:
在这里插入图片描述
通带与阻带波纹相等,这些特征反映在滤波器的冲激响应中;例如,对于奇数个抽头系数的滤波器来说,大约有一半的系数为零且交错在非零系数之间。下图3-20,是具有11个抽头的半带滤波器:

在这里插入图片描述
实现半带滤波器时,利用这种特性得到有效的实现结构如下图所示:
在这里插入图片描述
特别注意:
数字滤波器都是2π归一化的,2π对应fs采样率。这一点和FFT结果是一样。采样时间离散序列,频谱以2π为周期,(也是以Fs为周期)

2 半带滤波器的用法示例

要求: 信号频率为25hz和50hz,采样率为120hz,设计半带滤波器滤除其中50hz的频率成分
滤波器的设计过程:
在这里插入图片描述

%信号频率为25hz和50hz,采样率为120hz,设计半带滤波器滤除其中50hz的频率成分
clear all;
clc;
fs=120;
f0=25;
f1=50;
N=256;
n=0:(N-1);
% signal = sin(2*pi*f0/fs*n);
signal = sin(2*pi*f0/fs*n)+sin(2*pi*f1/fs*n);
coff = [0,0.0671297764639564,0,-0.0953987484367994,0,0.314556319097219,0.500000000000000,0.314556319097219,0,-0.0953987484367994,0,0.0671297764639564,0];
signal_f = filter(coff,1,signal);
fft_plot(signal,fs,'滤波前的信号');
fft_plot(signal_f,fs,'滤波后的信号');


function fft_plot(y,fs,s_name)
    L_i = length(y)*100;
    s_i_fft = fft(y,L_i);
    s_i_fftshfit = fftshift(s_i_fft);
    P = abs(s_i_fftshfit)/length(y)*2;   %对于非直流分量或者0来说是除以N乘以2,对于直流分量来说是直接除以N 
%     fshift = (-L_i/2:L_i/2-1)*(fs/L_i);
    fshift = linspace(-fs/2,fs/2,L_i);
    figure;
    plot(fshift,P);
    title([s_name,'的双边谱 ']);
    xlabel('f (Hz)');
    ylabel('|P(f)|');
end

结果如下图所示:
在这里插入图片描述

参考资料:
【1】FPGA信号处理系列文章——FIR半带抽取滤波器
【2】MATLAB生成FPGA COE文件之XILINX FPGA滤波器系数
【3】fdatool工具箱设计FIR数字滤波器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值