CIC滤波器设计

CIC滤波器实现简单,资源消耗少(只需要加法器),成为变采样率系统中比较常用的滤波器,但也需要在合适的场景中使用,不然对信号质量会造成较大影响。

我们可以通过matlab的filter designer了解CIC滤波器的各种特性。通过图1和图2找到CIC滤波器设计窗口。

图1
图2

从幅频曲线中容易得出CIC滤器器通带平台性差,过渡带宽,带外抑制性能起伏较大。

CIC级数设计

带外抑制性能可以通过增加CIC级数(Number Of Sections)来提升,但这会对通带平坦性带来负面影响,具体设计CIC时需要折中该参数。

通常在C语言实现CIC时,可以将该参数设计为偶数,这样会使拖尾是一个整数,方便去掉数据首尾的无效值。更进一步,设计为2,4,8时,归一化可以直接通过移位实现。

CIC滤器使用场景

当我们使用CIC时,需要保证有用信号的fmax应足够小于fs/2/Mcic,其中Mcic为内插倍数。这样才能保证在有效带宽内足够的平坦度,一般fmax相对于直流衰减不能超过0.5dB.

所以在变速率系统中,CIC一般作为最后数字滤波器的前端(靠近模拟域),如上采样系统中信号先经过限带成型滤波器(低通FIR),HB滤器组,最后经过CIC到DAC速率。

下图为8倍上采样的图示。

图3

CIC在matlab中的使用

需要注意的是为了保证CIC前后信号时域采样点平均功率的一致性,在第一级CIC滤波器中没有做归一化,这部分增益正好可以补偿上采样插0带来采样点功率的损失。后续每一级都要做归一化,防止溢出。

clear;clc;close all;

%% load data symbols from RRC out,make sure fmax << fs/2/Mcic

load('zeroDataFilterOut.mat')  % 8x oversampling signal

symbPower = funCountPower(zeroDataFilterOut); % Power before filter

%% CIC filter for interpolate 8 times

Mcic = 8;

coefCic = ones(Mcic,1);

N = 4;      % number of CIC section

modDataZero8x = upsample(zeroDataFilterOut,Mcic);

txPower = funCountPower(modDataZero8x); % Power after zero insertion

%% filter

dataFilterTemp = conv(modDataZero8x,coefCic);  % First CIC section

for i = 1:N-1

    dataFilterTemp = conv(dataFilterTemp,coefCic)/Mcic;

end

tailLen = N*(Mcic-1)/2;

dataOut = dataFilterTemp(tailLen+1:end-tailLen);

outPower = funCountPower(dataOut);  % Power after filter

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容