CIC滤波器的matlab仿真与实现

article/2025/10/6 13:44:15

CIC滤波器的matlab仿真与实现

介绍

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

CIC滤波器结构

CIC滤波器由两部分组成,前部分是积分器,后部分是梳状滤波器。如下图所示
Alt

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

积分器

积分器是单极点的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与20Hza = [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');

仿真结果图:
Alt
信号频率不变,带宽变为原来的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:4096x_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滤波器幅度响应以及补偿后幅度响应如下图
Alt
仿真结果如下图

在这里插入图片描述
通过官方cic函数实现效果和通过系统函数法设计的实现效果基本一致,有点问题是关于补偿后会出现很多类似滤波器频谱响应波形的频谱还不清楚什么原因,恳请各位指教!


http://chatgpt.dhexx.cn/article/AtKYTp1Q.shtml

相关文章

RGB颜色空间与Lab颜色空间区别与联系(附转换代码)

RGB颜色空间 RGB颜色是红色(Red)、绿色(Green)和蓝色(Blue)三基色的字母缩写。RGB色彩模式是通过三种基本颜色的不同程度的迭加来产生各种各样的不同颜色。这个标准能够涵盖人类视力所能感知的所有颜色&am…

matlab中的xlabel, ylabel, zlabel

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 标注x,y和z轴 语法 xlabel(string) xlabel(fname) xlabel(...,PropertyName,PropertyValue,...) xlabel(axes_handle,...) h xlabel(...) ylabel…

在CIELab颜色空间下使用八方向Sobel算子实现边缘检测

参考河北师范大学硕士学位论文——基于八方向Sobel算子的边缘检测算法研究。 由于自己实现滤波器运算,计算速度很慢,以后有能力再进行改进。 算子定义如下: 算法思路: 1.将RGB图像转化为CIELab颜色空间的图像。 2.计算不同方…

RGB转Lab的那些事(一)

Matlab与OpenCV都有RGB转Lab的具体实现,然而两种版本给出的结果似乎并不一样,那么两者有何区别呢? 首先了解RGB转Lab的理论知识: 一般地,由RGB转Lab都需要先将RGB转为XYZ,再由XYZ转为Lab。通常我们获取的…

CIE颜色空间

国际照明委员会(CIE,Commission Internationale de LEclairage / International)的色度模型是最早使用的模型之一。它是三维模型,其中,x和y两维定义颜色,第3维定义亮度。 CIE 1931RGB 1.颜色匹配实验 根…

LAB色彩模型

LAB色彩模型 LAB色彩模式名称由来组成数值范围 优点设备无关。色域宽阔 Adobe photoshop中的LAB: LAB色彩模式 名称由来 Lab的全称是CIELAB,有时候也写成CIE Lab*。 是根据Commission International Eclairage(CIE)在1931年所制定的一种测定…

彻底搞懂Lab 颜色空间

本文参考wikipedia,并加入了自己的理解,有不对的地方多多指教~ 名称 在开始之前,先明确一下Lab颜色空间(Lab color space)的名字: - Lab的全称是CIELAB,有时候也写成CIE L*a*b* - 这里的CIE…

颜色空间之CIE色度模型

国际照明委员会(CIE,Commission Internationale de LEclairage / International)的色度模型是最早使用的模型之一。它是三维模型,其中,x和y两维定义颜色,第3维定义亮度。CIE在1976年规定了两种颜色空间。 一…

Matlab中CIC滤波器的应用

Matlab中CIC滤波器的应用 CIC滤波器基本原理 CIC(积分梳状级联)滤波器是工程上经常用的滤波器,因为CIC滤波器不需要乘法,CIC滤波器往往在级联抽取滤波器的第一级和级联插值滤波器的最后一级。这一节我们以CIC抽取滤波器为例来讲C…

OpenCV中Lab空间简介及RGB转Lab

Lab颜色模式简介: From:http://wenku.baidu.com/view/67b1b11f650e52ea551898f7.html OpenCV中使用cvCvtColor加CV_BGR2Lab转成CIELAB后取值范围: 有时根据需要,我们使用 cvCvtColor( img, img, CV_BGR2Lab );把色彩空间从RGB转换…

【CIC滤波器】基于MATLAB/FPGA的数字CIC滤波器的设计

FPGA代码: module down(i_clk,//输入时钟i_rst,//输入复位信号i_M, //抽取值i_data,//输入信号o_data,//输出信号r_clk);input i_clk;//输入时钟 input i_rst;//输入复位信号 input [7:0] i_M; //抽取值 input signe…

CIE RGB、CIE XYZ、 Lab空间转换

颜色空间转换 CIE RGB转化到CIE XYZCIE XYZ到Lab空间 CIE RGB转化到CIE XYZ 由于CIE RGB空间在描述色彩时会出现负值,因此为了方便计算(1931年),CIE提出了一种新的色彩空间 CIE XYZ。 转换公式如下: 可见,…

【Matlab 图像】LAB 色彩空间分析

名称 在开始之前,先明确一下Lab颜色空间(Lab color space)的名字: Lab的全称是CIELAB,有时候也写成CIE Lab*这里的CIE代表International Commission on Illumination(国际照明委员会)&#xf…

C计算CIELAB、CIELUV均匀颜色空间中两种颜色的色差

C计算CIELAB、CIELUV均匀颜色空间中两种颜色的色差 ** 如何利用C语言计算两种颜色在CIELAB、CIELUV的总色差?例如:已知两颜色样品的色度值为:Y176.79,x10.4480, y10.3478;Y275.67,x20.4621&…

CIE颜色空间LCh、Lab、XYZ-sRGB介绍与转换关系(包含源码)

项目场景: 提示:在颜色科学中,LCh和Lab是比较常用的 LCh是由MATLAB计算出的数据,但是我所需要在Qt的q3dsurface绘制出这个切面,看了Qt官方Examples,墨西哥草帽算法的3D模型就是由XYZ组成的。所以我需要LC…

RGB和CIELAB颜色空间转换及偏色检测

RGB转为CIELAB 首先RGB是不可以直接转为CIELAB颜色空间的,RGB需要先转为CIEXYZ颜色空间,然后再由CIEXYZ颜色空间转为CIELAB颜色空间。关于这2个颜色空间的互转,主要参考了http://www.cnblogs.com/Imageshop/archive/2013/02/02/2889897.html…

sRGB转CIEXYZ转CIELAB,以及色彩距离

sRGB是标准色彩空间 是一个微软和惠普于1996年定义的标准色彩空间 如果想从sRGB转到CIEXYZ空间,要乘以这个矩阵: 得到CIEXYZ之后,可以再转成CIELAB: 其中 X 0 , Y 0 , Z 0 X_0, Y_0, Z_0 X0​,Y0​,Z0​是定义的参考白点&#…

深入理解color model(颜色模型)

什么是颜色 Wiki是这样说的:颜色或色彩是通过眼、脑和我们的生活经验所产生的一种对光的视觉效应。嗯,简单点说,颜色就是人对光的一种感觉,由大脑产生的一种感觉。感觉是一个很主观的东西,你怎么确定你看到的红色和我…

深度学习AI美颜系列---肤色相似度计算(CIELAB色差计算)

深度学习AI美颜系列---肤色相似度计算(CIELAB色差计算) 在AI美颜中,经常会用到肤色相似度计算,如何实现这个算法? 步骤如下: 1,人脸皮肤分割; 2,对人脸皮肤分割结果进…

彩色图像--色彩空间 CIELAB、CIELUV

学习DIP第65天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro 更多图像处理机器学习内…