ΣΔ(Sigma-Delta,中文常译为“Σ-Δ”或“Σ-Δ调制”)数字滤波,是基于ΣΔ调制器(Sigma-Delta Modulator)原理发展出来的一种数字信号处理技术,广泛应用于高精度ADC(模数转换器)或DAC(数模转换器)中。它结合了噪声整形和过采样的思想,能在较低成本下实现高分辨率的信号转换。
一、ΣΔ调制简介
基本原理:
Σ(积分器):累加输入信号,使其频谱中的低频部分放大;
Δ(差分器):取当前信号与量化后的信号差值形成负反馈;
量化器:通常是1-bit或低位数ADC;
噪声整形:量化误差被推移到高频部分。
特点:
把量化噪声从低频“推”到高频;
高频噪声在后续可以通过低通滤波器有效滤除;
特别适用于音频、传感器、仪器采集等高精度信号处理。
二、ΣΔ 数字滤波常用结构
ΣΔ调制器之后,必须接数字低通滤波器,起到:
把有用信号频段保留下来;
滤除高频的量化噪声;
实现抽取(降采样)操作。
常见的数字滤波结构:
CIC滤波器(Cascaded Integrator-Comb):
结构简单,仅由加法器和延迟单元组成;
不需要乘法器,适合FPGA、DSP硬件实现;
常用于ΣΔ调制器后的第一层滤波+降采样。
FIR滤波器(有限冲击响应):
精度高,可设计出理想响应;
适用于进一步细化频率选择性;
通常放在CIC滤波器之后作为“修正”滤波器。
三、ΣΔ数字滤波系统框图
模拟输入
│
[ ΣΔ调制器 ] → 1-bit高速数据流
│
[CIC滤波器] → 降采样 + 初级低通
│
[FIR滤波器] → 滤除剩余高频噪声
│
数字输出(低速、高分辨率)
四、应用场景
音频采集与播放(如24-bit音频DAC)
工业传感器(如压力、温度等)
医疗设备(ECG、EEG 等信号采集)
精密仪器(如示波器、数据采集卡)
🧠 示例目标:
模拟一个低频信号(如正弦波),经过一阶 ΣΔ 调制器,再经过一个简单的 CIC 滤波器和降采样,最后输出数字信号。
🧩 C 语言示例代码
#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 连接,用于声音/控制应用。