#### kickbeer

##### Full Member level 3

**snr+sinad+sfdr+enob**

Does anyone have implemented the codes below?I'm thinking that i put a sine wave as input of my 8-bit ADC and take directly the output of my ADC..am i right?

and lastly how the file test.load look like or how is the arrangement of the data inside? This is necessary because i need to convert a .mat file into .dat file..

Thy in advanced

%-------------------------------------------------%

%%matlab code to calculate SNR,SNDR,THD SFDR

%%date : 11 July 2005

%%rev : 1

%-------------------------------------------------%

fclk = 80e+6;

numpt=32;

numbit=3;

load test.dat; %load data from disk

a = test';

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 dec

temp=temp+d;

end;

code(i)=temp;%/numpt*2.5;

end;

N=length(code);

%plot results in time domain

figure;

plot([1:N],code);

title('TIME DOMAIN')

xlabel('SAMPLES');

ylabel('DIGITAL OUTPUT CODE');

zoom xon;

%recenter the digital sinewave

Dout=(code-(2^numbit-1))/2;

%if no window functionis used,the input tone must be chosen

%to be unique and with regard to the sampling freq.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

%HAMING 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 FFT

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 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,ENOB,THD and SFDR values

%-----------------------------------------------%

%find the signal bin number, DC=bin 1

fin=find(Dout_dB(1:numpt/2)==maxdB);

%Span of the input freq 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(span-fin:span+fin));

%vector/matric to store both freq and power of signals and harmonics

Fh=[];

%the 1st element in the vector/matrix represents the signal,

%the next element reps the 2nd harmonic,etc..

Ph=[];

%find harmonic freq 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))

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

ENOB =(SNR-1.7)/6.0206;

%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(Cool*fclk,0,'kv',Fh(9)*fclk,0,'y^');

legend('1st','2nd','3rd','4th','5th','6th','7th','8th','9th');

fprintf('SINAD=%gdB \n',SINAD);

fprintf('SNR=%gdB \n',SNR);

fprintf('THD=%gdB \n',THD);

fprintf('SFDR=%gdB \n',SFDR);

fprintf('ENOB=%g \n',ENOB);

%dynamic range specs,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 intermodualtion

%distortion.You must observe the following conditions to optimize IMD

%performance,although they make the selection of proper input freq 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 freq resolution.The setup also requires a min of

%three phase-locked signal generators.This requirement seldom poses a

%problem for test labs,but generators have different capabilities for

%matching freq 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).