☰
三阶连续时间Delta-Sigma ADC的Matlab仿真与噪声整形设计
2026/10/18 3:22:14 网站建设 项目流程

简介:这是一份面向模拟集成电路与信号处理学习者的3阶连续时间Delta-Sigma ADC Matlab仿真代码,适合具备一定ADC理论基础、希望深入理解CTSDM架构与性能评估的工程师或研究生。资源包共10个文件,包含3个m脚本、3篇pdf参考论文、1个mdl Simulink模型、1个xlsx数据表、1个txt说明及1张png操作示意图,整体约3.14MB,覆盖时序仿真、频域分析与功率谱计算等核心环节。代码以3阶3位量化、20倍过采样、400MHz采样率为典型配置,可帮助读者观察积分器级联对量化噪声的整形效果,并借助FFT与功率谱密度评估信噪比和有效位数。配套论文与说明文档进一步补充了设计背景与参数依据,便于对照模型理解调制器行为。目前已有960人学习,适合作为ADC建模入门与性能验证的实践参考。

1. 三阶连续时间 Delta-Sigma ADC:为什么它比离散时间版本更难调

很多人第一次在 Matlab 里搭 Delta-Sigma ADC 模型时,都会选离散时间结构——开关电容、采样保持、差分方程,一切都干净利落。但一旦把场景切到连续时间,事情立刻变得玄学起来:环路滤波器不再是几个系数相乘,而是一组连续时间积分器;量化器前面那个采样器到底放在哪、反馈 DAC 的脉冲形状怎么定、环路延迟怎么补偿,每一个选择都会让噪声传递函数(NTF)偏离教科书上的理想曲线。三阶连续时间 Delta-Sigma ADC 之所以值得单独拿出来讲,是因为它把过采样、噪声整形、连续时间积分和反馈延迟这几个机制拧在了一起,任何一个环节理解不到位,仿真出来的频谱就会在某个频点突然翘起来,而你根本不知道是哪一级积分器在捣乱。这份 Matlab 仿真代码的价值,就在于它把这条从连续时间环路到离散等效模型的映射关系,用可运行的方式摊开给你看。

2. 连续时间环路滤波器:为什么积分器系数不能直接照搬离散时间

2.1 从 s 域到 z 域的等效变换

连续时间 Delta-Sigma 调制器的核心是一个连续时间环路滤波器,通常由级联的积分器构成。三阶结构意味着环路滤波器在 s 域有三个极点,理想情况下全部落在原点,形成三个级联的积分器。问题在于,量化器和反馈 DAC 是离散时间行为——量化器在每个时钟周期采样一次,DAC 在每个周期输出一个脉冲。这就导致整个系统是一个连续时间滤波器被离散时间事件打断的混合系统。

常见的做法是把这个混合系统等效成一个全离散时间的环路,方法是把连续时间积分器和反馈 DAC 的脉冲响应一起做脉冲不变变换或双线性变换。但这里有个坑:不同的 DAC 脉冲形状(不归零、归零、半延迟归零)会改变等效离散时间环路滤波器的系数。如果你直接拿离散时间 Delta-Sigma 的系数去套连续时间结构,等效出来的 NTF 零点位置会偏,带内噪声整形效果直接打折。

这份 Matlab 代码里,环路滤波器的连续时间系数和 DAC 脉冲形状是分开定义的,然后通过一个等效变换函数算出离散时间环路系数。这样做的好处是,你可以单独改 DAC 脉冲形状,观察 NTF 怎么变,而不需要重新推导整个环路。

