对12bit的AD建模后matlab写程序对其进行FFT,计算SNR并输出频谱图,程序该怎么写???急

对12bit的AD建模后matlab写程序对其进行FFT,计算SNR并输出频谱图,程序该怎么写???急,第1张

你是不是用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

恢复数据:1方法一:对采样数据进行低通滤波,低通滤波器的截止频率为1/2的采样频率,滤波器阶数越高效果越好。

方法二:将采样数据和SINC函数做时域卷积,等效为在频域和门函数相乘(低通滤波)

以上两个方法默认采样的数据为冲击串,现实中,采样的数据实际上是冲击串和门函数的时域卷积,这样的话要完全恢复原始数据,要对门函数对应的频域中的SINC函数进行幅度和相位补偿(具体请参考相关文献)。

FFT算法:请参考任何一本数字信号处理的教科书。在matlab中的命令为: fft(采样数据矩阵)

1)直接用cadence计算器使用dft函数能够直接画出频谱图,由于采用了相干采样,因此直接选用矩形窗就OK,输出的信号是单频点的;thd函数得出的结果实际上并不是“thd”一般所定义的,即所有谐波的总和,这里计算器得出的其实是SNDR的结果,而且已经自动剔除了直流分量的,具体可以查看cadence的ocean_ref文档,其中fundemental直接写0就Ok,这样它会自己去找最大的那个信号频点2)通过matlab函数用诸如Maxim的程序的话,若采用了相干采样这里就不要加窗了,结果应该和cadence直接计算的结果一致。注意:如果采用table导出ADC结果的时候,是有个精度设置的,在table里头format->有效位数那里可以设置,导出的精度没有损失,结果才会和cadence直接计算的一致。但是如果是实际测试,输入信号和时钟频率之间的关系就不好固定了,所以还是需要加窗函数的


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12102425.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存