|
楼主 |
发表于 2021-7-21 09:27:14
|
显示全部楼层
clc;
clear;
n=10^-9;
%data=load('D:\Weplay\Time5.1\03 ProjectX\001 2020.7_NewSwitch\Cad_test1\LAYOUTEST\1.txt');
data=csvread('C:\Users\dell\Desktop\198M.csv',1,1,[1 1 1072 8]);
data1=data./1.2;
fft_num=2^10; %% fft点数
start_fft=2; %% 起始取点位置
Dout1=data1(start_fft:start_fft+fft_num-1,;
Dout= Dout1*[128 64 32 16 8 4 2 1]';
num=length(Dout);
fs=400;
%%%%%% FFT calculation %%%%%%%%%%%
numpt=length(Dout);
spect=fft(Dout);
dB=20*log10(abs(spect));
maxdB=max(dB(2:numpt/2));
for k=1:length(dB)
if dB(k)<n
dB(k)=-n;
else dB(k)=dB(k);
end
end
figure;
Q=plot([0:numpt/2-1].*fs/numpt,dB(2:numpt/2+1)-maxdB,'k');%plot作图(横坐标数值,纵坐标数值)基带
grid on; %添加网格
zoom; %放大
% axis tight;
set(gca,'linewidth',2) %在做的图上插入坐标轴的坐标标注
set(gca,'fontsize',28,'fontname','Times New Roman');
set(Q,'linewidth',1.5);
xlabel('ANALOG INPUT FREQUENCY (MHz)','fontsize',30,'fontname','Times New Roman'); %X轴建立
ylabel('AMPLITUDE (dB)','fontsize',30,'fontname','Times New Roman'); %Y轴建立
a1=axis;
% 找出输入频率并计算功率谱
fi=find(dB(1:numpt/2)==maxdB); %找出输入信号的位置 ,maxdB是输入信号的幅值(最大)
span=0;%输入频谱范围
spectP=(abs(spect)).*(abs(spect)); % 求功率谱(幅度平方作为信号中功率的度量)spect为FFT后的结果,8192*1 的复数矩阵
Ps=sum(spectP(fi-span:fi+span)); % 输入信号功率,sun(X)求X的列之和; fi-输入信号的频率
Psum=sum(spectP(2:numpt/2)); %基带的信号总功率之和
Dout_SF=abs(dB(2:numpt/2+1)-maxdB);%基带中的放大倍数(经过处理后,距离输入信号(最大)的dB数)
Dout_SFDR_1=min(Dout_SF(1fi-2)));%输入信号频率前的最小值
Dout_SFDR_2=min(Dout_SF(fi:length(Dout_SF)));
%输入信号频率后到奈奎斯特频带边界的最小值 ;length(Dout_SF)=4096 (num/2)`
%求动态参数
fin=(fi-1)/numpt.*fs;
% fi=112(与一开始定义fin的有关),num=numpt =8192=num=2^13(FFT number)
SFDR=min(Dout_SFDR_1,Dout_SFDR_2);
%无杂散动态范围 SFDR。表现为输入信号分量与第一奈奎斯特频带(0-fs/2)内最大杂散或者噪声分量之差。
SNDR=10*log10(Ps/(Psum-Ps));%信噪声失真比 SNDR 。(Psum-Ps)表示噪声、谐波能量总和的比值
ENOB=(SNDR-1.76)/6.02;%有效位数 ENOB
text(a1(2)/5,a1(3)/5, sprintf('SFDR=%3.2fdB\nSNDR=%3.2fdB\nENOB=%3.2fbit@%3.4fMHz',...
SFDR,SNDR,ENOB,fin),...
'EdgeColor','black','LineWidth',2,'fontsize',32,'BackgroundColor',...
[1 1 1],'Margin',5,'fontname','Times New Roman');
|
|