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
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
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:

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






