在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 38188|回复: 62

[原创] cadence设计ADC动态性能指标仿真的matlab程序及入门级步骤详解

[复制链接]
发表于 2018-7-12 11:22:06 | 显示全部楼层 |阅读模式

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

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

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的问题都是没有滤掉直流。

有不对的地方也请大家指出哈。
发表于 2018-7-17 17:04:47 | 显示全部楼层
你好,我想要导出.csv文件,但是不能设置采样频率,不知怎么回事?没有找到calculate result display,希望帮帮忙
 楼主| 发表于 2018-7-18 10:03:28 | 显示全部楼层
回复 2# 普雅花
不是在计算器中进行的结果输出。将你的输出波形选中后右键——send to——Export.
到了保存文件类型的界面里。
可以设置File name  / File of type(默认CSV)/
勾选 Clip Data (可以选择起始和结束时间)/勾选Interpolate(可以设置Step Size,就是你的采样步长)
发表于 2018-7-18 14:47:51 | 显示全部楼层
回复 3# 不会起名字的xxx
这样啊,好的我试试,谢谢啊~不知道楼主用MATLAB求没求过sigma delta调制器构成的小数分频器的功率谱密度。希望有时间帮帮忙~
发表于 2018-8-15 21:18:20 | 显示全部楼层
回复 3# 不会起名字的xxx


   请问楼主,如果取的信号周期为整周期的话,是不是可以不加窗函数?这样出来的结果是否有差异?我在simulink中仿真的时候加汉宁窗与不加窗即加矩形窗有着较大的区别,矩形窗的底噪提升了,存在一定的频谱泄漏,但是我已经取了整数个信号周期,按道理讲应该没有频谱泄漏的问题了,这是为什么呢?求助~~谢谢您!
发表于 2018-8-27 10:19:46 | 显示全部楼层
请教一个问题哈,芯片测试的时候,怎么抓取RX中的ADC的输出的数据呢?用逻辑分析仪吗??
 楼主| 发表于 2018-8-27 16:47:27 | 显示全部楼层
回复 6# clarepassby
是的。
发表于 2018-8-28 10:49:47 | 显示全部楼层
回复 7# 不会起名字的xxx

再打扰一下啊!那如果不用逻辑分析仪,通过MCU可以抓数吗?谢谢
 楼主| 发表于 2018-8-29 17:02:46 | 显示全部楼层
回复 8# clarepassby

我看过有人用FPGA抓数据  我想单片机应该也可以。不过要考虑ADC的速率,应该受接口速率的限制。
这只是我的一点浅见。我本人没有这样做过,也是刚入门的小白一个。
发表于 2018-8-31 10:18:51 | 显示全部楼层
回复 9# 不会起名字的xxx


    OkayOkay,谢谢你
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-9-22 13:33 , Processed in 0.022427 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表