% 连续时间三阶环路滤波器系数(s 域) % 积分器增益:k1, k2, k3 k1 = 0.5; k2 = 0.3; k3 = 0.2; % DAC 脉冲形状:1 = 不归零,2 = 归零,3 = 半延迟归零 dac_mode = 1; % 采样周期 Ts = 1e-6; % 根据 DAC 脉冲形状计算等效离散时间环路系数 % 这里用脉冲不变变换的近似形式 switch dac_mode case 1 % 不归零 % 不归零脉冲的等效系数需要补偿半个周期的延迟 a1 = k1 * Ts; a2 = k2 * Ts; a3 = k3 * Ts; case 2 % 归零 % 归零脉冲等效系数减半 a1 = k1 * Ts / 2; a2 = k2 * Ts / 2; a3 = k3 * Ts / 2; case 3 % 半延迟归零 a1 = k1 * Ts * 0.75; a2 = k2 * Ts * 0.75; a3 = k3 * Ts * 0.75; end

这段代码的关键在于dac_mode这个参数。不归零脉冲意味着 DAC 在整个采样周期内都输出当前量化结果,这会在环路里引入半个周期的额外延迟;归零脉冲在每个周期后半段强制输出为零,减少了延迟但增加了量化噪声的带内分量;半延迟归零则是折中方案。代码里用简单的比例因子来近似这种影响,实际推导需要做积分运算,但作为仿真模型的起点,这个近似已经能让你看到系数变化的趋势。

2.2 环路延迟补偿为什么是必须的

连续时间 Delta-Sigma 调制器里有一个绕不开的问题:量化器从采样到输出有延迟,DAC 从接收到量化结果到输出脉冲也有延迟。这些延迟在环路里累积,会吃掉相位裕度,严重时直接让 NTF 在带内出现峰值,噪声整形失效。

常见的补偿手段是在反馈路径里插入一个额外的延迟,或者调整积分器的系数来抵消。这份 Matlab 代码里,环路延迟是通过一个显式的延迟参数来建模的,你可以把它设成 0、0.5 个周期或 1 个周期,然后观察输出频谱的变化。当延迟设为 0.5 个周期时,等效离散时间环路系数需要做相应的旋转补偿,否则 NTF 的零点会偏离单位圆。

% 环路延迟(单位:采样周期) loop_delay = 0.5; % 补偿后的等效离散时间系数 % 延迟会导致系数向量旋转 if loop_delay > 0 % 用旋转因子补偿延迟 rot = exp(-1j * 2 * pi * loop_delay * (0:2)); a1 = a1 * rot(1); a2 = a2 * rot(2); a3 = a3 * rot(3); end

这里的旋转因子补偿是一种频域近似,实际连续时间系统里延迟的影响是非线性的,但在过采样率较高时,这种近似足够让 NTF 保持在合理范围内。如果你把loop_delay设成 1 个周期而不做补偿,仿真出来的频谱会在低频段出现明显的抬升,这就是延迟吃掉相位裕度的直接证据。

3. 量化器与反馈 DAC:噪声整形到底是怎么被“塑”出来的

3.1 量化噪声的线性化模型

Delta-Sigma 调制器的噪声整形能力,建立在把量化器近似成一个加性白噪声源的基础上。这个近似在量化台阶足够小、输入信号变化足够快时成立。三阶连续时间结构里,量化噪声经过环路滤波器的整形,传递函数变成 NTF = 1 / (1 + L(s)),其中 L(s) 是环路增益。

这份 Matlab 代码里,量化器用一个简单的取整函数实现,但关键在于量化误差被显式提取出来,然后注入到环路里。这样做的好处是你可以单独观察量化噪声经过整形后的频谱,而不是只看最终输出。

% 量化器:3 位输出,量化台阶为 1 function [y, q_error] = quantizer(x, n_bits) % 量化台阶 delta = 2 / (2^n_bits - 1); % 量化输出 y = round(x / delta) * delta; % 量化误差 q_error = y - x; end

这个量化器函数返回两个值:量化结果和量化误差。在仿真循环里,量化误差被反馈回环路滤波器的输入端,模拟真实的噪声注入。注意n_bits这个参数——它决定了量化台阶的大小,也决定了带内噪声底。三阶整形在过采样率足够高时,可以把带内噪声压得很低,但量化器位数太少的话,高阶整形的收益会被量化噪声的绝对幅度吃掉。

3.2 反馈 DAC 的非理想性怎么建模

