|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
目前正在做ADC的动态特性仿真,计算SNR、THD等指标。从网上找到一个程序,如下所示。
file_input=('4.txt');
format long;
numpt=4096;
fclk=100;
x=load(file_input);
numpt2=numpt/2;
numbit=12;
FS=(2^numbit-1)/2;
length=numpt;
bias=0;
dc=(max(x)+min(x))/2+bias;
x=x-dc;
np=numpt;
np2=np/2;
Dout=x;
Doutw=Dout.*blackman(numpt);%°嬀/size]
Dout_spect=fft(Doutw);%±嬀/size]
spectP=(abs(Dout_spect)).*(abs(Dout_spect));%óù嬀/size]
Dout_dB=10*log10(spectP);%×
[maxdB,fin]=max(Dout_dB(1:numpt2));%×°·§×ó×ó嬀/size]
span=max(round(numpt/200),5);
spanh=2;
Pdc=sum(spectP(1:span));
if fin>span
Ps=sum(spectP(fin-span:fin+span));
else
Ps=sum(spectP(1:fin+span));
end
Fh=zeros(20);%
Ph=zeros(20);%
Ph(1)=sum(spectP(fin-1:fin+1));%计算基波
Fh(1)=fclk*(fin-1)/numpt;%计算信号频率
har_step=fin-1;%设定寻找高次谐波的间隔
har=fin;
for har_num=1:10 %取10次谐波
har_ind=har_step*har_num+fin; %计算出每个高阶谐波所在位置
if(har_ind<numpt2)
[P_har har]=max(spectP(har_ind-spanh:har_ind+spanh));
har=har_ind+har-spanh-1;
if har_num==1,
bas_point=har;
end
Ph(har_num+1)=sum(spectP(har-1:har+1));
Fh(har_num+1)=(har-1)*fclk/numpt;
end
end
f=Fh;
fsig=Fh(1)
har_pow_num=min(5,floor(fclk/(2*fsig)))
Pd=sum(Ph(1:har_pow_num))-Ph(1);
Pn=sum(spectP(1:numpt2))-Pdc-Ps-Pd;
har_range=min(10,floor(fclk/(2*fsig)));
A=(max(x)-min(x))/(2*FS);
AdB=20*log10(A)
SINAD=10*log10(Ps/(Pn+Pd))
SNR=10*log10(Ps/Pn)
THD=10*log10(Pd/Ph(1))
SFDR=10*log10(Ph(1)/max(Ph(2:har_range)))
ENOB=(SINAD-1.76)/6.02
figure;
subplot(211),plot([1:length],x);
a1=axis;
title('TIME DOMAIN')
xlabel('SAMPLES');
ylabel('DIGITAL OUTPUT CODE');
y_up=100*(floor(max(x)/100)+1);
y_down=0-y_up;
axis([a1(1) a1(2) y_down y_up]);
subplot(212),plot([0:numpt2-1]*fclk/numpt,Dout_dB(1:numpt2)-maxdB);
s2=sprintf('SNR = %4.1fdB\n',SNR);
s3=sprintf('SINAD = %4.1fdB\n',SINAD);
s4=sprintf('ENOB = %4.1fBit\n',ENOB);
s5=sprintf('THD = %4.1fdB\n',THD);
s1=sprintf('SFDR = %4.1fdB\n',SFDR);
text(37,-20,s2);
text(37,-35,s3);
text(37,-50,s4);
text(37,-65,s5);
text(37,-80,s1);
title('FREQ.DOMAIN');
xlabel('ADC FFT SPECTRUM');
ylabel('AMPLITUDE(dB)');
在进行低频信号计算时,还算可以。但是计算奈奎斯特频率下,THD会出现溢出问题。
如输入信号频率为49.99999MHz时,则har_pow_num=1,找不到高阶谐波。则Pd=Ph(1)-Ph(1)=0.
求助,在奈奎斯特频率下,如何计算THD?
多谢多谢! |
|