CIC滤波器的matlab仿真与实现

这篇具有很好参考价值的文章主要介绍了CIC滤波器的matlab仿真与实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CIC滤波器的matlab仿真与实现

介绍

在数字信号处理中,由于后级硬件如FPGA的处理速度无法跟上前级ADC的采样速度,因此需要对ADC的采样数据进行降速处理,也就是对采样数据进行抽取,简单的抽取描述就是对其中连续几个点取一个点进行处理。
由抽取理论知识可以知道,抽取相当于对时域做压缩,相应的就会对频谱做扩展,同时由于采样信号都是离散的,因此反映在频谱上会有一连串的延拓频谱。这样抽取后可能会导致混叠现象的发生,使得信号失真,无法被完全还原出来。
因此一般需要在抽取前加一级低通抗混叠滤波器,以防止混叠现象的产生,一般实现框图如下图所示:
matlab cic滤波器,matlab,fpga开发,开发语言
在FPGA设计实现中,滤波器的实现需要占用乘法器和加法器资源。实际设计抽取模块时,有一种更好的抽取设计方式,那就是通过CIC滤波器同时实现抽取+滤波两项功能。CIC滤波器只需要加法器、减法器和寄存器即可实现,可以节省FPGA的乘法资源。

CIC滤波器结构

CIC滤波器由两部分组成,前部分是积分器,后部分是梳状滤波器。如下图所示
matlab cic滤波器,matlab,fpga开发,开发语言

依据Nobel恒等式,抽取与线性滤波的位置是可以交换的,只是需要注意滤波器的系数变化,上图等价于
matlab cic滤波器,matlab,fpga开发,开发语言

积分器

积分器是单极点的IIR滤波器,其状态方程为:
y ( n ) = y ( n − 1 ) + x ( n ) y(n) = y(n-1) + x(n) y(n)=y(n1)+x(n)
其系统响应为:
H 1 ( z ) = 1 / ( 1 − z − 1 ) H1(z) = 1/(1 - z^{-1}) H1(z)=1/(1z1)

梳状滤波器

梳状滤波器为对称的FIR滤波器,其状态方程为:
y ( n ) = x ( n ) − x ( n − N ) y(n) = x(n) - x(n-N) y(n)=x(n)x(nN)
其系统响应为:
H 2 ( z ) = 1 − z − N H2(z) = 1-z^{-N} H2(z)=1zN

CIC滤波器

通过将积分器与梳状滤波器进行级联,可以得到CIC滤波器的系统函数响应:
H ( z ) = H 1 ( z ) ∗ H 2 ( z ) = 1 − z − N / ( 1 − z − 1 ) H(z) = H1(z)*H2(z) = 1-z^{-N}/(1 - z^{-1}) H(z)=H1(z)H2(z)=1zN/(1z1)
也可以化简为
H ( z ) = 1 + z − 1 ) + z − 2 + . . . + z − ( N − 1 ) H(z) = 1 + z^{-1)} + z^{-2} + ...+ z^{-(N-1)} H(z)=1+z1)+z2+...+z(N1)
其中N为抽取倍数
由于单级CIC的第一旁瓣阻带衰减是固定的13.46dB,无法很好的抑制旁瓣,因此可以通过级联的方式来提升抑制效果,一般五级级联的CIC滤波器对第一旁瓣的抑制可以达到60~65dB。

matlab仿真设计

方法一:

通过cic滤波器的系统函数响应,利用matlab构建五级级联、四倍抽取的CIC滤波器,完整仿真测试代码如下:

fs = 200;		%采样率
f1 = 10;		%信号频率1
f2 = 20;		%信号频率2
n = 4096;		%采样点数
t = 0:1/fs:(n-1)/fs;
x_in = cos(2*pi*f1*t) + 2*cos(2*pi*f2*t) + 1i*sin(2*pi*f1*t) + 1i*2*sin(2*pi*f2*t);    %复数信号,提供两个不同的频率10Hz与20Hz

a = [1,-1];     %梳状滤波器系数
b = [1,-1];		%积分器系数

%五级级联积分器
c1 =  filter(1,b,x_in);	%x_in为输入信号
c2 =  filter(1,b,c1);
c3 =  filter(1,b,c2);
c4 =  filter(1,b,c3);
c5 =  filter(1,b,c4);

d = downsample(c5,4);	%对信号进行四倍抽取

