提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

FPGA信号处理系列文章——用matlab理解CIC滤波器的原理

  • 滑动平均滤波器
  • 滑动平均滤波器的递归实现
  • CIC抽取滤波器
  • CIC插值滤波器
  • 总结

滑动平均滤波器

为了理解级联积分梳状(CIC)滤波器,首先让我们了解滑动平均滤波器。
这种滤波器在时域上最大的特点就是所有的系数都相等,并且为常数。滤波器的输入输出关系可以表示为如下简单的算术平均关系

Y(n) = 1/N*(x(n) + x(n-1)+…… +x(n-(N-1)))
也就是说,滤波器当前时刻的输入等于当前时刻的输入与之前N-1个时刻输入的算术平均。很明显,这种滤波器在时域上看来是非常简单的,而且编程也非常方便。


滑动平均滤波器的幅频响应是:

%Moving Average filter
N = 10;%ÑÓʱ
xn = sin(2*pi*[0:.1:10]); % n = [0:1:100];sin(2*pi*f*t)=sin(2*pi*f*T*n) => f = 1Hz, fs = 10Hz
hn = ones(1,N);%Âö³åÏìÓ¦
y1n = conv(xn,hn);%transfer function of Moving Average filter
hF = fft(hn,1024);
plot([-512:511]/1024,20*log10(abs(fftshift(hF))));
xlabel('Normalized frequency')
ylabel('Amplitude')
title('frequency response of Moving average filter')
grid on

滑动平均滤波器的递归实现

如上所示作为直接形式FIR类型实现的移动平均滤波器也可以以递归形式实现, 它由一个梳状级组成,其输出是当前样本与前一个样本的差值, 差值由积分器级连续累积,这些电路的行为与前面描述的移动平均滤波器相同。


由于系统是线性的,积分器和梳状器的位置可以互换。 现在,使用一个小的 Matlab 代码片段让我们验证 CIC 实现的输出确实与移动平均滤波器获得的输出相同。

clc;clear all;close all;N = 10;
xn = sin(2*pi*[0:.1:10]);
hn = ones(1,N);
y1n = conv(xn,hn);% Implementing Cascaded Integrator Comb filter with the
% comb section following the integrator stage
N = 10;
delayBuffer = zeros(1,N);
intOut = 0;
xn = sin(2*pi*[0:.1:10]);
for ii = 1:length(xn)
% comb section
combOut = xn(ii) - delayBuffer(end);
delayBuffer(2:end) = delayBuffer(1:end-1);
delayBuffer(1) = xn(ii);% integrator
intOut = intOut + combOut;
y2n(ii) = intOut;
enderr12 = y1n(1:length(xn)) - y2n;
figure(1)
plot(err12)% Implementing Cascaded Integrator Comb filter with the
% integrator section following the comb stageN = 10;
delayBuffer = zeros(1,N);
intOut = 0;
xn = sin(2*pi*[0:.1:10]);
for ii = 1:length(xn)
% integrator
intOut = intOut + xn(ii);% comb section
combOut = intOut - delayBuffer(end);
delayBuffer(2:end) = delayBuffer(1:end-1);
delayBuffer(1) = intOut;
y3n(ii) = combOut;enderr13 = y1n(1:length(xn)) - y3n;
figure(2)
plot(err13)


y1n和y2n以及y1n和y3n的差别极小,说明这两种结构的输出是等效的

如上所述的 FIR 滤波器的递归实现有助于以更少的硬件实现相同的结果。

CIC抽取滤波器

通常,通过从每 D 个样本中抽取一个样本来实现抽取到较低的采样率。 存在一个抗混叠滤波器以在抽取之前去除不需要的频谱。


如上所示,通过在积分器级和梳状器级之间设置抽取级可以实现相同的输出。 这有助于减少梳状部分的延迟缓冲器深度要求。 使用一个小的 Matlab 代码片段,让我们检查两个实现是否相同。

