答案:你是不是用simulink将数据输出到workbench?再用matlab计算其SFDR,SNR....等等参数?
最近也在做DAC的动态校准的东西,就把代码给你吧。我注释了一部分,你根据自己的需要自己改回来。
%load ScopeData;
dynamic_data=ScopeData.signals.values;
data_size=size(dynamic_data);
N=max(data_size);
sample_number=input('输入采样点数:');
if sample_number>N
display('样本数据数量不够,请检查')
else data=dynamic_data(1:sample_number);
N=sample_number;
end
F_samples=input('输入采样频率:');
Mean_code=mean(data);
V=data-Mean_code;
V=V.*hanning(N);
dout_spect=fft(V);
dout_dB=20*log10(abs(dout_spect));
max_dB=max(dout_dB(1:N/2));
x=(0:N/2-1).*F_samples/N;
y=dout_dB(1:N/2)-max_dB;
figure(1)
plot(x,y);
axis([0,F_samples/2,-120,0]);
grid off;
title('FFT图');
xlabel('模拟输入频率(Hz)');
ylabel('幅值(dB)');
F_in=find(dout_dB(1:N/2)==max_dB);
span=max(round(N/200),5);
spanh=2;
spectp=(abs(dout_spect)).*(abs(dout_spect));
Pdc=sum(spectp(1:span));
%Ps=sum(spectp(F_in-span:F_in+span));
F_harmonic=[];
P_harmonic=[];
for har_number=1:10
tone=rem((har_number*(F_in-1)+1)/N,1);
if tone>0.5
tone=1-tone;
end
F_harmonic=[F_harmonic tone];
har_peak=max(spectp(round(tone*N)-spanh:round(tone*N)+spanh));
har_bin=find(spectp(round(tone*N)-spanh:round(tone*N)+spanh)==har_peak);
har_bin=har_bin+round(tone*N)-spanh-1;
P_harmonic=[P_harmonic sum(spectp(har_bin-1:har_bin+1))];
end
disp(F_harmonic)
disp(P_harmonic)
%
% Pd=sum(P_harmonic(2:5));
%
% Pn=sum(spectp(1:N/2))-Pdc-Ps-Pd;
format;
% SNR=10*log10(Ps/Pn)
%
% SINAD=10*log10(Ps/(Pn+Pd))
SFDR=10*log10(P_harmonic(1)/max(P_harmonic(2:5)))
% THD=10*log10(Pd/P_harmonic(1))
%
% ENOB=(SINAD-1.76)/6.02
上一个:matlab程序中if (mod(j,2)==1)&&(j~=k+1)是什么意思
下一个:急求MATLAB高手建模,三组数据用前面四组建模 后面3组数据验证,求程序以及运行结果,全部身家,谢谢啦