【ADC】分析ADC动态参数的MATLAB代码

首先将cadence中波形导出,为matlab程序备用。(这里的cadence波形可以是经过理想DAC后还原的一个输出波形,也可以是未还原的几组数字信号,因为测试需要,我采用的是后一种。)
具体的导出方法是,选中波形曲线,在菜单栏中选择Trace——Export,在最下面可以选择开始和结束点以及步长。即可产生数据列表,默认为.csv文件。(Matlab可以处理.csv文件,但是为了速成,套用网上找来的程序模板,我把导出的数据复制后新建了.txt文本格式)

%F:\matlab_work\ADC_8bit_test6.m
%F:\matlab_work\ADC_8bit_1024_249M.txt
%8 bits 1Gsps ADC vin=249.0234375MHz,1024采样点(相干性采样)
%by.HZY
clear all;clc;close all;
numpt=1024;

% fclk=455/16/14;


% a=textread('dds_data_out.txt','%s')';%以字符形式打开文件
% a=dlmread('sample_data.txt','%s')';%以字符形式打开文件
a=dlmread('ADC_8bit_1024_249M.txt','%s')';%以字符形式打开文件

% for i = 1:numpt
% v1(i) = bitxor(v1(i),15872);
% end

%v1 is a column vector(1:numpt), and count is its length
%v1=dlmread('F:\pelican_ADC_test\vjtag_prj\data_analysis\single_tone.txt','');
%fclose(fid);
%change v1 into a row vector


adc_data=a';%采样得出的数据形成的矩阵

vin=1;d7=2;d6=3;d5=4;d4=5;d3=6;d2=7;d1=8;d0=9;%标示样本矩阵的列
vref=0.512;
fclk=1e9;%A/D转换器的采样频率
adc_bit=8;
for i=1:1:numpt
dout(i)=(adc_data(i,d7)/2+adc_data(i,d6)/4+adc_data(i,d5)/8+adc_data(i,d4)/16+adc_data(i,d3)/32+adc_data(i,d2)/64+adc_data(i,d1)/128+adc_data(i,d0)/256)*vref;%通过转换器出来的结果,恢复原来的波形

doute(i)=dout(i)-1;%将正弦波的共模电平偏置为0
%doute(i)=dout(i)-mean(dout(i));
end
figure(3)
plot(doute);
doutw=doute.*hanning(numpt)';%加汉宁窗
%doutw=doute;
dout_spect=fft(doutw);%进行FFT变换,然后利用下面的算法求出SNR、SINAD、SFDR
dout_dB=20*log10(abs(dout_spect));
maxdB=max(dout_dB(1:numpt/2));
x=((0:numpt/2-1).*fclk/numpt)/1000000; % fclk/numpt为频谱分辨率,即frequency bin。因为FFT频谱图关于中心对称所以只要分析一半的频谱图即可
y1=dout_dB(1:numpt/2)-maxdB;
figure(1)
plot(x,y1);
axis([0,520,-120,5]);
grid off;
title('1024-Samples FFT spectrum');
xlabel('Frequency (kHz)');
ylabel('Magnitude (dB)');%画出FFT的幅频特性曲线

figure(2)
plot(dout_dB);

fin=find(dout_dB(1:numpt/2)==maxdB);%找出幅度最大的频率点
span=max(round(numpt/200),5);%round函数四舍五入
%span=10;
spanh=2;
spectp=(abs(dout_spect)).*(abs(dout_spect));%幅度的平方
Pdc=sum(spectp(1:span));%spectp函数
Ps=sum(spectp(fin-span:fin+span));%信号的幅度平方和
Fh=[];
Ph=[];
for har_num=1:10%寻找110次谐波分量
tone=rem((har_num*(fin-1)+1)/numpt,1);%rem(a,b)为a除以b取余数
if tone>0.5
tone=1-tone;
end
Fh=[Fh tone];
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));
Pn=sum(spectp(1:numpt/2))-Pdc-Ps-Pd;
format;
SNR=10*log10(Ps/Pn)
SINAD=10*log10(Ps/(Pn+Pd))
SFDR=10*log10(Ph(1)/max(Ph(2:10)))
ENOB=(SINAD-1.76)/6.02
  • Frequency/FFT bins 说明:

【ADC】分析ADC动态参数的MATLAB代码_第1张图片

你可能感兴趣的:(软件安装/学习,matlab)