close all;clear all;clc;% For decimation, having the CIC filtering before taking every other sample
D = 2; % decimation factor
N = 10; % delay buffer depth
delayBuffer = zeros(1,N); % init
intOut = 0;
xn = sin(2*pi*[0:.1:10]);
y6n = [];
for ii = 1:length(xn)
% comb section
combOut = xn(ii) - delayBuffer(end);
delayBuffer(2:end) = delayBuffer(1:end-1);
delayBuffer(1) = xn(ii);
% integrator
intOut = intOut + combOut;
y6n = [y6n intOut];
end
y6n = y6n(1:D:end); % taking every other sample ¨C decimation
% For efficient hardware implementation of the CIC filter, having the
% integrator section first, decimate, then the comb stage
% Gain : Reduced the delay buffer depth of comb section from N to N/D
D = 2; % decimation factor
N = 10; % delay buffer depth
delayBuffer = zeros(1,N/D);
intOut = 0;
xn = sin(2*pi*[0:.1:10]); % input
y7n = []; % output
for ii = 1:length(xn)
% integrator
intOut = intOut + xn(ii);
if mod(ii,2)==1
% comb section
combOut = intOut - delayBuffer(end);
delayBuffer(2:end) = delayBuffer(1:end-1);
delayBuffer(1) = intOut;
y7n = [ y7n combOut];
end
end
err67 = y6n - y7n;
figure(2)
plot(err67)


y6n和y7n差别极小,说明这两种结构的输出是等效的

CIC插值滤波器

通常,通过在连续样本之间插入零然后过滤来实现更高采样率的插值。


如上所示,通过在梳状和积分器级之间设置上采样级可以实现相同的结果。 这有助于减少梳状部分的延迟缓冲器深度要求。 使用一个小的 Matlab 代码片段,让我们检查两个实现是否相同。

close all;clear all;clc% For interpolation, insert the zeros followed by CIC filtering
xn = sin(2*pi*[0:.1:10]);
I = 2; % interpolation factor
N = 10; % filter buffer depth
xUn = [xn; zeros(1,length(xn))];
xUn = xUn(:).'; % zeros inserted
delayBuffer = zeros(1,N);
intOut = 0;
for ii = 1:length(xUn)
% comb section
combOut = xUn(ii) - delayBuffer(end);
delayBuffer(2:end) = delayBuffer(1:end-1);
delayBuffer(1) = xUn(ii);
% integrator
intOut = intOut + combOut;
y4n(ii) = intOut;
end
% For efficient hardware implementation of CIC filter for interpolation, having
% the comb section, then zeros insertion, followed by integrator section
% Gain : Reduced the delay buffer depth of comb section from N to N/I
I = 2; % interpolation factor
N = 10; % original delay buffer depth
delayBuffer = zeros(1,N/I); % new delay buffer of N/I
intOut = 0;
xn = sin(2*pi*[0:.1:10]);
y5n = [];
for ii = 1:length(xn)
% comb section
combOut = xn(ii) - delayBuffer(end);
delayBuffer(2:end) = delayBuffer(1:end-1);
delayBuffer(1) = xn(ii);
% upsampling
combOutU = [ combOut zeros(1,1)];
for jj =0:I-1
% integrator
intOut = intOut + combOutU(jj+1);
y5n = [y5n intOut];
end
end
err45 = y4n - y5n;
plot(err45)


Y4n和y5n结果完全一致,说明这两种结构的输出是等效的

总结

可以看出CIC滤波器只不过是滑动平均滤波器的一个非常高效的迭代实现。以上是单级CIC滤波器,第一旁瓣和主瓣差值为13.36dB。那么要让阻带更大呢,当然可以通过级联CIC来实现,下一篇再讲

套用一句现在流行的话:
没有什么波是一个滤波器滤不掉的,如果不行,那就再来一个!

