matlab icpt系统建模,cadence设计ADC动态性能指标仿真的matlab程序及入门级步骤详解...

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x

对于一个没有人带的ADC小白来说,每一步都很艰辛啊。当初偷懒仿真时没有用matlab,测试还是得还回来。

——————————没用的吐槽到此结束————————————————————————————

相信有一些小可爱跟我一样虽然网上一堆matlab资料,但是一头雾水无从下手。下面就跟大家分享一下从数据采集开始的“傻瓜”仿真数据处理步骤。非常非常基础的入门整理,大神请绕道走吧。

%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)-0.6125;%将正弦波的共模电平偏置为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为频谱分辨率,因为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);

%span=10;

spanh=2;

spectp=(abs(dout_spect)).*(abs(dout_spect));%幅度的平方

Pdc=sum(spectp(1:span));

Ps=sum(spectp(fin-span:fin+span));%信号的幅度平方和

Fh=[];

Ph=[];

for har_num=1:10%寻找1至10次谐波分量

tone=rem((har_num*(fin-1)+1)/numpt,1);

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

——————————————————程序结束,划重点——————————————————————

一定要滤除直流分量,在网上看到的问题里有百分之50的问题都是没有滤掉直流。有不对的地方也请大家指出哈。

你可能感兴趣的:(matlab,icpt系统建模)