马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
对于一个没有人带的ADC小白来说,每一步都很艰辛啊。当初偷懒仿真时没有用matlab,测试还是得还回来。
——————————没用的吐槽到此结束————————————————————————————
相信有一些小可爱跟我一样虽然网上一堆matlab资料,但是一头雾水无从下手。下面就跟大家分享一下从数据采集开始的“傻瓜”仿真数据处理步骤。非常非常基础的入门整理,大神请绕道走吧。
——————————正文分割线——————————————————————————————————————————
首先将cadence中波形导出,为matlab程序备用。(这里的cadence波形可以是经过理想DAC后还原的一个输出波形,也可以是未还原的几组数字信号,因为测试需要,我采用的是后一种。)
具体的导出方法是,选中波形曲线,在菜单栏中选择Trace——Export,在最下面可以选择开始和结束点以及步长。即可产生数据列表,默认为.csv文件。(Matlab可以处理.csv文件,但是为了速成,套用网上找来的程序模板,我把导出的数据复制后新建了.txt文本格式)
对于数据处理有一些重要的小说明:
按照我下面采用的程序,我将数据的抬头(也就是cadence中导出的bit名称的一栏删除了,另外只保留了一组横坐标),大概为下图所示。当然直接使用导出的文件一定也是可以的,只是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的问题都是没有滤掉直流。 有不对的地方也请大家指出哈。 |