i am trying to calculate the SNR for the Ideal ADC model in cadence ahdllib , i know that it should be equal to or around 6.02N+1.76
i have implemeted a code to calculate the FFT of the output of ADC using matlab and i will attach the code
my problem is that i dont know how to calculate the SNR from the FFT of the output signal
Code:
Afs = 5;
fs = 1e6;
N = 2048;
cycles = 5;
fx = fs*cycles/N;
t = linspace(0, (N-1)/fs, N);
%signal frequency
y = table2array(bitsinfullscale);
y = y';
s = (abs(fft(y)/N/Afs*2));
% drop redundant half
s = s(1:N/2);
f = (0:length(s)-1) / N*fs;
figure
plot(t,y)
hold on;
figure
plot(f,s)
****
SNR = Signal to Noise Ratio = Signal / Noise.
SNR usually is given in "dB" and signal and noise are given in voltage_RMS.
Thus in most cases: SNR(dB) = 20 x log(Signal_RMS / Noise_RMS)
Signal_RMS
.. is usually a single sinusoidal signal. Thus signal(RMS) in LSB = 2^ADC_bit_resolution / (2 x sqrt(2))
Example: for a 16 bit ADC: 23170 LSB_RMS
Noise_RMS
...is the sum of all frequencies voltage_RMS. (except DC)
noise_RMS = sqrt( n1_RMS^2 + n2_RMS^2 +n3_RMS^2 ....)
thanks KlausST but i want to calculate it from the data collected from the FFT i will attach the signal
it is a sine wave output for 4 bit Ideal ADC
Code:
Afs = 5;
fs = 1e6;
N = 2048;
cycles = 5;
fx = fs*cycles/N;
t = linspace(0, (N-1)/fs, N);
%signal frequency
y = table2array(bitsinfullscale);
y = y';
s = 20*log10 (abs(fft/N/Afs*2));
% drop redundant half
s = s(1:N/2);
f = (0:length(s)-1) / N*fs;
figure
plot(t,y)
hold on;
figure
plot(f,s)
bx = N*fx/fs + 1;
As = 20*log10 (s(bx));
%set signal bin to 0
s(bx) = 0;
An = 10*log10 (sum(s.^2));
SNR = As - An