Σ∆ 数字滤波

ΣΔ(Sigma-Delta,中文常译为"Σ-Δ"或"Σ-Δ调制")数字滤波,是基于ΣΔ调制器(Sigma-Delta Modulator)原理发展出来的一种数字信号处理技术,广泛应用于高精度ADC(模数转换器)或DAC(数模转换器)中。它结合了噪声整形过采样的思想,能在较低成本下实现高分辨率的信号转换。


一、ΣΔ调制简介

基本原理:
  • Σ(积分器):累加输入信号,使其频谱中的低频部分放大;

  • Δ(差分器):取当前信号与量化后的信号差值形成负反馈;

  • 量化器:通常是1-bit或低位数ADC;

  • 噪声整形:量化误差被推移到高频部分。

特点:
  • 把量化噪声从低频"推"到高频;

  • 高频噪声在后续可以通过低通滤波器有效滤除;

  • 特别适用于音频、传感器、仪器采集等高精度信号处理。


二、ΣΔ 数字滤波常用结构

ΣΔ调制器之后,必须接数字低通滤波器,起到:

  • 把有用信号频段保留下来;

  • 滤除高频的量化噪声;

  • 实现抽取(降采样)操作。

常见的数字滤波结构:
  1. CIC滤波器(Cascaded Integrator-Comb)

    • 结构简单,仅由加法器和延迟单元组成;

    • 不需要乘法器,适合FPGA、DSP硬件实现;

    • 常用于ΣΔ调制器后的第一层滤波+降采样。

  2. FIR滤波器(有限冲击响应)

    • 精度高,可设计出理想响应;

    • 适用于进一步细化频率选择性;

    • 通常放在CIC滤波器之后作为"修正"滤波器。


三、ΣΔ数字滤波系统框图

复制代码
模拟输入
   │
[ ΣΔ调制器 ] → 1-bit高速数据流
   │
[CIC滤波器] → 降采样 + 初级低通
   │
[FIR滤波器] → 滤除剩余高频噪声
   │
数字输出(低速、高分辨率)

四、应用场景

  • 音频采集与播放(如24-bit音频DAC)

  • 工业传感器(如压力、温度等)

  • 医疗设备(ECG、EEG 等信号采集)

  • 精密仪器(如示波器、数据采集卡)


🧠 示例目标:

模拟一个低频信号(如正弦波),经过一阶 ΣΔ 调制器,再经过一个简单的 CIC 滤波器和降采样,最后输出数字信号。


🧩 C 语言示例代码

cpp 复制代码
#include <stdio.h>
#include <math.h>

#define PI 3.14159265358979323846
#define SAMPLE_RATE  100000   // 原始过采样率(100kHz)
#define DECIMATION   100      // 抽取比
#define OUTPUT_RATE  (SAMPLE_RATE / DECIMATION)
#define INPUT_FREQ   1000     // 输入信号频率

#define DURATION_SEC 1
#define TOTAL_SAMPLES (SAMPLE_RATE * DURATION_SEC)

// --- ΣΔ调制器状态变量 ---
double integrator = 0.0;
double quantizer_out = 0.0;

// --- CIC滤波器状态变量 ---
long cic_integrator = 0;
long cic_comb = 0;
long last_comb_input = 0;

// --- 一阶Sigma-Delta调制器 ---
int sigma_delta_modulate(double input)
{
    integrator += input - quantizer_out;
    quantizer_out = (integrator >= 0) ? 1.0 : -1.0;
    return (quantizer_out > 0) ? 1 : 0;  // 输出1或0
}

// --- 简单的CIC滤波器(积分器+微分器) ---
long cic_filter(int bit)
{
    // 积分器
    cic_integrator += (bit ? 1 : -1); // 1-bit输入转为±1

    // 每 DECIMATION 次,进行一次抽取 + 微分器
    static int count = 0;
    count++;
    if (count >= DECIMATION) {
        count = 0;
        long out = cic_integrator - last_comb_input;
        last_comb_input = cic_integrator;
        return out;
    }
    return 0x7FFFFFFF;  // 标志:不是有效输出
}

int main(void)
{
    for (int i = 0; i < TOTAL_SAMPLES; i++) {
        double t = (double)i / SAMPLE_RATE;
        double input_signal = 0.5 * sin(2 * PI * INPUT_FREQ * t);  // 模拟输入信号,振幅 -0.5~0.5

        int bit_out = sigma_delta_modulate(input_signal);

        long filtered = cic_filter(bit_out);
        if (filtered != 0x7FFFFFFF) {
            // 打印降采样后的输出
            printf("%ld\n", filtered);
        }
    }

    return 0;
}

🚀 输出说明:

  • 输出是模拟信号经过 ΣΔ 调制器后得到的 1-bit 比特流 ,再通过一个 积分-微分(CIC)滤波器 ,完成降采样低通滤波

  • 输出打印的是低频恢复的模拟量值(整数形式);

  • 可在 Python 或 Excel 中对其进行绘图,查看恢复的波形形状。


🛠 可改进方向(进阶):

  • 多阶 ΣΔ(比如二阶)调制器;

  • 更复杂的数字滤波器(如FIR);

  • 实时输入(ADC采样),配合DMA;

  • 输出与 DAC 连接,用于声音/控制应用。

相关推荐
XZSSWJS3 分钟前
机器学习基础-day06-TensorFlow线性回归
人工智能·机器学习·tensorflow
一枝小雨3 分钟前
【OJ】C++ vector类OJ题
数据结构·c++·算法·leetcode·oj题
代码青铜15 分钟前
【实战指南】Cursor前端+Zion后端:10分钟打造能收款的AI商业应用MVP
前端·人工智能
Tisfy15 分钟前
LeetCode 3516.找到最近的人:计算绝对值大小
数学·算法·leetcode·题解
自信的小螺丝钉15 分钟前
Leetcode 206. 反转链表 迭代/递归
算法·leetcode·链表
程序员陆通16 分钟前
用 Cursor AI 快速开发你的第一个编程小程序
人工智能·小程序
Geek 研究僧20 分钟前
大疆 Osmo 360:双 1 英寸 + 8K/50fps,改写全景相机市场格局
人工智能·数码相机·智能硬件·相机
Wilber的技术分享30 分钟前
【大模型实战笔记 1】Prompt-Tuning方法
人工智能·笔记·机器学习·大模型·llm·prompt
liliangcsdn34 分钟前
结合prompt分析NodeRAG的build过程
java·服务器·人工智能·数据分析·知识图谱
东方不败之鸭梨的测试笔记34 分钟前
LangChain: Models, Prompts 模型和提示词
人工智能·python·langchain