DSPRelated.com
Forums

3rd Order CIFF Sigma Delta ADC

Started by Amit_Bhardwaj08 3 weeks ago4 replieslatest reply 3 weeks ago148 views

Hello everyone,

I'm trying to verify the theoretical SNR of a Conventional 3rd-order single-bit CIFF Sigma-Delta ADC with an OSR of 60. The feedforward and gain coefficients are generated using Richard Schreier's Sigma-Delta Toolbox.

However, I'm observing a significant SNR discrepancy:

  • Theoretical SNR: ~110 dB
  • Sigma-Delta Toolbox predicted peak SNR: ~88 dB
  • MATLAB simulation result: ~78 dB

This represents nearly a 30 dB degradation from the theoretical estimate to the practical implementation, and about 10 dB between the Sigma-Delta Toolbox prediction and my MATLAB simulation.

The coefficients are generated using the following Sigma-Delta Toolbox flow:

clc; clear; close all;

% Modulator specifications
order = 3;
OSR   = 60;
opt   = 1;        % Optimized NTF zeros
Hinf  = 1.5;      % Lee stability criterion for 1-bit
nlev  = 2;        % 1-bit quantizer
form  = 'CIFF';   % Architecture

% 1) Synthesize optimal NTF
ntf = synthesizeNTF(order, OSR, opt, Hinf);

% 2) Realize CIFF structure
[a,g,b,c] = realizeNTF(ntf, form);

% 3) Build ABCD matrix
ABCD = stuffABCD(a,g,b,c,form);

% 4) Scale states for stability
[ABCDs, umax] = scaleABCD(ABCD, nlev);

% 5) Extract scaled coefficients
[a,g,b,c] = mapABCD(ABCDs, form);

% Display coefficients
k1 = c(1);
k2 = c(2);
k3 = c(3);

a1 = a(1);
a2 = a(2);
a3 = a(3);

fprintf('\nIntegrator Gains:\n');
fprintf('k1 = %.16f\n', k1);
fprintf('k2 = %.16f\n', k2);
fprintf('k3 = %.16f\n', k3);

fprintf('\nFeedforward Coefficients:\n');
fprintf('a1 = %.16f\n', a1);
fprintf('a2 = %.16f\n', a2);
fprintf('a3 = %.16f\n', a3);

fprintf('\nStability:\n');
fprintf('Max Stable Input (umax): %.16f\n', umax);

% Predict SNR
[snr, amp] = simulateSNR(ntf, OSR, [], [], nlev);
fprintf('Predicted Peak SNR: %.16f dB\n', max(snr));

If anyone has worked on behavioral modeling of CIFF Sigma-Delta modulators or has encountered a similar discrepancy, I'd greatly appreciate your insights.

Thank you!

#SigmaDeltaADC #ADC #MixedSignal #MATLAB #SignalProcessing #DSP #BehavioralModeling #CIFF #Oversampling #SNR #RichardSchreier #EngineeringCommunity

[ - ]
Reply by chalilJuly 21, 2026

I just manually calculated SNR for 1kHz = 88.09 dB !

code i used is attached. cal_snr.m

just call the function at the end of your original file. 

% Measure SNR for 1KHz tone 
cal_snr(N_samples, Fs, F_signal, ABCDs, nlev, umax, bandwidth, bin_ideal);

few points to remember : 

signal_span matters and the bin mapping too. 

and use window.  

[ - ]
Reply by Amit_Bhardwaj08July 22, 2026

Yes, Chalil, you are correct. You have calculated the SNR using Richard's Sigma-Delta Toolbox itself.

However, if we implement the same modulator using the difference equations, shouldn't we obtain the same SNR result as well?

I've attached the code that I used. TO_Conventional_1Bit_SD_ADC.m

Could you please have a look and let me know if I'm missing something?

[ - ]
Reply by chalilJuly 22, 2026

please check your reconstruction LPF

[ - ]
Reply by Amit_Bhardwaj08July 22, 2026

In my current MATLAB implementation, I haven't used an explicit reconstruction LPF.

For the SNR calculation, I'm considering only the in-band spectrum (0-20 kHz), which effectively behaves as an ideal brick-wall LPF during analysis. For the practical ADC implementation, I'll replace this with an actual decimation/reconstruction filter.