CIC滤波器的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'频谱会显示错位endcicout = step(Hd,x_in_t);%官方提供的cicout = Hd(x_in_t)会一直报错,这是推荐的另一种调用方法y_out = step(CICCompDecim,cicout);figuref = 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滤波器幅度响应以及补偿后幅度响应如下图
仿真结果如下图
通过官方cic函数实现效果和通过系统函数法设计的实现效果基本一致,有点问题是关于补偿后会出现很多类似滤波器频谱响应波形的频谱还不清楚什么原因,恳请各位指教!