electronics forum

Rules | Recent posts | topic RSS | Search | Register  | Log in

MATLAB program for SFDR!


Post new topic  Reply to topic    EDAboard.com Forum Index -> Analog IC Design & Layout -> MATLAB program for SFDR!
Author Message
jeniffer



Joined: 18 Aug 2006
Posts: 17


Post01 Sep 2006 4:34   

matlab sfdr


Hi all,

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. Should I take the output from the ADC or do I need to connect the output of ADC to an ideal DAC and use the output from that ideal DAC and run the program below?


(1) Can somebody explain the program below.
%Span of the input freq on each side
%span=5;
span=max(round(numpt/200),5);

(2) When I run the program, it shows error and I don't know how to fix it! Can somebody correct the program below to be used in 10-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 = 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).

Back to top
gunturikishore



Joined: 19 Aug 2004
Posts: 146
Helped: 7
Location: INDIA GANDHINAGAR


Post01 Sep 2006 6:55   

sfdr matlab


Hi,

You need to give the bit pattern. That is no doubt. Because the initial part is converting bits to the corresponding decimal mumbers. Later parts are working on these converted decimal numbers. Just go though the load function in MATLAB help (type "help load" )for the format you need to give to MATLAB. Probably you need to place the data file in the Work directory of MATLAB as complete path is not provided. The path in the work directory is given in one corner of the command window interface of Matlab software. Place you data in a text file "test.dat" and copy it into the work directory. Rest of the things will be automatically taken care AFAIK.
Back to top
piao



Joined: 12 Feb 2003
Posts: 223
Helped: 7


Post20 Sep 2006 13:15   

matlab thd


my suggestion is you can search on the web to get a free MATLAb toolbox of how to calculate the SFDR.

it can provide you more flexibility for your design, and you can get the usage easlier.

and you just need to output of your ADC and sample frequency for your ADC. it can work properly.

good luck!
Back to top
Google
AdSense
Google Adsense




Post20 Sep 2006 13:15   

Ads




Back to top
manissri



Joined: 16 Apr 2005
Posts: 276
Helped: 6


Post21 Sep 2006 8:38   

thd matlab


can any body tell how to calculate the all specification of adc using MATLAB
Back to top
ednan



Joined: 13 Feb 2007
Posts: 153


Post10 Feb 2009 9:37   

sfdr test


Hello...

Please tell that if we vector S...n Noise vetor N then how can we cal calculate its SNR...please tell me ...waiting for your response...


thanx

Regards
Adnan
Back to top
kickbeer



Joined: 07 Nov 2008
Posts: 160
Helped: 1


Post10 Sep 2009 15:50   

two tone sfdr


jeniffer wrote:
Hi all,

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. Should I take the output from the ADC or do I need to connect the output of ADC to an ideal DAC and use the output from that ideal DAC and run the program below?


(1) Can somebody explain the program below.
%Span of the input freq on each side
%span=5;
span=max(round(numpt/200),5);

(2) When I run the program, it shows error and I don't know how to fix it! Can somebody correct the program below to be used in 10-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 = 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).



hi jeniffer,

Are you successfull with that matlab codes?
Back to top
euniceliu



Joined: 26 Nov 2008
Posts: 8


Post04 Nov 2009 2:34   

Re: MATLAB program for SFDR!


use help command....
Back to top
Arabic versionBulgarian versionCatalan versionCzech versionDanish versionGerman versionGreek versionEnglish versionSpanish versionFinnish versionFrench versionHindi versionCroatian versionIndonesian versionItalian versionHebrew versionJapanese versionKorean versionLithuanian versionLatvian versionDutch versionNorwegian versionPolish versionPortuguese versionRomanian versionRussian versionSlovak versionSlovenian versionSerbian versionSwedish versionTagalog versionUkrainian versionVietnamese versionChinese version
Post new topic  Reply to topic    EDAboard.com Forum Index -> Analog IC Design & Layout -> MATLAB program for SFDR!
Page 1 of 1 All times are GMT + 1 Hour
Similar topics:
MATLAB program for SFDR (8)
Need help to implement this MATLAB code to calculate SFDR.. (2)
matlab program for antenna design (1)
MATLAB program for SAR analysis (1)
how to convert the matlab program to c-program (1)
Matlab program required for error coding URGENTLY (2)
Searching for MATLAB program about filter design (1)
matlab program for calculating far field, RDRA (3)
please help me to write MATLAB program for RAKE receiver (2)
microstrip design- need matlab program for circular patch (5)


Abuse || Administrator || Moderators || Support us || sitemap
topic RSS