0% found this document useful (0 votes)
1K views

SNR Code

This MATLAB code calculates various performance metrics like SNR, SNDR, THD, and SFDR for a digital signal. It loads test data, converts it to digital codes, performs an FFT to analyze the signal in the frequency domain, and calculates the power of the fundamental signal and harmonics. It then uses these values to determine the SNR, SNDR, THD, SFDR and ENOB. Plots of the time domain digital signal and frequency spectrum are generated.

Uploaded by

blisterrock
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
1K views

SNR Code

This MATLAB code calculates various performance metrics like SNR, SNDR, THD, and SFDR for a digital signal. It loads test data, converts it to digital codes, performs an FFT to analyze the signal in the frequency domain, and calculates the power of the fundamental signal and harmonics. It then uses these values to determine the SNR, SNDR, THD, SFDR and ENOB. Plots of the time domain digital signal and frequency spectrum are generated.

Uploaded by

blisterrock
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
You are on page 1/ 5

snr code

********************************************************************** 

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

You might also like