%五级级联梳状滤波器
e1 = filter(a,1,d);
e2 = filter(a,1,e1);
e3 = filter(a,1,e2);
e4 = filter(a,1,e3);
y_out = filter(a,1,e4);	%y_out为CIC输出

figure
subplot(211)
f = 0:200/4096:(4096-1)*200/4096;   %归一化处理
plot(f,20*log10(abs(fft(x_in))),'b');
title('抽取前fft变换');xlabel('f/Hz');
f_d = 0:12.5/1024:(1024-1)*12.5/1024;   %归一化处理
subplot(212)
plot(f_d,20*log10(abs(fft(y_out))),'r');
title('抽取后fft变换');xlabel('f/Hz');

仿真结果图:
matlab cic滤波器,matlab,fpga开发,开发语言
信号频率不变,带宽变为原来的1/4。同时一般CIC滤波器的通带较窄,通带边沿容易衰减,可以在CIC滤波器后面加反sinc补偿滤波器进行通带补偿

方法二:

利用matlab官方提供的CIC函数进行设计,同样设计五级级联、四倍抽取的CIC滤波器,并设计补偿滤波器进行补偿,完整仿真代码如下:

fs = 200;
f1 = 10;
f2 = 20;
n = 4096;
t = 0:1/fs:(n-1)/fs;
x_in = cos(2*pi*f1*t) + 2*cos(2*pi*f2*t) + 1i*sin(2*pi*f1*t) + 1i*2*sin(2*pi*f2*t);    %复数信号,提供两个不同的频率

cic_num = 4;          %抽取倍数
Hd = dsp.CICDecimator(cic_num,1,5);     %设计系数分别为抽取倍数、延时因子、级联系数
Fp = fs/cic_num*0.4;  %补偿滤波器通带
Fstp = fs/cic_num*0.45;    %补偿滤波器阻带
CICCompDecim = dsp.CICCompensationDecimator(Hd, ... 		
    'DecimationFactor',1,'PassbandFrequency',Fp, ...
    'StopbandFrequency',Fstp,'SampleRate',fs/cic_num);		%补偿滤波器设计,设计参数分别为抽取因子、通带、阻带、抽取后采样率
FC = dsp.FilterCascade(Hd,CICCompDecim);	%滤波器级联
f = fvtool(Hd, CICCompDecim, FC, ...
    'Fs', [fs fs/cic_num fs],'Arithmetic','fixed');
f.NormalizeMagnitudeto1 = 'on';
legend(f,'CIC Decimator','CIC Compensation Decimator', ...
    'Overall Response');

x_in_t = zeros(4096,1);
for i = 1:4096
    x_in_t(i,1) = x_in(1,i);		%行矩阵替换为列矩阵,如果这里用x_in_t = x_in'频谱会显示错位
end
cicout = step(Hd,x_in_t);		%官方提供的cicout = Hd(x_in_t)会一直报错,这是推荐的另一种调用方法
y_out = step(CICCompDecim,cicout);

figure
f = 0:200/4096:(4096-1)*200/4096;   %归一化处理
subplot(311)
plot(f,20*log10(abs(fft(x_in))),'b');
title('抽取前fft变换');xlabel('f/Hz');
f_d = 0:50/1024:(1024-1)*50/1024;   %归一化处理
subplot(312)
plot(f_d,20*log10(abs(fft(cicout))),'r');
title('抽取后fft变换');xlabel('f/Hz');
subplot(313)
plot(f_d,20*log10(abs(fft(y_out))),'g');
title('补偿后fft变换');xlabel('f/Hz');

CIC滤波器幅度响应以及补偿后幅度响应如下图
matlab cic滤波器,matlab,fpga开发,开发语言
仿真结果如下图

matlab cic滤波器,matlab,fpga开发,开发语言
通过官方cic函数实现效果和通过系统函数法设计的实现效果基本一致,有点问题是关于补偿后会出现很多类似滤波器频谱响应波形的频谱还不清楚什么原因,恳请各位指教!文章来源地址https://www.toymoban.com/news/detail-697906.html

