降采样数字滤波器-MATLAB建模

用于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所示。
CIC Decimation模块设置图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所示。
CIC Compensation Decimator模块设置图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的时序输出,相移以及每个周期波形不一致是正常的。
Scope输出图5 Scope时序输出

下图为调制器输出PSD图。
调制器输出PSD
图6 调制器输出PSD图

下图是数字滤波器最后一级(半带滤波器)输出数据的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:舍弃点数,这个越到后级舍弃的越多,因为滤波器在计算时会有一些没用的点,不舍弃结果会变差,需要试一下。

PSD设置
图8 PSD设置

数据处理

因为用verilog实现的时候不能用小数实现,所以要对得到的滤波器系数进行放大,但要在资源和精度之间折衷。这里用MATLAB 代码实现各个模块,然后对其参数进行调整后用Simulink中的模型实现新的滤波器,对比得到的滤波器功能是否符合要求。
先大概介绍一下用到的信息从哪找:

  1. 以图3为例,点击右下角的View Filter Respond,能得到对应的响应图,如图9所示为CIC补偿滤波器的响应。红色方框里面的选项可以查看相应的信息,这里主要关注滤波器系数,点击后得到图10。
  2. 点图3界面的帮助键,会跳转到官方提供的帮助文档,每一个模块其实都对应一个函数,可以在帮助文档中找到用的是哪个函数,转移到MATLAB中实现更方便处理参数。图3用的函数是dsp.CICCompensationDecimator。
    响应图9 CIC补偿滤波器响应

CICcom系数
图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所示设置参数。
FIR设置图11 FIR Decimation模块设置

对应的Filter Respond如图12所示。
FIR响应图12 FIR Decimation响应

可以看到和图9有不一致的地方。同理将半带滤波器也用FIR Decimation模块代替(CIC梳状滤波器不需要的原因是它的系数都是±1,不需要处理),得到的可以用Verilog代码实现的滤波器参数。将CIC Compensation Decimator和半带滤波器模块用FIR Decimator代替,得到的结构如图13所示。运行后得到的PSD输出如图14所示。
总体结构图13 参数调整后的整体结构

PSD输出2
图14 输出PSD图

可见,相较于图7的17.11dB的ENOB,17.04dB只下降了一点,在可接受范围内,但是这样FIR Filter的系数较大,Verilog实现的时候要位宽较大的寄存器存储数据,可以继续调整系数大小,在可接受范围内使其所需资源减少。

  • 10
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
以下是M通道过采样图滤波器组的matlab代码: % M通道过采样滤波器组 clear all; close all; % 参数设置 M = 4; % M通道数 T = 1; % 采样周期 fs = M/T; % 采样频率 f0 = 0.2; % 基带信号频率 f1 = 0.4; % 通带截止频率 f2 = 0.5; % 阻带截止频率 Apass = 1; % 通带最大衰减量 Astop = 40; % 阻带最小衰减量 % 计算滤波器参数 delta_f = (f2-f1)/(2*M); % 每个通道的带宽 fc = f1+delta_f; % 第一个通道的中心频率 h = fir1(32,fc/fs*2); % 理想低通滤波器设计 h = h.*kaiser(length(h),2.5)'; % 应用kaiser窗口 H = zeros(M,length(h)); % 滤波器组系数矩阵 for i = 1:M H(i,:) = h.*exp(-1j*2*pi*(i-1)*delta_f*T*(-length(h)/2:length(h)/2-1)/length(h)); % 计算每个通道的滤波器系数 end % 生成输入信号 t = 0:T:2*pi; x = cos(2*pi*f0*t); y = zeros(1,length(x)*M); % 过采样后的信号 for i = 1:M y(i:M:end) = x; % 每M个采样点插入一个原始信号采样点 end % 过滤器组滤波 yf = zeros(M,length(y)); % 每个通道的输出信号 for i = 1:M yf(i,:) = filter(H(i,:),1,y); % 按通道滤波 end % 降采样 xd = zeros(1,length(x)); % 降采样后的信号 for i = 1:M xd = xd+yf(i,M:M:end); % 取每个通道的第M个采样点 end % 绘制图形 figure; subplot(3,1,1); plot(t,x); title('原始信号'); xlabel('时间'); ylabel('幅度'); subplot(3,1,2); plot(0:T:(length(y)-1)*T,y); title('过采样信号'); xlabel('时间'); ylabel('幅度'); subplot(3,1,3); plot(0:T:(length(xd)-1)*T,xd); title('恢复信号'); xlabel('时间'); ylabel('幅度');

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值