DSPRelated.com
Forums

Sigma Delta ADC

Started by sunil_ic 2 weeks ago5 replieslatest reply 4 days ago203 views

Hi all, I am designing 3rd order modified from CIFF Sigma Delta ADC modulator for Audio signal. Our oversampling ratio is 60. I need help in finding the correct pole zero location for optimum stable design. Here are my questions,

1. How zero at 1 at unit circle (z-domain) help us in reducing DC offset and 1/f (flicker noise)? 

2. why for the step input, there is ringing at output before the step? Overshoot is expected. 

3. why our model SNR is not same as theoretical value? there is closet to 20db error from theoretical SNR for 3rd order (60 OSR) from our Simulink model.

Thanks

-Sunil

#Matlab #FFT #Audio #Simulink #Sigma-Delta #Modulator #ADC

[ - ]
Reply by chalilMay 7, 2026

Hi Sunil, Use MATLAB Delta-Sigma Toolbox: ntf = synthesizeNTF(3, 60, 1, ...) (adjust opt for zero optimization, set OBG limit for stability).

•  For CIFF, map the NTF to coefficients carefully (feed-forward gains).

•  Simulate with Schreier toolbox examples DSM models as reference and compare with your simulink model. 
Hope it helps. 
-Chalil 

[ - ]
Reply by Amit_Bhardwaj08May 14, 2026

Hello Mohammed Chalil,

I've also implemented this 3rd order CIFF Sigma Delta ADC using the MATLAB Delta-Sigma Toolbox.
Below is my MATLAB code and step output waveform.

Q. I'm still observing that the output is starting from 0 in this implementation. Is this expected behavior in Sigma-Delta ADCs, or could it indicate an issue in the loop filter stage?

Thanks.


MATLAB Code:

% 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);

% Integrator input gains

k1 = c(1);

k2 = c(2);

k3 = c(3);

a1 = a(1);

a2 = a(2);

a3 = a(3);

fprintf('\nIntegrator Gains:\n');

fprintf('k1 = %.4f\n', k1);

fprintf('k2 = %.4f\n', k2);

fprintf('k3 = %.4f\n', k3);

fprintf('\nFeedforward Coefficients:\n');

fprintf('a1 = %.4f\n', a1);

fprintf('a2 = %.4f\n', a2);

fprintf('a3 = %.4f\n', a3);


Waveforms:

screenshot 2026-05-12 203841_1532.png

[ - ]
Reply by chalilMay 14, 2026

ripples can be reduced/controlled by changing/tuning your reconstruction LPF. if you really want to check the theoretical behavior, please use the simulateDSM() function. for example, 

to get the SDM stream, v :

v = simulateDSM(input_signal, ABCDs, nlev);

get the reconstructed signal, y :  

f_cutoff = 1.2 / OSR; filter_order = 150; 
b_filter = fir1(filter_order, f_cutoff);
y = filtfilt(b_filter, 1, v);



[ - ]
Reply by Amit_Bhardwaj08May 15, 2026

Okay got it, but I'm still observing that the output is starting from 0 instead of 0.3ms. Is this expected behavior in Sigma-Delta ADCs?

When I apply a step input from 0.3 to 0.6, I expect the output to follow the input (with some delay and possible overshoot). However, the plotted output starts from 0 instead of 0.3, even though I have set the initial conditions of all delay blocks and filter to 0.3.

[ - ]
Reply by chalilMay 15, 2026

>> the output is starting from 0 instead of 0.3ms. Is this expected behavior in Sigma-Delta ADCs?

0.3ms ? in general, LP Sigma-Delta will follow input DC and slow varying changes. the transient behavior depends on TF and reconstruction filter(s).