目录
1.CIC滤波器原理
CIC滤波器即积分梳状滤波器(CIC,Cascaded Integrator Comb),用作低通滤波器常与抽取和内插级联,CIC滤波器结构简单没有乘法器,只有加法器资源消耗少,运算效率高,因此同半带滤波器常用在上变频或下变频中。
单级内插CIC滤波器结构:
图中滤波器所处的位置与前所诉一致,即抽取前滤波,内插后滤波。
图中的积分器是单极点的IIR滤波器,反馈系数为1,状态方程和传输函数如下:
z(n)=z(n-1)+x(n) H1(z)=1/(1-z^-1)
图中的梳状滤波器则是一个FIR滤波器,其状态方程和传输函数如下:
y(n)=z(n)-z(n-D) H2(z)=1-z^-D
D为延迟单位,一般D等于抽取和内插倍数M。
则单级CIC滤波器的传输函数:
H(z)= H1(z)* H2(z)=( 1-z^-D)/ (1-z^-1)
传输函数也可通过冲激响应的z变换求得,冲激响应h(n):
h(n)=1 0<=n<=D-1;
h(n)=0 其他
对其进行z变换得到:
还可用传递函数=输出的z变换/输入的z变换来求,H(z)表示系统频响特征。根据传递函数求得的幅频和相位响应如下:
CIC滤波器的幅频响应是近似与Sinc函数且具有线性相位。冲激幅频相位响应:
由上图可知,CIC滤波器会给带内信号带来信号损失即插损,可以级联一个CIC补偿滤波器进行补偿,补偿滤波器的幅频响应近似为反sinc函数可据此设计。积分器为不稳定系统还需注意积分溢出的问题。[直流分量]
多级抽取CIC滤波器结构:
线性时不变系统可对其进行位置变换:
2.CIC滤波器的设计
设计一个信号的频率包含300Khz和500Khz,采样率为16Mhz,设计一个抽取率为8倍的2级cic滤波器,使用filter designer工具设计如下:
根据设计参数自实现积分器和梳状滤波器,将信号输入到matlab函数和自实现CIC滤波器中对比,结果一致:
3.完整matlab工程代码
文件:cic_sim.m
%------------------------------------------------------------------------
%------------------------------------------------------------------------
%------------------------------------------------------------------------
close all;
clc;
%-------------------------------------------------------------------------
%-------------------------------------------------------------------------
%-------------------------------------------------------------------------
sin_f0=300000;%构造一个300KHz频率的正弦信号y0
sin_f1=500000;%构造一个500KHz频率的正弦信号y1
Fs=16000000;%采样率为16MSPS
N=8192;
n=0:N-1;
time=n/Fs;
y0=sin(2*pi*sin_f0*time);
y1=sin(2*pi*sin_f1*time);
y=y0+y1;%将300KHz的信号500KHz的信号相加,生成包含两个频率分量的原始信号
%-------------------------------------------------------------------------
%-------------------------------------------------------------------------
%-------------------------------------------------------------------------
base_len = length(y);
f_label = zeros(1,base_len);%将采样点换算频域横坐标轴--频率
for i = 1:base_len
f_label(i) = i*Fs/base_len;
end
y_len = base_len/8;
y_label = zeros(1,y_len);%将采样点换算频域横坐标轴--频率
for i = 1:y_len
y_label(i) = (i*Fs/8)/y_len;
end
%-------------------------------------------------------------------------
%-------------------------------------------------------------------------
%-------------------------------------------------------------------------
base_sig = y;
base_fft = abs(fft(base_sig));
figure(1);
subplot(6,1,1);
plot(base_sig(1:1024),'b');grid;%观察原始信号的时域波形
title('原始时域信号');
subplot(6,1,2);
plot(f_label,base_fft,'b');grid;%观察原始信号的频域波形
title('原始频域信号');
%---------------------------------------------------------------------------
%---------------------------------------------------------------------------
%---------------------------------------------------------------------------
CFs=1;
CAstp=0.2;
CFp=0.4;
hcic = design(fdesign.decimator(8,'cic',1, CFp, CAstp, CFs),'SystemObject',true);
src = dsp.SignalSource(base_sig',128);
fir_out = zeros(N/8);
for i = 1 : N/128
fir_out((i-1)*16+1:i*16) = hcic(src());%将原始信号通过APP设计的滤波器函数
end
fir_offt = abs(fft(fir_out));
subplot(6,1,3);
plot(y_label,fir_offt,'b');grid;%观察通过滤波器后的输出信号的频谱
title('过函数CIC滤波器频域信号');
subplot(6,1,4);
plot(fir_out(1:128),'b');grid;%观察通过滤波器后的输出信号
title('过函数CIC滤波器时域信号');
%--------------------------------------------------------------------------
%--------------------------------------------------------------------------
%--------------------------------------------------------------------------
cic_i1 = zeros(1,N);
cic_i2 = zeros(1,N);
for i=2:N
cic_i1(i) = cic_i1(i-1)+base_sig(i);
end
% for i=2:N
% cic_i2(i) = cic_i2(i-1)+cic_i1(i);
% end
cic_i2 = cic_i1;
cic_c1 = zeros(1,N);
cic_c2 = zeros(1,N);
for i=9:N
cic_c1(i)=cic_i2(i)-cic_i2(i-8);
end
% for i=9:N
% cic_c2(i)=cic_c1(i)-cic_c1(i-8);
% end
cic_c2 = cic_c1;
cic_d = zeros(1,N/8);
for i=1:N/8
cic_d(i) = cic_c2(i*8);
end
cic_fft = abs(fft(cic_d));
subplot(6,1,5);
plot(y_label,cic_fft,'b');grid;%观察通过滤波器后的输出信号的频谱
title('自实现CIC滤波器频域信号');
subplot(6,1,6);
plot(cic_d(1:128),'b');grid;%观察通过滤波器后的输出信号
title('自实现CIC滤波器时域信号');
%---------------------------------------------------------------------------
%---------------------------------------------------------------------------
%---------------------------------------------------------------------------
%积分器和梳状滤波器/微分器的幅频曲线和相位曲线,D=8
%积分器:H1(z)=1/(1-z^-1)
%梳状滤波器:H2(z)=1-z^-D
%CIC滤波器:H3(z)=(1-z^-D)/(1-z^-1)
figure(2);
b1=[0,1];%分子
a1=[-1,1];%分母
h1=freqz(b1,a1,500);
subplot(6,1,1);
plot(abs(h1),'b');grid;
title('积分器的幅频响应');
subplot(6,1,2);
plot(angle(h1),'b');grid;
title('积分器的相位响应');
b2=[-1,0,0,0,0,0,0,0,1];
a2=[0,0,0,0,0,0,0,0,1];
h2=freqz(b2,a2,500);
subplot(6,1,3);
plot(abs(h2),'b');grid;
title('微分器的幅频响应');
subplot(6,1,4);
plot(angle(h2),'b');grid;
title('微分器的相位响应');
b3=[-1,0,0,0,0,0,0,0,1];
a3=[0,0,0,0,0,0,0,-1,1];
h3=freqz(b3,a3,500);
subplot(6,1,5);
plot(abs(h3),'b');grid;
title('CIC的幅频响应');
subplot(6,1,6);
plot(angle(h3),'b');grid;
title('CIC的相位响应');
文件:cic_fir.m
function Hd = cic_fir
%CIC_FIR Returns a multirate filter object.
% MATLAB Code
% Generated by MATLAB(R) 9.7 and DSP System Toolbox 9.9.
% Generated on: 17-Dec-2021 13:28:05
decf = 8; % Decimation Factor
diffd = 1; % Differential Delay
numsecs = 2; % Number of Sections
Hd = dsp.CICDecimator( ...
'DecimationFactor', decf, ...
'DifferentialDelay', diffd, ...
'NumSections', numsecs);
% [EOF]