FPGA信号处理系列文章——用matlab理解CIC滤波器的原理相关推荐

  1. FPGA信号处理系列文章——FIR半带插值滤波器

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--FIR半带插值滤波器 信号流 matlab模型 FIR系数生成 IP核的设置 注意事项 信号流 半带插值滤 ...

  2. FPGA信号处理系列文章——FIR半带插值滤波器-1个时钟2个采样点的优化处理

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--FIR半带插值滤波器-1个时钟2个采样点的优化处理 前言 设计参数 常规IP设置 优化处理 总结 前言 假 ...

  3. FPGA信号处理系列文章——数字锁相环

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--数字锁相环 锁相环的一些概念 鉴相器 Matlab 程序 锁相环的一些概念 1.捕获.锁定与跟踪的概念 捕 ...

  4. FPGA信号处理系列文章——码元同步

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--码元同步 前言 码元粗同步 超前-滞后门同步器 鉴别器 matlab程序 前言 前面,我们将了锁频环和锁相 ...

  5. FPGA信号处理系列文章——CRC运算的实现

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--CRC运算的实现 前言 CRC运算的框图 matlab模型 verilog实现 总结 前言 很多协议都会用 ...

  6. FPGA经验谈系列文章——FPGA开发方向以及算法开发模型

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA经验谈系列文章--FPGA开发方向以及算法开发模型 前言 接口方向 算法方向 总结 前言 FPGA开发笼统的说可以分为两个方向 ...

  7. FPGA经验谈系列文章——前言和目录

    FPGA经验谈系列文章--前言和目录 前言 工作内容 最后 前言 转眼间,工作也即将十年时间,也是做FPGA开发的十年,虽然我总是认为我一开始走错了路,我应该去搞互联网的o( ̄︶ ̄)o.但也确实做到了 ...

  8. FPGA经验谈系列文章——时序不过怎么办

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA经验谈系列文章--时序不过怎么办 前言 如果设计验证和测试已经接近尾声,偶尔进行小改可能出现几条时序违例的情况 逻辑级数过大引 ...

  9. 大话卫星导航中的信号处理系列文章——GPS信号以及C/A码生成

    大话卫星导航中的信号处理系列文章--GPS信号以及C/A码生成 GPS信号 L1C/A信号的构成 C/A码信号的生成 GPS信号 目前GPS信号一共有三个频点L1/L2/L3. 其中传统GPS信号就是 ...

  10. FPGA经验谈系列文章——那些曾经让我发狂的BUG

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA经验谈系列文章--那些曾经让我发狂的BUG 前言 跨时钟域处理不对问题 组合逻辑产生锁存器问题 外围器件协议理解不深的问题 接 ...

最新文章

  1. java反射的性能_java反射的性能问题
  2. eclipse查看mysql代码_在eclipse中查看Android源代码
  3. sql服务器网页无法连接到服务器失败,SQL2008无法连接到服务器,用户’XX’登录失败(错误18456)解决方法...
  4. 天气预报HTML代码
  5. 网络基础Cisco路由交换四
  6. linux wc read,Linux 下使用 wc 统计文件夹下所有文件的代码行数(包括子目录)-Go语言中文社区...
  7. Linux 查看磁盘的属性,Windows XP 查看磁盘属性(转)
  8. oracle登录总结
  9. VBF BETA 1.5 发布了
  10. Delphi中Sender对象的定义
  11. Oracle11g在Windows和Linux下imp导入表,exp导出表,sqluldr2导出表,sqlldr导入表
  12. 对口升学计算机网络网络试题及答案,2011-2015计算机对口升学网络试题汇总
  13. 对软件迭代开发的一些感悟
  14. Scheme 协议收集总结
  15. 欠四大银行信用卡不还,最终会怎么样?
  16. CentOS7 忘记密码——重置
  17. android马甲包代理,安卓渠道马甲包配置
  18. 头哥实践教学平台 CC++程序设计(计算机程序设计)基本输入输出
  19. 24点游戏java代码 中国开源社区_编程实现一个有GUI的24点游戏
  20. NLP学习笔记-FastText文本分类(四)

热门文章

  1. 使用MATLAB绘制Smith圆图
  2. ios加密算法AES
  3. Alienware-17-R2 Ubuntu killer无线网卡
  4. sql(主要mysql)书籍推荐
  5. 【BLE MIDI】MIDI 文件格式分析 ( MIDI 文件头解析 | MIDI 文件头标识 | MIDI 文件头长度 | MIDI 文件格式 | MIDI 轨道个数 | 基本时间 )
  6. IT行业必须知道的基础知识
  7. 我在51CTO微职位学PMP_飘过攻略及心得分享
  8. JavaME开发环境的搭建
  9. mysql中根据经纬度求距离_mysql、java中根据经纬度计算距离
  10. 计算机累论文的数据字典怎么写,毕业论文中数据字典应该这样写