Forum Discussion
Altera_Forum
Honored Contributor
12 years agoThanks kaz
now I captured my 16 bit output by signal tap (the files of captured data and text file crated by signal tap were attached) and also I found MATLAB code that plots the FFT spectrum of a desired test tone and will computes SNR, SINAD, THD and SFDR. Matlab codes are as bellow: (also the pdf file contain the codes were attached) does any body know how can I introduce my captured data file to Matlab code to plot fft for me? %The following program code plots the FFT spectrum of a desired test tone. Test tone based on coherent sampling criteria, and %computes SNR, SINAD, THD and SFDR. %Copyright Au/Hofner, Maxim Integrated Products, 120 San Gabriel Drive, Sunnyvale, CA94086 %This program is believed to be accurate and reliable. This program may get altered without prior notification.; disp('HP16500C LA 100/110 State Card'); filename=input('Enter file name or press RETURN to accept data from LA via GPIB/HPIB ) : '); if isempty(filename) filename = 'listing'; end fid=fopen(filename,'r'); numpt=input('Number of Points in FFT? '); fclk=input('Sampling Frequency (MHz)? '); numbit=input('ADC Resolution? '); %Discard first 13 lines of the LA listing (LA header), as they don't contain valid data. for i=1:13, fgetl(fid); end [v1,count]=fscanf(fid,'%f',[2,numpt]); fclose(fid); v1=v1'; code=v1(:,2); %Warning: ADC output may be clipping - reduce input amplitude if (max(code)==2numbit-1) | (min(code)==0) disp('WARNING: ADC OUTPUT MAYBE CLIPPING - CHECK INPUT AMPLITUDE!'); end figure; plot([1:numpt],code); title('TIME DOMAIN') xlabel('SAMPLES'); ylabel('DIGITAL OUTPUT CODE'); Dout=code-(2^numbit-1)/2; %Re-center the digitized sinusoidal input Doutw=Dout; Dout_spect=fft(Doutw); Dout_dB=20×log10(abs(Dout_spect)); figure; maxdB=max(Dout_dB(1:numpt/2)); 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) -100 a1(4)]); fin=find(Dout_dB(1:numpt/2)==maxdB ) ; %Find the signal bin (DC represents bin=1) span=max(round(numpt/200),5); %Determine span of input frequency on each side spanh=2; %Search span for harmonic distortion components on each side spectP=(abs(Dout_spect)).× (abs(Dout_spect)); %Determine power level Pdc=sum(spectP(1:span)); %Determine DC offset power level Ps=sum(spectP(fin-span:fin+span)); %Determine signal power level Fh=[]; %Vector storing frequency and power components of signal and harmonics Ph=[]; %HD1=signal, HD2=2nd harmonic, HD3=3rd harmonic, etc. %Find the harmonic frequencies/power within the FFT plot for har_num=1:10 tone=rem((har_num × (fin-1)+1)/numpt,1); %Note: tones > fSAMPLE are aliased back if tone>0.5 tone=1-tone; end Fh=[Fh tone]; %For this method to work properly, make sure that the folded back high order harmonics do not overlap with DC and signal %components 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 Pd=sum(Ph(2:5)); %Total distortion power level Pn=sum(spectP(1:numpt/2))-Pdc-Ps-Pd; %Extract noise power level format; A=(max(code)-min(code))/2numbit %Analog input amplitude in mV AdB=20×log10(A) %Analog input amplitude in dB SNR=10×log10(Ps/Pn) %SNR in dB SNR=10×log10(Ps/Pn) %SINAD in dB SINAD=10×log10(Ps/(Pn+Pd)) disp('THD - HD2 through HD5'); THD=10×log10(Pd/Ph(1)) %THD in dB SFDR=10×log10(Ph(1)/max(Ph(2:10))) %SFDR in dB disp('SIGNAL AND HARMONIC POWER (dB ) ' ); HD=10×log10(Ph(1:10)/Ph(1)) 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('SIGNAL','HD2','HD3','HD4','HD5','HD6','HD7','HD8','HD9'); hold off; any guidance is really appropriated I dont know how to get fft plot ?