跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言算法

FPGA 实现 CIC 抽取滤波器

CIC(级联积分梳状)滤波器的原理与结构,包括积分器和梳状器的工作机制、最大位宽计算方法及级数对性能的影响。提供了基于 Verilog 的 FPGA 实现代码,包含 3 级积分器、16 倍抽取因子及顶层测试模块,并分析了不同抽取因子下的仿真波形,指出必要时需级联补偿 FIR 滤波器以改善通带衰减。

接口猎人发布于 2026/4/6更新于 2026/7/1660 浏览

一、什么是 CIC 滤波器

(一)CIC 滤波器原理和结构

CIC(级联积分梳状)滤波器是一种高效的多速率信号处理滤波器,属于无乘法器的线性相位 FIR 滤波器。常用于数字下变频(DDC)和数字上变频(DUC)中。其主要优点是不需要乘法器,结构简单,仅由加法器、减法器和寄存器组成。

CIC 滤波器有三种工作模式:

  • 抽取滤波器:数据流由高速输入变为低速输出,主要应用于数字下变频以及降低采样率的系统中。
  • 单纯滤波器:数据流速率不变,积分器和梳状器都工作在同一个采样率下,主要应用于移动平均滤波。
  • 插值滤波器:数据流由低速输入变为高速输出,主要应用于数字上变频以及提升采样率的系统中。

CIC 滤波器主要由积分器和梳状器组成。其中 N 为抽取倍数(抽取因子)。例如输入信号采样率为 100MHz,如果抽取因子为 10,那么降采样之后的信号速率就是 10MHz。即 F_out = F_in / 抽取因子。

由于单级 CIC 的第一旁瓣阻带衰减是固定的 13.46dB,无法很好地抑制旁瓣,因此可以通过级联的方式来提升抑制效果。根据实际旁瓣抑制需求可以实现单级、二级、三级等多级 CIC。

可以把 CIC 滤波器想象成一个多层过滤系统:

  • 一级(N=1):像一层纱网,能过滤掉一些大颗粒杂质。
  • 二级(N=2):在纱网后面再加一层更密的滤布,过滤效果更好。
  • 五级(N=5):相当于经过了五层不同精度的过滤,最后得到的液体非常纯净。

级数 N 越高,滤波效果越好,但系统的资源消耗和位宽增长也会增加。在数字下变频等应用中,N=5 或 N=6 是非常常见的选择。

假设数据以 Fs 的频率输入滤波器,数据先通过 N 级的积分滤波器一直进行累加。假如希望得到 Fs 的 N 分频的采样数据,将积分滤波器的最后一级输出以 Fs/N 的频率进入梳状滤波器。梳状滤波器其实是微分运算,即当前值减去上一次的值。经过 N 次的梳状滤波器,最后 1 级的结果即为抽取的数值。

(二)最大位宽计算

CIC 滤波器中计算存在加减法操作,需要考虑计算过程中信号位宽的问题。由于积分器的累加效应,内部数据位宽会随着级数 N 线性增长。

最大位宽计算公式如下: B_max = B_in + N * ceil(log2(R * M))

  • B_in:输入位宽
  • R:抽取/插值因子
  • M:差分延迟(通常为 1)

例子:假设 B_in=16 位,R=64,M=1,ceil(log2(64)) = 6。

  • 当 N=3 时,最大位宽 = 16 + 3*6 = 34 位
  • 当 N=5 时,最大位宽 = 16 + 5*6 = 46 位
  • 当 N=6 时,最大位宽 = 16 + 6*6 = 52 位

可以看到,级数每增加一级,位宽就会显著增加,消耗更多的寄存器、逻辑和布线资源。

级数 N 对滤波器性能的影响:

  1. 阻带抑制(抗混叠/抗镜像性能):N 越高,阻带衰减越大,滤波器对带外信号的抑制能力就越强。
  2. 通带衰减(副作用):N 越高,通带内的衰减也越严重。为了补偿这种通带衰减,通常需要在 CIC 滤波器后面级联一个补偿 FIR 滤波器。

二、CIC 抽取滤波器 FPGA 实现

(一)Verilog 代码

以下 CIC 滤波器代码参数:级数 3,抽取因子 16。