到了这里,关于CIC滤波器的matlab仿真与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FIR内插滤波器的FPGA实现(一)-matlab实现

    FIR内插滤波器是一种基本的插值方法,主要有两个步骤: 1)在输入的每一个初始采样中间插入L个零点; 2)插零后的数据经过低通滤波器。 运行结果如图(时域、频域): 我们的目标是把采样频率提升五十倍。 得到的频域图: 可以看出内插零点在频域会实现频谱扩展,因此

    2024年02月03日
    浏览(40)
  • 数字信号处理-10-并行FIR滤波器MATLAB与FPGA实现

    本文介绍了设计滤波器的FPGA实现步骤,并结合杜勇老师的书籍中的并行FIR滤波器部分进行一步步实现硬件设计,对书中的架构做了复现以及解读,并进行了仿真验证。 FIR滤波器的结构形式时,介绍了直接型、级联型、频率取样型和快速卷积型4种。在FPGA实现时,最常用的是最

    2023年04月09日
    浏览(39)
  • FIR滤波器简述及FPGA仿真验证

    数字滤波器的设计,本项目做的数字滤波器准确来说是FIR滤波器。 FIR滤波器(有限冲激响应滤波器),与另一种基本类型的数字滤波器——IIR滤波器(无限冲击响应滤波器)相对应,其实就是将所输入的信号都看成是离散的,用离散的冲击信号代替实际的信号。对于FIR滤波器

    2024年02月09日
    浏览(37)
  • 多相滤波器MATLAB仿真---抽取&插值

    多相滤波器MATLAB仿真---抽取插值 目录 前言 一、什么是多相滤波器? 二、抽取 1.不考虑滤波器延时下的抽取 2.考虑滤波器延时下的抽取 三、插值 参考文献 总结    语音信号多相滤波器是我上学期末做的一个课设,过了许久,在此仅仅简单记录一下,以特定的D值和I值展示一

    2024年02月01日
    浏览(47)
  • 基于FPGA的FIR低通滤波器实现(附工程源码),matlab+vivado19.2+simulation

    本文为FPGA实现FIR滤波器仿真过程,附源代码。 提示:以下是本篇文章正文内容,下面案例可供参考 打开MATLAB在命令行窗口输入: fadtool 回车后在滤波器设计界面设置滤波器参数如下 之后点击如图标志,设置定点,在菜单栏\\\"目标(R)\\\"出选择生成对应滤波器系数.COE文件 mat

    2024年02月11日
    浏览(32)
  • 滤波器之matlab与vivado的联合仿真

    一、目录     1、matlab产生滤波器     2、matlab进行仿真     3、搭建vivado测试电路     4、vivado仿真 二、matlab产生滤波器     本文采用FIR低通滤波器,在命令行输入fdatool进入滤波器配置页面,如下配置                   导出滤波器函数              设置名字为filter

    2024年02月09日
    浏览(38)
  • 信号处理之FIR数字滤波器(Matlab仿真)

            数字滤波器的作用是滤除不感兴趣的信号,留下想要的信号。数字滤波器可分为无限脉冲响应(IIR)数字滤波器、有限脉冲响应(FIR)数字滤波器两种,两者各有优缺点,其中FIR数字滤波器因其具有良好的线性相位特性受到广泛应用,线性相位是指信号中各频率成分的相对

    2024年02月03日
    浏览(40)
  • 基于正交滤波器组的语音DPCM编解码算法matlab仿真

    目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程           matlab2022a        在语音信号处理中,一种常见的编解码技术是差分脉冲编码调制(DPCM)。DPCM是一种无损或有损压缩技术,通过利用信号中的冗余性来减少数据传

    2024年02月15日
    浏览(31)
  • 基于FPGA的FIR滤波器的实现(5)— 并行结构FIR滤波器的FPGA代码实现

    并行结构,并行实现滤波器的累加运算,即并行将具有对称系数的输入数据进行相加,而后采用多个乘法器并行实现系数与数据的乘法运算,最后将所有乘积结果相加输出。这种结构具有最高的运行速度,因不需要累加运算,因此系数时钟频率可以与数据输出时钟频率保持一

    2024年02月03日
    浏览(42)
  • (三)FPGA实现滤波器

     DDS:直接数字式频率合成器,可以根据需求产生不同频率和相位的正弦波数据,通常用于通信系统中的调制解调。 配置过程: 【IP CATALOG】à【modulation DDS complier】 Configuration Options Phase generator and SIN COS LUT 相位和查找表(本实验中选这个) Phase Generator only 只产生相位 SIN CO

    2024年02月16日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包