理想 DAC 在每个时钟周期输出一个干净脉冲,但实际电路里 DAC 有上升下降时间、时钟抖动、脉冲宽度误差。这些非理想性在连续时间 Delta-Sigma 里比离散时间更敏感,因为 DAC 的输出直接和连续时间积分器交互。

这份 Matlab 代码里,DAC 的非理想性通过两个参数建模:脉冲宽度误差和时钟抖动。脉冲宽度误差用一个比例因子表示,时钟抖动用一个随机延迟表示。这两个参数都会在输出频谱里引入额外的噪声分量,尤其是时钟抖动,它会把量化噪声混频到带内。

% DAC 非理想性参数 dac_pulse_error = 0.02; % 脉冲宽度误差 2% clock_jitter = 1e-9; % 时钟抖动 1ns % 在每个采样周期里,DAC 输出脉冲宽度有误差 % 时钟抖动导致采样时刻随机偏移 t_jitter = clock_jitter * randn(1, n_samples);

dac_pulse_error影响的是反馈脉冲的面积,面积误差直接等效成环路增益误差,会让 NTF 的零点位置偏移。clock_jitter影响的是采样时刻的精度,抖动越大,带内噪声抬升越明显。这两个参数在代码里是分开的,你可以单独打开一个,观察它对频谱的贡献,这样就能分清到底是 DAC 脉冲误差还是时钟抖动在主导噪声底。

4. 仿真循环与频谱分析:怎么从时域波形看出噪声整形在 work

4.1 时域迭代的每一步在算什么

连续时间 Delta-Sigma 的仿真循环和离散时间版本最大的区别在于:连续时间积分器的状态更新需要用数值积分方法,而不是简单的差分方程。这份 Matlab 代码里用的是前向欧拉法,每个采样周期内把连续时间积分器的微分方程离散化,然后更新状态。

% 初始化积分器状态 state1 = 0; state2 = 0; state3 = 0; % 仿真循环 for n = 1:n_samples % 输入信号 u = sin(2 * pi * fin * n * Ts); % 第一级积分器 state1 = state1 + k1 * Ts * (u - feedback); % 第二级积分器 state2 = state2 + k2 * Ts * state1; % 第三级积分器 state3 = state3 + k3 * Ts * state2; % 量化器输入 quant_in = state3; % 量化 [y, q_error] = quantizer(quant_in, 3); % 反馈 feedback = y; % 记录输出 output(n) = y; end

这段循环里,state1、state2、state3分别是三级积分器的状态变量。注意feedback这个变量——它来自上一周期的量化输出,这就是环路延迟的来源。如果你把feedback改成当前周期的量化输出,环路就变成了无延迟的理想结构,但实际电路里做不到。前向欧拉法在这里的精度取决于Ts和积分器系数的乘积,如果k1 * Ts太大,数值积分会不稳定,仿真结果会发散。

4.2 频谱分析里那些“不该出现”的峰

仿真跑完之后,对输出序列做 FFT,你会看到噪声整形后的频谱:低频段被压得很低,高频段翘起来。但如果你看到低频段有不该出现的峰,或者噪声底比预期高很多,通常有几个原因。

第一个原因是积分器系数太大,导致数值积分不稳定,这时候时域波形会先发散再饱和,频谱上表现为宽带噪声抬升。第二个原因是环路延迟补偿没做对,NTF 零点偏离单位圆,带内出现峰值。第三个原因是量化器位数太少,量化噪声的绝对幅度超过了整形能压制的范围。

这份 Matlab 代码里,频谱分析部分用了一个加窗 FFT,窗函数是 Hann 窗,目的是减少频谱泄漏。如果你不加窗,输入信号不是整数周期时,频谱上会出现很多旁瓣,容易和噪声整形的效果混淆。

% 加 Hann 窗做 FFT window = hann(n_samples)'; output_windowed = output .* window; % FFT spectrum = abs(fft(output_windowed)) / n_samples; spectrum_db = 20 * log10(spectrum(1:n_samples/2) + eps); % 频率轴 f = (0:n_samples/2-1) / n_samples * (1/Ts);