`timescale 1ns /1ps
module cic_down_sample#(
    parameter DATA_IN_WIDTH = 8,
    parameter DATA_OUT_WIDTH = 8,
    parameter CIC_FACTORS = 16, // 抽取因子
    parameter MAX_WIDTH = 20 // 最大位宽
)(
    input clk,
    input rstn,
    input signed[DATA_IN_WIDTH-1:0] data_in,
    input data_in_valid,
    output signed[DATA_OUT_WIDTH-1:0] data_out
);

wire signed[MAX_WIDTH-1:0] add_data_0;
wire signed[MAX_WIDTH-1:0] add_data_1;
wire signed[MAX_WIDTH-1:0] add_data_2;
reg signed[MAX_WIDTH-1:0] data_0;
reg signed[MAX_WIDTH-1:0] data_1;
reg signed[MAX_WIDTH-1:0] data_2;
reg [4:0] cnt_div;
reg sample_flag; // 采样标志
reg signed[MAX_WIDTH-1:0] comb_in;
wire signed[MAX_WIDTH-1:0] add_comb_0;
wire signed[MAX_WIDTH-1:0] add_comb_1;
wire signed[MAX_WIDTH-1:0] add_comb_2;
reg signed[MAX_WIDTH-1:0] comb_0;
reg signed[MAX_WIDTH-1:0] comb_1;
reg signed[MAX_WIDTH-1:0] comb_2;

// 积分器
always @(posedge clk or negedge rstn) begin
    if(!rstn) begin
        data_0 <= 'd0;
        data_1 <= 'd0;
        data_2 <= 'd0;
    end else begin
        data_0 <= add_data_0;
        data_1 <= add_data_1;
        data_2 <= add_data_2;
    end
end
assign add_data_0 = {{12{data_in[7]}}, data_in} + data_0;
assign add_data_1 = add_data_0 + data_1;
assign add_data_2 = add_data_1 + data_2;

// 降采样处理
always @(posedge clk or negedge rstn) begin
    if(!rstn) begin
        cnt_div <= 'd0;
    end elseif(cnt_div == CIC_FACTORS - 1) begin
        cnt_div <= 'd0;
    end else begin
        cnt_div <= cnt_div + 1;
    end
end

always @(posedge clk or negedge rstn) begin
    if(!rstn) begin
        sample_flag <= 1'b0;
    end elseif(cnt_div == CIC_FACTORS - 1) begin
        sample_flag <= 1'b1;
    end else begin
        sample_flag <= 1'b0;
    end
end

// 梳状器
always @(posedge clk or negedge rstn) begin
    if(!rstn) begin
        comb_in <= 'd0;
    end elseif(sample_flag) begin
        comb_in <= add_data_2;
    end
end

always @(posedge clk or negedge rstn) begin
    if(!rstn) begin
        comb_0 <= 'd0;
        comb_1 <= 'd0;
        comb_2 <= 'd0;
    end elseif(sample_flag) begin
        comb_0 <= comb_in;
        comb_1 <= add_comb_0;
        comb_2 <= add_comb_1;
    end
end

assign add_comb_0 = comb_in - comb_0;
assign add_comb_1 = add_comb_0 - comb_1;
assign add_comb_2 = add_comb_1 - comb_2;
assign data_out = add_comb_2[19:12];

endmodule

顶层文件:

`timescale 1ns /1ps
module cic_top(
    input sysclk,
    input sysrstn
);

wire m_axis_data_tvalid;
wire signed[7:0] m_axis_data_tdata;
wire signed[7:0] data_out;

dds_compiler_0 dds(
    .aclk(sysclk),
    .m_axis_data_tvalid(m_axis_data_tvalid),
    .m_axis_data_tdata(m_axis_data_tdata)
);

cic_down_sample#(.DATA_IN_WIDTH(8), .DATA_OUT_WIDTH(8), .CIC_FACTORS(16), .MAX_WIDTH(20))u_cic_down_sample(
    .clk(sysclk),
    .rstn(sysrstn),
    .data_in(m_axis_data_tdata),
    .data_in_valid(m_axis_data_tvalid),
    .data_out(data_out)
);

endmodule

(二)仿真分析

级数:3,抽取因子:16

级数:3,抽取因子:8

可以看到抽取因子越小或级数越小时,CIC 抽取滤波器输出波形约平滑,因此必要时需级联一个补偿 FIR 滤波器。

目录

  1. 一、什么是 CIC 滤波器
  2. (一)CIC 滤波器原理和结构
  3. (二)最大位宽计算
  4. 二、CIC 抽取滤波器 FPGA 实现
  5. (一)Verilog 代码
  6. (二)仿真分析
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • CppCon 2024 学习:C++ 异常在小型固件中的应用
  • LLM Agent 零微调范式:ReAct 与 Self Ask
  • AI 提示词重构建议:提升代码可读性的实战指南
  • 从后端视角理解前端三基石:HTML、CSS 与 JavaScript
  • 基于 Python + Flask 的黑龙江旅游景点数据分析系统
  • C++ list 带头双向链表增删查改模拟实现
  • 91n 边缘计算设备部署轻量 TensorFlow 模型全流程
  • AI 在医疗领域的十大应用场景解析
  • Stable Diffusion WebUI 整合包安装与实战指南
  • 前端微前端架构:大型项目的解药还是新坑?
  • 字节跳动前端一面深度解析:React 原理与浏览器渲染
  • SubtitleEdit Purfview Faster Whisper XXL 引擎安装失败修复指南
  • OpenClaw 部署与 AI 股票交易策略自动化实现
  • 无人机视觉目标检测数据集 VisDrone 介绍与数据格式转换
  • RssHub 基于 Docker 部署及 cpolar 内网穿透实战
  • PyTorch 时序预测 Dataloader 构建:GRU 与 Shuffle 机制解析
  • Cookie 机制深度解析:原理、版本与局限
  • 基于 AutoGen 框架构建 AI Agent 实现自动化编程任务
  • PPO-VLA:强化学习如何提升机器人泛化能力
  • Python 爬虫开发与项目实战:从入门到精通指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online