Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Calculating SNR from for an ADC

Status
Not open for further replies.

amr.maghraby

Junior Member level 2
Junior Member level 2
Joined
Dec 29, 2016
Messages
23
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
189
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)
 

Hi,

i know that it should be equal to or around 6.02N+1.76
N = 2048;
Mind that both "N" represent different things.

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

Klaus
 

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
time.jpg
freq.jpg
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(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)
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
 

Hi,

then just take bin5 as your "signal", and all the rest (without DC) as noise.

But your "sine" is distorted... and it seems it just has 4 bits of resolution, thus you get a lot of overtones.

These overtones play a big role in caclulation.. and thus you don´t get "noise only" --> the result is more "THD+N" instead of "SNR".

--> either use a THD free input signal, or don´t use an input signal at all.

Klaus
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top