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.

How to measure the dynamic specifications like SINAD of ADC?

Status
Not open for further replies.

geethki

Newbie level 4
Newbie level 4
Joined
Mar 6, 2007
Messages
6
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,378
how to measure sinad

Hi all..
I am trying to measure the dynamic specs of 8 bit pipeline ADC in spectre ..
To perform the measurement i give a sinusoidal input of 1.245MHz and my clock frequency is 15.360 MHz...
I ve derived these values with the relation fin/fsample=Nwindow/Nrecord, where my Nwindow and Nrecord values are 83 and 1024 respectively..
How much duration i need to carry out transient analysis to plot the dft?
I have carried out simulation for about 67.25u.. Is this duration sufficient to carry out dft after generating the stair and converting it to equivalent analog differential input...
Or is it sufficient to just take dft for 4 to 5 cycles of the output?
 

how do i measure sinad

For your Nwindow and Nrecord values are 83 and 1024. It should at least 1024 cycle of the output which can make sure the signal for FFT is integrated.

Added after 3 minutes:

I am sorry it should be 83 fin cycles
 

    geethki

    Points: 2
    Helpful Answer Positive Rating
how measure adc sinad

Thanks bigpop... I did a transient simulation for 67.25u, generated the stair and converted to equivalent analog differential input... then found dft from 0.5859u 67.25u of the generated signal.. When i try to measure SINAD, which is the ratio of signal amplitude/sqrt(sum(squares(all the components except at dc level and the fundamental frequency))) i get very poor value... I don know where i am wrong.. Pls correct me...
 

adc sinad

I can not see your data so I don't know why. try following step
1. Check if your ADC is stable
2. check your generated signal to find if there are some nonlinear data
3. add some window in your dft analysis. such as hunning, blackman
 

calculate harmonic in fft spectrum adc sinad

Thanks bigpop.... I have been asked to do the calculations in Matlab..Actually i got a matlab code which computes SINAD,SFDR... But i dont know how to feed the output from spectre to this code..
This is the MATLAB code..

