Matlab 设计仿真CIC滤波器

本文介绍了如何在Matlab中使用CIC滤波器进行信号的25倍降采样,包括CIC滤波器的设计原理、系统函数、Matlab函数实现(如fdesign.decimator和dsp.CICDecimator),以及如何通过滤波器设计工具和Simulink进行仿真。着重强调了级联滤波器和补偿的重要性以避免高频混叠问题。
摘要由CSDN通过智能技术生成
2023.09.26

使用CIC滤波器用于降采样。同样的,CIC滤波器也适用于升采样。

参考连接:

[1] Matlab中CIC滤波器的应用dsp.cicdecimator张海军2013的博客-CSDN博客

[2] Matlab中CIC滤波器的应用 - 知乎 (zhihu.com)

[3] CIC filter及其matlab实现-CSDN博客

[4] 【ljelly原创】 Matlab实现抽取滤波器的设计(CIC) – MATLAB中文论坛 (ilovematlab.cn)

[5] 基于CIC抽取滤波器设计与实现 - 知乎 (zhihu.com)

[6] CIC抽取滤波器MATLAB仿真和FPGA实现_cic matlab-CSDN博客

[7] 数字信号处理——多速率信号处理-CSDN博客

进行CIC降采样滤波器设计,实现采样率从50kSPS降至2kSPS,25倍降采样。简单分析:要实现25倍降采样率,可以通过使用2个5倍降采样率的CIC串联实现,也可以使用1个25倍降采样率的CIC实现。具体分别使用几级滤波器需要按照需求和硬件支持调整,此处以常见和通用的3级CIC滤波器为例进行设计。

CIC滤波器的系统函数为

H(z) = (\sum_{n=0}^{M-1}z^{-n})^N = (\frac{1-z^{-M}}{1-z^{-1}})^N

$$
H(z) = (\sum_{n=0}^{M-1}z^{-n})^N = (\frac{1-z^{-M}}{1-z^{-1}})^N
$$

其中,M 为CIC滤波器长度,也是CIC滤波器的升/降采样倍率;N 为CIC滤波器级数。那么,其频率响应为

$$
H(e^{j \omega}) = \{ \frac{\sin\frac{\omega M}{2}}{\sin\frac{\omega}{2}} e^{-j\omega [(M-1)/2]} \}^N
$$

关于CIC数字滤波器的基本知识此处不做过多介绍,后续有计划会整理相关内容。

1. 使用函数设计

在Matlab中,有两个函数可以生成CIC滤波器。我们以CIC抽取滤波器为例,一个是fdesign.decimator,第二个是dsp.CICDecimator详细用法在上述参考链接[1]中有说明

下面使用 fdesign.decimator() 函数设计5倍降采样率CIC

 %-------------------------------------------------------
 % 参数设置
 Fs = 50e3;      % sample rate
 R = 5;          % decimator factor
 D = 1;          % differential delay
 Fp = 4e3;       % pass band
 Fstp = 5e3;     % stop band
 Ap = 0.1;       % attenuation in pass band
 Astp = 40;      % attenuation in stop band
 %-------------------------------------------------------
 ​
 %-------------------------------------------------------
 % 设计方法1: 设计单位增益CIC滤波器
 d1 = fdesign.decimator(R,'cic',D, Fp, Astp, Fs);
 hcic = design(d1);
 H1 = cascade(1/gain(hcic),hcic);
 d2 = fdesign.ciccomp(hcic.DifferentialDelay, ...
             hcic.NumberOfSections,Fp,Fstp,Ap,Astp,Fs/R);
 cic_comp = design(d2);
 %--------------------------------------------------------
 ​
 %-------------------------------------------------------------------------------
 % 设计方法2: 设计未做单位增益CIC滤波器
 % hcic = design(fdesign.decimator(R,'cic',D, Fp, Astp, Fs),'SystemObject',true);
 % cic_comp = design(fdesign.ciccomp(hcic.DifferentialDelay, ...
 %             hcic.NumSections,Fp,Fstp,Ap,Astp,Fs/R), 'SystemObject',true);
 %-------------------------------------------------------------------------------
 ​
 fvtool(H1,cic_comp,cascade(H1,cic_comp),'ShowReference','off','Fs',[Fs Fs/R Fs]) % 未做归一化处理
 legend('CIC Decimator','CIC Compensator','Resulting Cascade Filter');

下面使用 dsp.CICDecimator 函数设计5倍降采样率CIC

 Fs = 50e3;      % sample rate
 R = 5;          % decimator factor
 D = 1;          % differential delay
 N = 3;          % number of stage
 Fp = 0.05;      % pass band
 Fstp = 0.075;   % stop band
 Ap = 0.1;       % attenuation in pass band
 Astp = 60;      % attenuation in stop band
 ​
 CICDecim = dsp.CICDecimator(R, D, N);
 CICCompDecim = dsp.CICCompensationDecimator(CICDecim, ...
     'DecimationFactor',2,'PassbandFrequency',Fp, ...
     'StopbandFrequency',Fstp,'SampleRate',Fs/R);
 fvtool(CICDecim,CICCompDecim,...
 cascade(CICDecim,CICCompDecim),'ShowReference','off','Fs',[Fs Fs/R Fs])
 legend('CIC Decimator','CIC Compensator','Resulting Cascade Filter');

2. 使用工具箱设计

打开 filterDesigner 工具箱,两种方式:

  1. matlab 命令行输入>> filterDesigner 回车;

  2. matlab 主界面顶部 APP 选项卡,搜索 filterDesigner 打开。

打开后,进行CIC抽取滤波器设计:

  1. 主界面选择 : 创建多速率滤波器

  2. 类型选择: 抽取器

  3. 选择使用滤波器类型: 级联积分梳妆(CIC)滤波器

  4. 设置抽取因子: 5 (示例)

  5. 设置采样频率: 归一化与采样率都可以

  6. 设置积分延迟和节数(级数): 延迟一般设计为1 节数(级数)设计: 3

  7. 选择频响显示样式

  8. 创建滤波器

  9. 设计信息展示于左上角

  10. 定点化设计:根据带滤波信号的数据范围进行滤器定点化设计,特别是滤波器级联使用时

设计界面展示:

设计完成后,可以选择将滤波器导出为matlab函数经行调用使用,也可以选择直接导出HDL代码经行硬件仿真验证.

3. matlab 调用函数仿真

通过上述设计过程,已经得到了所使用的滤波器。下面进行滤波器效果仿真测试。

生成一段60 \ \text{Hz} + 270 \ \text{Hz} + 3200 \ \text{Hz} 采样率为50 \ \text{kSPS} 的混合正弦波信号;

可以通过连续使用两次上述设计的5倍降采样率的CIC滤波器,也可以使用一次25倍降采样率的CIC滤波器实现50 \ \text{kSPS} -> 2 \ \text{kSPS}降采样过程。

最终效果图:

在上述仿真结果中可以看到,当前滤波器参数设计情况加,发生了滤波后高频混叠显现,尤其是在未使用补偿滤波器情况下尤为严重。

这说明,在经行CIC滤波器设计的时候要考虑滤波效果和级联补偿滤波器的作用。

4. simulink 进行仿真

前面在说到可以从filterDesigner工具箱中导出以供使用的滤波器,其中一项为可以直接导出为simulink模型,可以导出为使用CIC滤波器模块的模型,也可以是使用基本模块组合成的CIC滤波器。

使用CIC滤波器模块的模型

使用基本模块组成的CIC滤波器模型

仿真模型如下

设置一个输入,观察效果

60+270+3200

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值