用于SD-ADC后级的降采样数字滤波器
说明
第六届集创赛芯海杯赛题对数字滤波器的要求不是很高,记录一下从Matlab搭建模型到Verilog HDL代码实现,到一部分后仿的过程。
Matlab-Simulink搭建模型
降采样数字滤波器由三级组成,第一级CIC抽取滤波器,第二级CIC补偿滤波器,第三级半带滤波器。调用Simulink SD Toolbox中的模块搭建模型。
搭建的模型如图1所示。
图1 降采样滤波器整体结构
从左到右第一个模块为Jittered SineWave,用来产生测试信号。第二级为SubSystem,里面是调制器的模型。本设计的调制器选择四阶前馈单比特量化调制器,OSR=256,子系统里面包含了不同的非理想因素。
CIC Decimation
CIC Decimation就是CIC降采样滤波器模块,其设置如图2所示。
图2 CIC Decimation模块设置
设置:
- Coefficient source:这里选择第一个选项,第二个选项是Filter Object,用的是另一种结构定义的滤波器,将在后面解释;
- Decimaton factor:降采样率为32;
- Differential delay:1;
- Number of sections:5,通常CIC梳状滤波器的section都选为调制器级数+1,所以这里级数是5;
- Data type specification mode:Full precision,暂时不考虑位数;
- Rate options:这里选择第一个选项,选择第二个选项的话,需要把前面的buffer去掉,可以正确运行到这一级,但是没办法连接下两级。
注意点:
- 需要在调制器输出和CIC梳状滤波器中间加一个buffer,否则运行不了,buffer设置Output buffer size为32(即CIC Decimation)的倍数就行;
- convert可以加也可以不加,如果运行过程中出现错误指明是data type错误就加一个。
CIC Compensation Decimator
CIC Compensation Decimator是CIC补偿滤波器,其设置如图3所示。
图3 CIC Compensation Decimator模块设置
设置:
- CIC filter to be compensated的设置和上面一样,用来描述补偿的滤波器;
- Decimation factor:设置为2,因为降采样率为2;
- Minimum order filter design:勾选就生成满足要求的最小阶数滤波器;
- Passband edge frequency:设置通带;
- Stopband edge frequency:设置阻带,这里没必要设置成1100左右的数,因为后级半带滤波器会进一步降采样,通带会变窄,这里如果过渡带设置得太小,会导致阶数过高,浪费资源;
- Passband ripple,Stopband attenuation:波纹以及衰减,通常都是这两个数;
- Input sample rate:调制器输出信号频率/32(上一级filter的降采样率)=这一级的输入采样率。
注意点:
- 同样地,在CIC Decimation模块和CIC Compensation Decimator模块之间要加一个buffer,否则运行不了,buffer设置Output buffer size为2的倍数。
FIR Halfband Decimator
FIR Halfband Decimator就是半带滤波器,其设置如图4所示。
图4 FIR Halfband Decimator模块设置
设置:
- Transition width:200,过渡带带宽设置为200Hz;
- Stopband attenuation:阻带衰减;
- Input sample rate:调制器输出信号频率/64。
注意点:
- 同样地,在FIR Halfband Decimator模块和CIC Compensation Decimator模块之间要加一个buffer,否则运行不了,buffer设置Output buffer size为2的倍数。
Simulink模型运行结果
下图显示的是Scope的时序输出,相移以及每个周期波形不一致是正常的。
图5 Scope时序输出
下图为调制器输出PSD图。
图6 调制器输出PSD图
下图是数字滤波器最后一级(半带滤波器)输出数据的PSD图。
图7 输出数据PSD图
注意点:
- PSD参数设置(如图8所示):
–Scope Number:用来设置每个PSD的编号;
–Sampling Frequency:输入信号频率,每一级要相应改变,这里显示的是调制器输出信号的采样频率,在MATLAB中有定义;
–Lower Band Bound:关心的频率范围的左边界,设置为0;
–Upper Band Bound:关心的频率范围的右边界,最后输出的信号最大频率是1000Hz,所以是1000Hz;
–Signal Frequency:信号发生(Jitter Sine Wave)的频率;
–Number of FFT Points:FFT点数:取2^N,通常取256,512,1024……
–Number of Transient Points:舍弃点数,这个越到后级舍弃的越多,因为滤波器在计算时会有一些没用的点,不舍弃结果会变差,需要试一下。
图8 PSD设置
数据处理
因为用verilog实现的时候不能用小数实现,所以要对得到的滤波器系数进行放大,但要在资源和精度之间折衷。这里用MATLAB 代码实现各个模块,然后对其参数进行调整后用Simulink中的模型实现新的滤波器,对比得到的滤波器功能是否符合要求。
先大概介绍一下用到的信息从哪找:
- 以图3为例,点击右下角的View Filter Respond,能得到对应的响应图,如图9所示为CIC补偿滤波器的响应。红色方框里面的选项可以查看相应的信息,这里主要关注滤波器系数,点击后得到图10。
- 点图3界面的帮助键,会跳转到官方提供的帮助文档,每一个模块其实都对应一个函数,可以在帮助文档中找到用的是哪个函数,转移到MATLAB中实现更方便处理参数。图3用的函数是dsp.CICCompensationDecimator。
图9 CIC补偿滤波器响应
图10 CIC补偿滤波器系数
MATLAB实现
用dsp.CICCompensationDecimator先生成对应的参数结构体,然后再进行扩大取整。
fs_ciccom = 8e3;
fPass_ciccom = 900;
fStop_ciccom = 3e3;
CICCompDecim1 = dsp.CICCompensationDecimator('CICDifferentialDelay', 1,...
'CICNumSections',5,...
'CICRateChangeFactor', 32,...
'DecimationFactor',2,...
'PassbandFrequency',fPass_ciccom, ...
'PassbandRipple', 0.01, ...
'StopbandFrequency',fStop_ciccom,...
'StopbandAttenuation', 100, ...
'SampleRate',fs_ciccom);
% fvtool(CICCompDecim1,'Analysis','freq');
coff_compen = coeffs(CICCompDecim1);
coff_ciccom = coff_compen.Numerator;
coff_ciccom_round = round(coff_ciccom * 2^11);
coff_ciccom_round就是处理过数据的参数,其结果是18个整数,用来生成滤波器。
Simulink实现
在Simulink中使用FIR Decimation模块并按照图11所示设置参数。
图11 FIR Decimation模块设置
对应的Filter Respond如图12所示。
图12 FIR Decimation响应
可以看到和图9有不一致的地方。同理将半带滤波器也用FIR Decimation模块代替(CIC梳状滤波器不需要的原因是它的系数都是±1,不需要处理),得到的可以用Verilog代码实现的滤波器参数。将CIC Compensation Decimator和半带滤波器模块用FIR Decimator代替,得到的结构如图13所示。运行后得到的PSD输出如图14所示。
图13 参数调整后的整体结构
图14 输出PSD图
可见,相较于图7的17.11dB的ENOB,17.04dB只下降了一点,在可接受范围内,但是这样FIR Filter的系数较大,Verilog实现的时候要位宽较大的寄存器存储数据,可以继续调整系数大小,在可接受范围内使其所需资源减少。