pipeline ADC SNR for help?

Status
Not open for further replies.

malesky

Newbie level 3
Joined
Dec 15, 2009
Messages
3
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,357
hi everyone

I am trying to simulate ADC for SFDR,SNR,THD and SNDR. The MATLAB code is attached as below. I am new in MATLAB and couldn't fully understand the program.

To simulate, I input low frequency sinewave signal and the ADC is running at 50Ms/s.


(1) Can somebody explain the program below.
%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);
what's fin exatly mean?

(2) When I run the program, it shows error
(??? Subscript indices must either be real positive integers or logicals.
Error in ==> decimal at 237
Ps=sum(spectP(fin-span:span+fin))
in matlab it shows fin=5,span=5,i think this is the problem .
but I don't know how to fix it! Can somebody correct the program below to be used in 12-bit ADC at 50MHz clock frequency.

I appreciate any helps.



%-------------------------------------------------%
%%matlab code to calculate SNR,SNDR,THD SFDR
%%date : 11 July 2005
%%rev : 1
%-------------------------------------------------%
fclk = 50e+6;
numpt=2048;
numbit=12;
%load test.dat; %load data from disk
%a = test';
%N=length(a);
N=2048;
%[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)=nn(i);%/numpt*2.5; i have converter digital number to decimal nn
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);
%fin=30
%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(fin-span: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(8)*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
 

hi,
I hope you definitely found the solution of this problem. could u please me this time. i am also trying to solve the same. pls help me out and tell me the source of this code.
thanks



I am trying to simulate ADC for SFDR,SNR,THD and SNDR. The MATLAB code is attached as below. I am new in MATLAB and couldn't fully understand the program.

To simulate, I input low frequency sinewave signal and the ADC is running at 50Ms/s.


(1) Can somebody explain the program below.
%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);
what's fin exatly mean?

(2) When I run the program, it shows error
(??? Subscript indices must either be real positive integers or logicals.
Error in ==> decimal at 237
Ps=sum(spectP(fin-span:span+fin))
in matlab it shows fin=5,span=5,i think this is the problem .
but I don't know how to fix it! Can somebody correct the program below to be used in 12-bit ADC at 50MHz clock frequency.

I appreciate any helps.



%-------------------------------------------------%
%%matlab code to calculate SNR,SNDR,THD SFDR
%%date : 11 July 2005
%%rev : 1
%-------------------------------------------------%
fclk = 50e+6;
numpt=2048;
numbit=12;
%load test.dat; %load data from disk
%a = test';
%N=length(a);
N=2048;
%[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)=nn(i);%/numpt*2.5; i have converter digital number to decimal nn
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);
%fin=30
%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(fin-span: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(8)*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[/QUOTE]
 

Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…