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
\]

其中,\(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

Matlab 设计仿真CIC滤波器的更多相关文章

  1. 使用MATLAB设计FIR滤波器

    1.      采用fir1函数设计,fir1函数可以设计低通.带通.高通.带阻等多种类型的具有严格线性相位特性的FIR滤波器.语法形式: b = fir1(n, wn) b = fir1(n, wn ...

  2. CIC滤波器

    CIC滤波器是滑动平均滤波器的非常高效的迭代实现,只需要一个减法和一个加法,而滑动平均需要N-1个加法. cic滤波器相当于一个梳状滤波器y(n)=x(n)-x(n-D),H(z)=1-z-D,和一个 ...

  3. MATLAB设计模糊控制器并用simulink仿真

    一.设计模糊控制器1.1 创建项目文件夹在此路径如图 1.2 打开MATLAB打开MATLAB R2012a切换当前目录为上一步路径,如图 1.3 设计模糊控制器打开模糊控制器设计对话框 根据模糊控制 ...

  4. Matlab 高斯_拉普拉斯滤波器处理医学图像

    前言:本程序是我去年实现论文算法时所做.主要功能为标记切割肝脏区域.时间有点久,很多细节已经模糊加上代码做了很多注释,因此在博客中不再详述. NOTE: 程序分几大段功能模块,仔细阅读,对解决医学图像 ...

  5. matlab数据流仿真和时间流仿真

    simulink 使用的动态系统仿真,仿真需要求状态方程和输出方程,关键是求状态方程,而状态方程的求解有多种算法,可变步长和定步长,所以仿真时对求解器的选择和步长的设置就比较重要. 所谓基於数据流的仿 ...

  6. 声反馈抑制使用matlab/simulink仿真

    第一份工作时做啸叫抑制的仿真,调大0.3可以有大的啸叫产生,下图的SIMULINK仿真模型 实现移相有多种方法: 1.iir实现 2.FFT实现 3.使用FIR实现 所有信号均可以由正弦信号叠加而成.

  7. Matlab/Simulink仿真中如何将Scope转化为Figure?

    1.只需要在运行仿真后,在命令窗口内输入: ,'ShowHiddenHandle','on'); set(gcf,'menubar','figure'); scope最上方会出现一个菜单栏,选择Too ...

  8. matlab中实现Gabor滤波器

    1.spatialgabor.m描述gabor函数 % SPATIALGABOR - applies single oriented gabor filter to an image%% Usage: ...

  9. 二阶环路滤波器的matlab 设计

    clc; Rs=10*10^6; %码速率 es=0.707; %阻尼系数 fs=8*10^6; %采样频率.系统时钟频率 Bit_Loop_out=27;%环路滤波器输入输出位宽 N=31; %NC ...

  10. matlab 与 modelsim 联调 cic抽取滤波器

    注:本设计的参数为:D=2,R=5,N=3:时钟频率为50mhz,输入信号为有符号8位,根据公式bmax=bin+N*log(2,R*D):可以得到bmax=18: 1,cic抽取滤波器原理 网上资料 ...

随机推荐

  1. gitlab docker升级报错

    背景 使用docker部署gitlab(9.5.4)后,发现合并代码有问题 日志: 看gitlab官网此问题已修复,由于上传了一批代码,又懒得重建,决定对gitlab升级 docker启动命令: do ...

  2. 【Netty实战】1~3章学习笔记

    1. Netty总体结构 1.1 Netty简介 ​ Netty是一款用于创建高性能网络应用程序的高级框架.它的基于 Java NIO 的异步的和事件驱动的实现,保证了高负载下应用程序性能的最大化和可 ...

  3. 4.4 x64dbg 绕过反调试保护机制

    在Windows平台下,应用程序为了保护自己不被调试器调试会通过各种方法限制进程调试自身,通常此类反调试技术会限制我们对其进行软件逆向与漏洞分析,下面是一些常见的反调试保护方法: IsDebugger ...

  4. 【Shell】函数

    函数 1.语法 函数定义语法如下: [ function ] funname [()] { action; [return int;] } 说明 : 函数定义时,function 关键字可有可无. 函 ...

  5. ZEGO即构自建MSDN有序网络,为实时音视频传输极致顺畅!

    由于疫情反扑,音视频云通讯的使用需求再次增加,跨机房环境经常遇到网络通信质量不佳的问题,比如延迟.卡顿.画质不清晰等.网络状况是影响用户体验最大因素之一,因此提升用户网络体验的需求被各家产品highl ...

  6. Linux 上 KVM 虚拟机网络问题

    通过控制台连接虚拟机,ping自己的ip,ping宿主机的ip,ping同网段的ip 1. 自己的ip也不通,先检查网络配置 2. 宿主机的ip不通,就要确认下虚拟机网卡的类型 对于macvlan网卡 ...

  7. zabbix 中 net.if.out 值来源及persecond的计算

    使用脚本记录每秒的net.if.out值,与zabbix中的lastdata值做对比,发现对不上. #!/bin/bash dev=eth0 get_dev_net_speed() { dev_inf ...

  8. RedHat8静默安装was

    前言 was(websphere application server),类似weblogic.tomcat,由IBM开发的一种企业级Java容器. 系统版本:redhat 8.2 was版本:was ...

  9. windows和linux键值表

    windows系统下对应键值 {8,KEY_BACKSPACE}, {9,KEY_TAB}, {13,KEY_ENTER}, {16,KEY_LEFTSHIFT}, {17,KEY_LEFTCTRL} ...

  10. 2.go语言基础类型漫游

    本篇前瞻 本篇是go语言的基础篇,主要是帮助大家梳理一下go语言的基本类型,注意本篇有参考go圣经,如果你有完整学习的需求可以看一下,另外,go语言的基本类型比较简单,介绍过程就比较粗暴. 基本类型 ...