fclk=80E+6;
numpt=4096;
numbit=10;
load saradcdata.txt; % Load data from disk;
a=saradcdata';
N=length(a);
%[M,N]=size(a); % Number of data;
for i=1:1:N; %
c=int2str(a(i)); % Change integer type data to string type;
temp=0; %
Nlength=length(c); % Length of the string;
for j=1:1:Nlength; %
d=str2num(c(j))*2^(Nlength-j); % Binary to decimalization
temp=temp+d; %
end; %
code(i)=temp/4096*2.5; %
end;
%N=length(code);
%Display a warning, when the input generates a code greater than full-scale
%if (max(code)==2^numbit-1) | (min(code)==0)
%disp('Warning: ADC may be clipping!!!');
%end
%Plot results in the time domain
figure;
plot([1:N],code);
title('TIME DOMAIN')
xlabel('SAMPLES');
ylabel('DIGITAL OUTPUT CODE');
zoom xon;
%Recenter the digital sine wave
Dout=code
%-(2^numbit-1)/2;
%If no window function is used, the input tone must be chosen to be unique and with
%regard to the sampling frequency. To achieve this prime numbers are introduced and the
%input tone is determined by fIN = fSAMPLE * (Prime Number / Data Record Size).
%To relax this requirement, window functions such as HANNING and HAMING (see below) can
%be introduced, however the fundamental in the resulting FFT spectrum appears 'sharper'
%without the use of window functions.
Doutw=Dout;
%Doutw=Dout.*hanning(numpt);
%Doutw=Dout.*hamming(numpt);
%Performing the Fast Fourier Transform
Dout_spect=fft(Doutw,numpt);
%Recalculate to dB
Dout_dB=20*log10(abs(Dout_spect));
%plot([1:N/2],Dout_dB(1:N/2));
%Display the results in the frequency domain with an FFT plot
figure;
maxdB=max(Dout_dB(2:numpt/2));
%For TTIMD, use the following short routine, normalized to —6.5dB full-scale.
%plot([0:numpt/2-1].*fclk/numpt,Dout_dB(1:numpt/2)-maxdB-6.5);
plot([0:numpt/2-1].*fclk/numpt,Dout_dB(1:numpt/2)-maxdB);
grid on;
title('FFT PLOT');
xlabel('ANALOG INPUT FREQUENCY (MHz)');
ylabel('AMPLITUDE (dB)');
a1=axis; axis([a1(1) a1(2) -120 a1(4)]);
%Calculate SNR, SINAD, THD and SFDR values
%Find the signal bin number, DC = bin 1
fin=find(Dout_dB(1:numpt/2)==maxdB);
%Span of the input frequency on each side
%span=5;
span=max(round(numpt/200),5);
%Approximate search span for harmonics on each side
spanh=2;
%Determine power spectrum
spectP=(abs(Dout_spect)).*(abs(Dout_spect));
%Find DC offset power
Pdc=sum(spectP(1:span));
%Extract overall signal power
Ps=sum(spectP(fin-span:fin+span));
%Vector/matrix to store both frequency and power of signal and harmonics
Fh=[];
%The 1st element in the vector/matrix represents the signal, the next element represents
%the 2nd harmonic, etc.
Ph=[];
%Find harmonic frequencies and power components in the FFT spectrum
for har_num=1:10
%Input tones greater than fSAMPLE are aliased back into the spectrum
tone=rem((har_num*(fin-1)+1)/numpt,1);
if tone>0.5
%Input tones greater than 0.5*fSAMPLE (after aliasing) are reflected
tone=1-tone;
end
Fh=[Fh tone];
%For this procedure to work, ensure the folded back high order harmonics do not overlap
%with DC or signal or lower order harmonics
har_peak=max(spectP(round(tone*numpt)-spanh:round(tone*numpt)+spanh));
har_bin=find(spectP(round(tone*numpt)-spanh:round(tone*numpt)+spanh)==har_peak);
har_bin=har_bin+round(tone*numpt)-spanh-1;
Ph=[Ph sum(spectP(har_bin-1:har_bin+1))];
end
%Determine the total distortion power
Pd=sum(Ph(2:5));
%Determine the noise power
Pn=sum(spectP(1:numpt/2))-Pdc-Ps-Pd;
format;
A=(max(code)-min(code))
%/2^numbit
AdB=20*log10(A)
SINAD=10*log10(Ps/(Pn+Pd))
SNR=10*log10(Ps/Pn)
disp('THD is calculated from 2nd through 5th order harmonics');
THD=10*log10(Pd/Ph(1))
SFDR=10*log10(Ph(1)/max(Ph(2:10)))
disp('Signal & Harmonic Power Components:');
HD=10*log10(Ph(1:10)/Ph(1))
%Distinguish all harmonics locations within the FFT plot
hold on;
plot(Fh(2)*fclk,0,'mo',Fh(3)*fclk,0,'cx',Fh(4)*fclk,0,'r+',Fh(5)*fclk,0,'g*',Fh(6)

*fclk,0,'bs',Fh(7)*fclk,0,'bd',Fh(*fclk,0,'kv',Fh(9)*fclk,0,'y^');
legend('1st','2nd','3rd','4th','5th','6th','7th','8th','9th');
%hold off;
%Dynamic-Range Specifications, TTIMD
%Two-tone IMD can be a tricky measurement, because the additional equipment required (a

power combiner to combine two input frequencies) can contribute unwanted intermodulation

products that falsify the ADC's intermodulation distortion. You must observe the following

conditions to optimize IMD performance, although they make the selection of proper input

frequencies a tedious task.
%First, the input tones must fall into the passband of the input filter. If these tones are

close together (several tens or hundreds of kilohertz for a megahertz bandwidth), an

appropriate window function must be chosen as well. Placing them too close together,

however, may allow the power combiner to falsify the overall IMD readings by contributing

unwanted 2nd- and 3rd-order IMD products (depending on the input tones' location within the

passband). Spacing the input tones too far apart may call for a different window type that

has less frequency resolution.
%The setup also requires a minimum of three phase-locked signal generators. This requirement

seldom poses a problem for test labs, but generators have different capabilities for

matching frequency and amplitude. Compensating such mismatches to achieve (for example) a -

0.5dB FS two-tone envelope and signal amplitudes of -6.5dB FS will increase your effort and

test time (see the following program-code extraction).
%For TTIMD, use the following short routine, normalized to -6.5dB full-scale.
%plot([0:numpt/2-1].*fclk/numpt,Dout_dB(1:numpt/2)-maxdB-6.5);
plot([0:numpt/2-1].*fclk/numpt,Dout_dB(1:numpt/2)-maxdB);
grid on;
title('FFT PLOT');
xlabel('ANALOG INPUT FREQUENCY (MHz)');
ylabel('AMPLITUDE (dB)');
a1=axis; axis([a1(1) a1(2) -120 a1(4)]);

Can u help me out as how to feed the bits D0....D8 to this code..
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top