eps是为了避免对零取对数。spectrum_db就是你要看的噪声整形曲线。正常情况下,低频段应该比高频段低很多,斜率大约是 60 dB/decade(三阶整形)。如果你看到的斜率不对,回去检查积分器系数和环路延迟。

5. 避坑与排查:连续时间 Delta-Sigma 仿真里最容易翻车的几个点

5.1 现象:时域波形发散,频谱一片糊

原因:前向欧拉法的稳定性条件不满足。连续时间积分器离散化后,如果k * Ts太大,数值积分会发散。三阶结构里,三级积分器级联,稳定性条件更苛刻。

解决:减小Ts或者减小积分器系数。先单独跑一级积分器,确认它稳定,再逐级加上去。如果必须用大系数,换用梯形法或龙格库塔法做数值积分。

5.2 现象:低频段噪声底比预期高 20 dB 以上

原因:量化器位数太少,或者量化台阶设置不对。三阶整形在过采样率 64 倍时,理论上可以把带内噪声压到 -100 dB 以下,但如果量化器只有 1 位,量化噪声的绝对幅度太大,整形后的带内噪声仍然很高。

解决:增加量化器位数,或者提高过采样率。检查quantizer函数里的delta计算是否正确,2 / (2^n_bits - 1)这个公式对应的是满量程为 2 的情况。

5.3 现象:频谱上出现明显的谐波峰

原因:输入信号幅度太大,量化器过载。Delta-Sigma 调制器的输入范围有限,超过这个范围后量化器进入饱和,谐波失真急剧增加。

解决:减小输入信号幅度,通常留 3 到 6 dB 的裕量。在代码里把u的幅度从 1 降到 0.5 或 0.3,观察谐波峰是否消失。

5.4 现象:环路延迟补偿后 NTF 零点仍然偏移

原因:旋转因子补偿是一种频域近似,在过采样率不够高时误差较大。另外,DAC 脉冲形状和延迟补偿是耦合的,单独调一个可能不够。

解决:把loop_delay和dac_mode联合起来调,先固定dac_mode,扫描loop_delay从 0 到 1,找到使带内噪声最低的组合。如果精度要求高,用脉冲不变变换的精确形式重新推导等效系数。

5.5 现象:仿真跑得很慢,内存不够

原因:连续时间仿真需要很小的Ts来保证数值积分精度,导致采样点数巨大。如果Ts是 1e-9 秒,仿真 1 毫秒就需要 100 万个点。

解决:用多速率仿真,连续时间部分用小步长,离散时间部分用采样周期步长。或者先用行为级模型验证环路参数,再用晶体管级模型做精细仿真。

6. 从仿真到流片:连续时间 Delta-Sigma 的设计取舍

连续时间 Delta-Sigma ADC 的仿真模型,最终要落到电路实现上。这时候你会发现,仿真里那些理想化的假设,每一个都要付出代价。积分器系数越大,电容越小,但噪声和失配越严重;环路延迟补偿越精确,需要的额外电路越多;DAC 脉冲形状越复杂,时钟要求越高。这份 Matlab 代码的价值,不在于它给出了一个可以直接流片的方案,而在于它把连续时间环路、量化器、反馈 DAC 和延迟补偿这几个模块的相互作用,用可运行的方式呈现出来。你可以改一个参数,立刻看到频谱怎么变,这种即时反馈是理解噪声整形机制最快的方式。

我自己的习惯是,每次调连续时间 Delta-Sigma 的环路参数之前,先把这份代码里的dac_mode和loop_delay固定成实际电路里最可能用的组合,然后只调积分器系数,观察 NTF 的变化。等 NTF 形状满意了,再回头调量化器位数和过采样率,最后才加非理想性。这个顺序能帮你分清哪些参数是主导因素,哪些是次要因素。从那以后我每次做连续时间 Delta-Sigma 仿真,都强制走一遍这个流程,避免在非理想性上浪费时间。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询