3阶连续时间Delta-Sigma ADC的Matlab仿真设计全流程 简介面向模数转换器设计与数字信号处理学习者的三阶连续时间Delta-Sigma调制器Matlab仿真代码完整覆盖三阶连续时间调制器的建模、时序仿真与频域分析适用于理解噪声整形、过采样和量化噪声抑制等核心概念。压缩包共十个文件包含三个m脚本、一个mdl仿真模型、三篇PDF参考论文、一个Excel计算表、一份txt操作说明及一张png截图整体大小仅三点一四MB结构清晰便于查阅。仿真代码具备时序仿真、频谱分析和功率谱密度计算功能可直观展示调制器动态行为及噪声分布附带论文提供理论背景计算表便于参数核算适合边运行模型边对照学习。这套代码已有九百五十四人学习下载对需要利用MATLAB进行系统级验证与性能评估的研究者、工程师及高年级学生均具有实用价值。 如果你正在做高精度数据转换链路的设计或选型Delta-SigmaΔΣADC 是你绕不开的一个架构方向。而连续时间Continuous-TimeDelta-Sigma 又是其中更适合高速、高带宽场景的一类实现。我最近在做一个 3 阶连续时间 Delta-Sigma ADC 的评估项目核心验证工作全部跑在 Matlab 里。这套仿真代码覆盖了从噪声传递函数NTF设计、环路滤波器系数计算、连续时间到离散时间等效验证到最终输出频谱和 SNR 分析的完整流程。今天把它拆开讲清楚哪些环节容易踩坑、为什么系数要这么设、仿真结果怎么判断都会写到。适合正在搭系统级模型、准备流片前做行为验证的同学参考。1. 项目定位为什么选 3 阶连续时间架构1.1 噪声整形的核心逻辑Delta-Sigma 调制器的思路可以概括成一句话用粗糙的量化器配合负反馈和过采样把量化噪声从信号频带里“推”出去。量化器本身的比特数不高但环路里的积分器会不断累计算误差再通过反馈把它抵消掉。低频段误差被环路增益压得很低高频段误差被释放出去这就是噪声整形。整形能力的强弱和环路里积分器的个数直接相关。一阶环路只有一个积分器对低频误差的压制是 20dB/dec二阶是 40dB/dec三阶是 60dB/dec。换句话说3 阶系统在带内噪声抑制能力上比一阶强了量级。实际做音频或者高精度数据采集时想要达到 100dB 以上的 SNR单靠二阶很难实现三阶是目前性能和复杂度比较平衡的选择。1.2 连续时间与离散时间架构的取舍很多人最开始接触的都是离散时间DTDelta-Sigma也就是开关电容积分器那套结构。它分析方便对时钟抖动不太敏感教科书例子多。但工程中一旦采样频率往百兆以上走开关电容积分器对运放建立速度和开关电荷注入的要求非常苛刻实现难度剧增。连续时间架构用 RC 积分器代替了开关电容积分器信号路径上不再有采样保持开关因此对运放的单位增益带宽要求相对宽松也天然具备抗混叠能力——带外信号在进入采样器之前就被积分器衰减了。代价也很明显反馈 DAC 的脉冲形状和时钟抖动直接进入环路RC 时间常数与采样周期之比受工艺偏差影响会改变实际环路系数。下面这张表是我在方案权衡时列出来的对比项离散时间SC连续时间CT运放带宽要求高需在半个周期内完成建立相对低允许逐步建立抗混叠能力弱需要额外抗混叠滤波器强环路本身提供滚降时钟抖动敏感度较低较高尤其是高精度场景系数受工艺偏差影响小明显RC 时间常数漂移直接改变滤波特性适用场景音频、中低速高精度高速通信、射频、中频采样我们这个项目最终选择连续时间主要是看中它的抗混叠和带宽潜力。但也要有心理准备仿真模型里如果不加 RC 失配和时钟抖动结果会偏乐观。1.3 3 阶的定位性能与稳定性的平衡点1 阶太弱2 阶常常不够用4 阶开始稳定性补偿明显变复杂所以 3 阶在工业界和学术界都是高频选择。单纯从公式估算3 阶调制器在 OSR64 时理想 1-bit 量化的峰值 SNR 大约在 106dB 附近如果配合多比特量化器可以做到 120dB 以上。这个数字已经覆盖绝大多数音频和仪器仪表需求。高阶环路最大的风险是不稳定。环路阶数越高NTF 的峰值增益越难压制工程上必须引入稳定判据来约束设计空间不能只看 SNR 公式。2. 设计规格与 NTF 的确定2.1 关键参数的计算逻辑拿到一个设计任务先别急着写代码。第一步是把目标规格量化。假设我这里的目标是信号带宽 2MHz希望 SNR 做到 100dB 以上那 OSR 可以这样估算对于 3 阶调制器每提高一倍 OSRSNR 大约提升 21dB由 2L17 决定。从 16 倍 OSR 的基准开始粗略推64 倍 OSR 能提供约 126dB 的理想整形增益扣除量化器比特数有限和 NTF 峰值的折损余量是够的。于是取 Fs 2 × 2MHz × 64 256MHz。量化器位数也要一起定。多比特量化器比如 4 电平或 16 电平能显著降低对 NTF 峰值的压力同时提高稳定性但 DAC 线性度问题会凸显。早期验证阶段我通常先用 4 电平到 16 电平的量化器跑理想模型后续再考虑动态元件匹配DEM等非理想因素。输入信号幅度也需要设定。Delta-Sigma 调制器有明确的最大稳定输入范围超出后会崩。实际设计时一般以 -3dBFS 到 -6dBFS 作为满幅扫描点避免一上来就让积分器饱和。2.2 NTF 设计从零极点开始Matlab 里做 NTF 设计我几乎离不开 Richard Schreier 的 Delta-Sigma Toolbox一般叫 delsig在 MathWorks File Exchange 上可以下载。设计一个 3 阶、OSR64、低通的 NTF关键代码是OSR 64; order 3; ntf synthesizeNTF(order, OSR, 0, 1.5, 0); zplane(ntf.z{1}, ntf.p{1});synthesizeNTF的第三个参数选 0 表示把零点做带内均匀优化分布这样能在信号带宽内获得更好的噪声抑制第四个参数 1.5 是 NTF 的 H_inf 值也就是峰值增益。这个值非常重要它对应高阶调制器稳定性的 Lee 准则——一般要求 H_inf 小于 2工程上建议控制在 1.5 到 1.8 之间。H_inf 越小越稳定但噪声整形能力会下降取值太大环路容易自激振荡或者出现间歇性不稳定。2.3 反馈 DAC 波形的影响连续时间 Delta-Sigma 的反馈 DAC 不是理想的它的脉冲形状NRZ 还是 RZ会直接影响等效离散时间环路滤波器响应。NRZ 波形整个周期内都保持输出对时钟抖动相对不敏感是大多数电路的首选。RZ 波形只有半个周期输出对抖动更敏感但在某些 1-bit 场景下有助于改善过载恢复能力。在仿真层面这体现在系数计算和等效验证中。如果使用工具箱的realizeNTF_ct它会默认按理想脉冲来算系数但后续做 CT 行为级仿真时必须明确指定 DAC 波形类型否则仿真结果和理论设计会不一致。我习惯从 NRZ 起步等性能验证通过后再加抖动模型评估裕量。3. 环路结构选择与系数求解3.1 CIFB 与 CIFF 的结构对比环路滤波器的拓扑结构直接影响积分器的输出摆幅和系数敏感性。CIFB级联积分器反馈型把反馈系数分别注入每一级积分器输入端信号只从第一级进入。结构直观但积分器输出摆幅偏大对运放摆幅和功耗不友好。CIFF级联积分器前馈型则把输入信号同时前馈到每一级积分器反馈只在第一级注入。它的优势是积分器内部处理的信号摆幅明显更小有利于做低功耗代价是需要额外的求和节点。对于 3 阶设计我在功耗敏感的场景下会更倾向 CIFF甚至再引入一条局部反馈构成谐振器把一对 NTF 零点从直流搬离进一步压低带内噪声。以下是两种结构的粗略对比特性CIFBCIFF积分器输出摆幅较大较小反馈系数数量每一级都有通常只有第一级有系数敏感度较高相对低需要的额外电路少多一个求和节点3.2 使用工具箱完成系数计算NTF 只是频率响应的目标要把它落到实际环路里需要算出一组可供电路实现或者仿真使用的系数。工具箱里是这样做的form CIFF; [a, g, b, c] realizeNTF_ct(ntf, form);返回的 a 是反馈系数g 是谐振器系数b 是前馈系数c 是积分器级间系数。拿到系数后不要直接丢进仿真器里先手动检查一遍系数的量级是否合理、是否存在太大或太小的值。太大的系数意味着积分器输入摆幅会非常大太小的系数又可能在电路实现时被寄生参数淹没。不同版本的工具箱函数签名可能略有差异比如有的版本需要额外传入 DAC 类型参数。遇到函数报错优先看一下你当前工具箱的 help 文档这是一条省时间的经验。3.3 连续时间到离散时间的等效验证连续时间环路滤波器是 s 域的而 NTF 设计时用的是 z 域。两者要对应起来需要做一次离散时间等效。原理并不复杂在特定 DAC 脉冲波形下把连续时间环路的脉冲响应采样到离散时间使得闭环行为与目标 NTF 一致。这就是脉冲不变变换。如果工具箱版本支持可以直接用mapCtoD之类的函数观察等效 NTF如果没有也可以用 Simulink 搭一个简单模型跑一个阶跃或者正弦激励对比输出频谱与理论 NTF 是否吻合。这一步我不能省因为大多数设计问题高频峰化、稳定裕度不对都能在等效验证阶段暴露出来。等这一步通过再进入完整仿真。4. 完整仿真流程与 Matlab 代码实现4.1 仿真模型选择连续时间系统的仿真有两种途径。一种是直接对 CT 环路做瞬态仿真例如 Simulink 里用连续积分器搭建或者自己写定步长离散化求解结果真实但速度慢。另一种是先求 CT 的离散时间等效系数再用simulateDSM快速跑长序列。我的做法是分两层先用 DT 等效模型把性能趋势判断准确定理想 SNR 达标后再到 Simulink 里搭 CT 行为级模型验证非理想因素。这样做有一个实际好处simulateDSM是纯离散步进跑 65536 点只需要几秒钟方便做参数扫描。Simulink 连续仿真跑同样的点数可能要几分钟而且步长太大会积分出错步长太小又拖慢速度。别一上来就上重家伙。4.2 核心仿真代码框架以下代码是我在项目早期验证阶段用的骨架NTF 设计加离散等效仿真加简单 SNR 统计%% 系统参数 OSR 64; order 3; nlev 16; % 量化器电平数16 电平需要换算成 4-bit Nfft 2^16; % FFT 点数越长低频分辨率越好 fin 0.0043; % 归一化信号频率保证 DFT bin 对齐 %% NTF 设计与系数计算 ntf synthesizeNTF(order, OSR, 0, 1.5, 0); [a, g, b, c] realizeNTF_ct(ntf, CIFF); %% 激励信号 fs 256e6; t (0:Nfft-1) / fs; u 0.5 * sin(2 * pi * fin * fs * 0.5 / OSR * t); % 信号落在带内 %% 离散等效仿真 v simulateDSM(u, ntf, nlev);simulateDSM默认接收的是离散 NTF 对象它内部会按照调制器结构完成量化反馈。需要留意的是对于连续时间系数直接用simulateDSM的前提是你已经通过了 DT 等效验证否则仿真结果只是“看起来像”的假象。4.3 谱分析与 SNR 计算仿真得到一串输出码流不能只看时域波形要做频谱分析。下面这段代码完成加窗、FFT、单边 PSD 估计并计算带内 SNR%% 频谱分析 w hanning(Nfft, periodic); V fft(v .* w); PSD abs(V).^2 / (fs * sum(w.^2)); PSD(2:end-1) 2 * PSD(2:end-1); % 单边谱 f_axis (0:Nfft/2) * fs / Nfft; %% 信号功率时域估算 Psig mean((u - mean(u)).^2); %% 带内噪声功率 f_bw (fs / (2 * OSR)); inband_mask f_axis f_bw; % 剔除信号 bin 附近若干点避免信号泄漏计入噪声 excl abs(f_axis - (fin * fs / 2 / OSR)) (fs / Nfft * 3); inband_mask(excl(1:Nfft/21)) false; Pn sum(PSD(inband_mask)) * (fs / Nfft); SNR 10 * log10(Psig / Pn); ENOB (SNR - 1.76) / 6.02;这段代码里有一个容易出错的地方信号频率要尽量与 FFT bin 对齐否则加窗后信号能量会泄漏到邻近频率点即使剔除三个 bin 也未必干净。稳妥办法是选择使其恰好落在某个 bin 上的频率这也是我把fin写成固定小数的原因。实测下来加 Hann 窗后漏给噪声的电平比矩形窗低很多但还是要定期检查频谱图确保信号峰周围没有明显的裙边。5. 仿真中的典型问题与排查方法5.1 积分器饱和导致仿真发散这是高阶增量累加结构最常见的翻车现场。现象是仿真跑到中途输出码流突然变成连续高电平或者连续低电平频谱上一片噪声。原因多半是积分器输出超过限幅范围也就是系数设计时没有给积分器摆幅留足裕量。解决办法分三步第一步先把输入幅度降下来比如从 -6dBFS 降到 -20dBFS看是否恢复稳定第二步检查系数 a、b、c 的量级如果某个系数超过 1 就要警惕第三步在 Simulink 模型里给积分器加限幅模块模拟真实运放的输出摆幅限制。做完这三步大多数“仿真发散”都会现出原形。5.2 稳定裕度不足与 NTF 峰化有时环路并没有完全发散但输出频谱带内噪声抬高SNR 比理论值低 20dB 以上。打开 NTF 的幅频响应看一眼峰值通常已经超过 2。这种属于不稳定边缘状态长期仿真会出现间歇性崩溃。解决办法是回过去把synthesizeNTF的 H_inf 从 1.5 改到 1.3或者增加零点阻尼设置。损失一点带内整形深度换来的是整条输入幅度范围都能稳定工作。看波形时还要注意一个细节如果量化器输出出现周期性的长 1 长 0 交替同时积分器输出摆幅忽大忽小基本都是稳定裕量不足的信号。5.3 时钟抖动与 RC 失配评估连续时间架构最容易被实际非理想因素打脸的地方一个是时钟抖动一个是 RC 时间常数偏移。仿真评估抖动的方法是给反馈 DAC 的脉冲宽度添加一个高斯随机扰动再计算 SNR 的变化。OSR 越高、目标 SNR 越高抖动容忍度越低。做 100dB 以上目标的设计时钟抖动达到几百飞秒级别时SNR 退化可能已经超过 10dB。RC 失配则需要扫描 k R×C×fs 从 0.7 到 1.3。原理看起来只是简单的比例变化但环路系数失配会让 NTF 零点偏移带内噪声出现隆起。这一步我在实际电路仿真前一定会做如果扫描范围内 SNR 波动超过 3dB那说明系数设计太激进必须回头调整。在我自己的项目里有两个操作习惯帮了大忙。第一是每跑一次仿真都顺手存下 NTF 的零极点图和输出频谱图方便后续对照调试第二是不要迷信工具箱的默认参数手动复算一遍系数映射关系尤其是 CT 到 DT 的等效这一步。仿真能跑通只说明模型自洽距离真实芯片还有一长段路但把这套 Matlab 流程吃透后面做行为级验证和版图前评估都会快很多。本文还有配套的精品资源点击获取