马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册
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的问题都是没有滤掉直流。有不对的地方也请大家指出哈。