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

标题: matlab流水线ADC仿真FFT频谱测试【求高手搭救】 [打印本页]

作者: xiamixiami    时间: 2012-5-20 16:52
标题: matlab流水线ADC仿真FFT频谱测试【求高手搭救】
小弟用matlab仿真1.5比特的十位ADC,采样率1e9

做FFT频谱测试时卡住了,求各位高手搭救


我用的FFT程序如下:
%data1=data(:,2);
%Data_in=load('ADC16.txt');
%>> plot(data1, 'DisplayName'; 'data1'; 'YDataSource'; 'data1'); figure(gcf)
%>> Data_in=data1;
fs=100e7;
DOUT_sum_uni=data;

len=length(DOUT_sum_uni);
N=len;
figure;
plot([1:N],DOUT_sum_uni);
title('TIME DOMAIN')
xlabel('SAMPLES');
ylabel('DIGITAL OUTPUT CODE');
zoom xon;

%performing FFT
DOUT_sum_uni=DOUT_sum_uni-mean(DOUT_sum_uni);
x=hann(N);
data_win=x.*DOUT_sum_uni;
x1=norm(x,1);                                 %?????ó??
Dout_spect=fft(data_win,N)/(x1);  
%recalculate to dB
Dout_dB=20*log10(abs(Dout_spect));
%plot([1:N/2],Dout_dB(1:N/2));
%display the results in the frequency domain with FFT plot
figure;
maxdB=max(Dout_dB(2:N/2));

%%for TTIMD,use the following short routine,normalized to -6.5dB
%full scale.
%plot([0:numpt/2-1].*fclk/numpt,Dout_dB(1:numpt/2)-maxdB-6.5);
plot([0:N/2-1].*(fs/N),Dout_dB(1:N/2)-maxdB);
%plot([0:numpt/2-1].*(fclk/numpt),Dout_dB(1:numpt/2));
grid on;
title('FFT PLOT');
xlabel('ANALOG INPUT FREQUENCY(MHz)');
ylabel('AMPLITUDE(dB)');
%a1=axis;axis([a1(1) a1(2)-120 a1(4)]);

%-----------------------------------------------%
%calculate SNR,SINAD,ENOB,THD and SFDR values
%-----------------------------------------------%
%find the signal bin number, DC=bin 1
fin=find(Dout_dB(1:N/2)==maxdB);

%Span of the input freq on each side
%span=5;
%span=max(round(N/400),5);
span=max(round(N/200),5);
%approximate search span for harmonics on each side
spanh=2;
%determine power spectrum
spectP=(abs(Dout_spect)).*(abs(Dout_spect));
%find DC offset power
Pdc=sum(spectP(1:span));
%extract overall signal power
%Ps=sum(spectP(span-fin:span+fin));
Ps=sum(spectP(fin-span:fin+span));

%vector/matric to store both freq and power of signals and harmonics
Fh=[];
%the 1st element in the vector/matrix represents the signal,
%the next element reps the 2nd harmonic,etc..
Ph=[];
%find harmonic freq and power components in the FFT spectrum
for har_num=1:10
%input tones greater than fSAMPLE are aliased back into the spectrum
tone=rem((har_num*(fin-1)+1)/N,1);
if tone>0.5
%input tones greater than 0.5*fSAMPLE(after aliasing) are reflected
tone=1-tone;
end
Fh=[Fh tone];
%for this procedure to work,ensure the folded back high order harmonics
%do not overlap
%with DC or signal or lower order harmonics
har_peak=max(spectP(round(tone*N)-spanh:round(tone*N)+spanh));
har_bin=find(spectP(round(tone*N)-spanh:round(tone*N)+spanh)==har_peak);
har_bin=har_bin+round(tone*N)-spanh-1;
Ph=[Ph sum(spectP(har_bin-1:har_bin+1))];
end

%determine the total distortion power
Pd=sum(Ph(2:5));
%determine the noise power
Pn=sum(spectP(1:N/2))-Pdc-Ps-Pd;

%inband_bin=1:N/2;
%fin_bin=fin-span:fin+span;
%harnoi_bin=setdiff(inband_bin,fin_bin);
%Phn=sum(spectP(harnoi_bin));
%SINAD2=10*log10(Ps/(Phn));
%ENOB2=(SINAD2-1.76)/6.02;
%fprintf('SINAD2=%gdB \n',SINAD2);
%fprintf('ENOB2=%g \n',ENOB2);
%disp('Calculation above is anther way to get SINAD and ENOB');

format;
A=(max(DOUT_sum_uni)-min(DOUT_sum_uni));
AdB=20*log10(A);

%SINAD=10*log10(Ps/(Pn+Pd));
%SNR=10*log10(Ps/Pn);
SINAD=10*log10(Ps/(Pn+Pd));
SNR=10*log10(Ps/(Pn));
disp('THD is calculated from 2nd through 5th order harmonics');
THD=10*log10(Pd/Ph(1));
SFDR=10*log10(Ph(1)/max(Ph(2:10)));
disp('Signal & Harmonic power components:');
HD=10*log10(Ph(1:10)/Ph(1));
ENOB =(SINAD-1.76)/6.0206;
%distinguish all harmonics locations within the FFT plot
hold on;
plot(Fh(2)*fs,0,'mo',Fh(3)*fs,0,'cx',Fh(4)*fs,0,'r+',Fh(5)*fs,0,'g*',Fh(6)*fs,0,'bs',Fh(7)*fs,0,'bd',Fh(8)*fs,0,'kv',Fh(9)*fs,0,'y^');
legend('1st','2nd','3rd','4th','5th','6th','7th','8th','9th');

fprintf('SINAD=%gdB \n',SINAD);
fprintf('SNR=%gdB \n',SNR);
fprintf('THD=%gdB \n',THD);
fprintf('SFDR=%gdB \n',SFDR);
fprintf('ENOB=%g \n',ENOB);





报错信息为:
??? Subscript indices must either be real positive integers or logicals.
Error in ==> fft at 59
Ps=sum(spectP(fin-span:fin+span));

能出图,但数据计算不了。。。求教!求教!
作者: 半支烟    时间: 2012-5-20 17:17
本帖最后由 半支烟 于 2012-5-20 17:21 编辑

你取了多少个点啊?是不是64个?这是因为fin-span小于等于0了。你点取多点试试。至少得256个吧。这个程序正确运行是有条件的。
作者: xiamixiami    时间: 2012-5-20 22:13
回复 2# 半支烟


    谢谢您的回答,
不知您说的是不是  data=simout(500:8691)     这个数值应该够了吧...试了data=simout(500:18691) 结果还是一样==
作者: 半支烟    时间: 2012-5-20 23:14
我以前是认真看过这段代码的,参考美信的吧,他那个代码是没有问题的,你取点取好了是可以正确运行的。
作者: 半支烟    时间: 2012-5-20 23:19
本帖最后由 半支烟 于 2012-5-20 23:20 编辑

对了,你有没有减掉DC分量呢?你在命令行输入fin看看等于几
作者: fuyibin    时间: 2012-5-21 12:25
回复 1# xiamixiami

这个程序不是用来给你ADC仿真做频谱分析的
是实际测试的raw data 做分析用的
作者: fayfay    时间: 2012-5-22 07:39
回复 6# fuyibin


    这两种有啥区别呢?我平时没有想到测试与仿真的程序还有不同,都用了一种。
而且,我试了试这段程序,用了一千多个点及三千多个点,都能运行完程序,没出现那个错误。
作者: fuyibin    时间: 2012-5-22 08:03
回复 7# fayfay

这个程序定义span / bin等参数 ,是针对实际测试中信号频率不集中等
实际测试时候我们通常取点非常多,比如65536,至少也要8192
那么信号频率不可能再一个bin上,可能会分散在信号频率左右个几个bin上,这些都要算成信号能量
谐波也是一样的道理
而你仿真不会这么长,去做8192或者更多点的dft,而且仿真加的是理想信号,非相干采样
应该就是取信号频率这一个频点的能量来计算snr/sfdr/thd
试试这个程序256point dft可以做么?一直都是cadence里直接做analysis的,matlab没试过,不知道
作者: xiamixiami    时间: 2012-5-22 10:26
回复 5# 半支烟


    再次感谢,谢谢
我输fin也报错。。。可能本身的结构有些问题,我再试试,不知您那有美信的代码吗?
作者: xiamixiami    时间: 2012-5-22 10:34
回复 8# fuyibin


    学习了,谢谢
作者: xiamixiami    时间: 2012-5-22 10:35
回复 7# fayfay


    看来可能还是我流水线结构的问题,或是线路里参数设得不对
作者: fayfay    时间: 2012-5-22 17:26
回复 8# fuyibin


    额,256个点是可以的,我又试了试128个点,也可以,ENOB因点数不够,降了。
    还有啊,测试时加了filter,可以解决信号频率不集中的问题吗?
作者: 半支烟    时间: 2012-5-22 18:47


   
回复  半支烟


    再次感谢,谢谢
我输fin也报错。。。可能本身的结构有些问题,我再试试,不知您那 ...
xiamixiami 发表于 2012-5-22 10:26



( , 下载次数: 826 )
作者: xiamixiami    时间: 2012-5-22 22:56
回复 13# 半支烟


谢谢您的资料

大神,我的fin值出来了:fin =17           。。。可是不清楚它代表什么==  求教
作者: 半支烟    时间: 2012-5-23 01:09


   
回复  半支烟


谢谢您的资料

大神,我的fin值出来了:fin =17           。。。可是 ...
xiamixiami 发表于 2012-5-22 22:56




    它表示输入信号在频谱中的位置啊。。频谱中最右边的,也就是bin=1是直流分量。bin=17就是你的输入信号了
作者: robberxiong    时间: 2012-6-3 13:56
楼上几位都是高手啊,俺也在做ADC 的FFT分析,头痛中!
作者: ahudesigner    时间: 2012-6-14 22:16
顶啊,我也不会
作者: hijackly    时间: 2012-6-21 16:22
good reference for adc testing
作者: 505928532    时间: 2012-9-14 17:19
看看啊   学习
作者: zhanghao301    时间: 2012-10-31 09:26
回复 15# 半支烟


    您好,做ADC的频谱分析时,由于输出是多位数字信号,那么需要将数字信号用理想DAC转为模拟信号再做FFT,还是直接将数字信号求和后做FFT,期待您的回答。
作者: xiamixiami    时间: 2012-10-31 09:47
回复 22# zhanghao301


    我是用DAC转换后的信号做的FFT
作者: zhanghao301    时间: 2012-10-31 14:18
回复 15# 半支烟


    大神,能大概解释一下 Q2 Random walk 电流源的布局原理吗,我看文献实在是看不太懂啊,他似乎也没有仔细说明。
作者: 半支烟    时间: 2012-10-31 22:16


   
回复  半支烟


    您好,做ADC的频谱分析时,由于输出是多位数字信号,那么需要将数字信号用理想DAC转 ...
zhanghao301 发表于 2012-10-31 09:26




    转化成模拟量再FFT,用理想DAC或者matlab处理
作者: 半支烟    时间: 2012-10-31 22:18


   
回复  半支烟


    大神,能大概解释一下 Q2 Random walk 电流源的布局原理吗,我看文献实在是看不太懂 ...
zhanghao301 发表于 2012-10-31 14:18




    那篇论文应该有描述原理吧。不过我记得好像只是一个大概的布局,具体怎么步还得自己琢磨。
作者: zhanghao301    时间: 2012-11-1 09:48
回复 26# 半支烟


谢谢您的回复,我再研究研究...
作者: hitpiano    时间: 2012-11-8 09:36
sighghghghg
作者: bin28    时间: 2013-5-15 13:19
有大神
作者: james5168qoo    时间: 2013-5-17 17:48
感謝分享!~~感謝分享!~~感謝分享!~~感謝分享!~~感謝分享!~~感謝分享!~
作者: 菜鸟RFIC    时间: 2013-11-20 21:39
回复 25# 半支烟


  你好,我先在做Pipeline ADC,想对采样保持电路的输出做FFT。指教一下如何从cadence中导出对应的数据在matlab中做FFT分析呢?谢谢!
作者: emma1987    时间: 2013-11-21 20:47
回复 31# 菜鸟RFIC

  可以直接在CADENCE里做FFT的,如果想导出来的话,先做采保输出波形形,选中波形,某菜单里有table选项,打开,选择采样的开始结束点以及步长就可以生产数据列表了,存一下就可以啦~
作者: 菜鸟RFIC    时间: 2013-11-24 02:30
回复 32# emma1987


   谢谢回复!请问你是如何仿真比较器的失调电压呢?我看很多论文上都提到用蒙特卡洛分析失调电压,但是我不太会用,也找了很多相关资料没太明白,能指教一下吗?谢谢!
作者: ldraul    时间: 2014-2-16 23:35
感谢分享,下了美兴的动态测试,研究一下
作者: qqgomy    时间: 2014-4-12 23:51
学习了
作者: kenxiluo    时间: 2014-5-26 21:03
回复 2# 半支烟


   请问我使用该程序得到的fin值始终较小,小于span=5,观察频谱发现dc和基带频率中间没有谐波,是不是采样点数太少了?另外我在cadence输出的dft频谱上没有观察到噪声频率,只有谐波,请问这正常吗?期待您的回答
作者: spicemonkey    时间: 2014-5-27 10:21
回复 36# kenxiluo


    增加输入信号频率
作者: mikeppq    时间: 2014-5-27 14:22
谢谢,学习很多啊
作者: xiadafang    时间: 2014-5-27 14:33


   
转化成模拟量再FFT,用理想DAC或者matlab处理
半支烟 发表于 2012-10-31 22:16




   不转化为 模拟量不是更准确么,DAC会给测试结果带来影响啊
作者: tyb0220    时间: 2014-5-27 16:53
强大 学习了
作者: ralphtw    时间: 2014-6-27 17:07
is it correct ?!
作者: hitprince    时间: 2014-12-6 18:30
路过学习一下
作者: duandaodream    时间: 2014-12-27 20:11
have  a  look
作者: 水平川    时间: 2015-4-17 11:13
多谢分享
作者: 幸福微甜    时间: 2015-8-29 20:05
学习了!
作者: lbhnnyxy    时间: 2015-10-11 22:33
学习,学习
作者: fdme    时间: 2015-11-10 09:27
学习一下
作者: xidianmhp    时间: 2016-1-20 10:22
你们都是高手
作者: quantus    时间: 2016-1-20 17:17


   
回复  fayfay

这个程序定义span / bin等参数 ,是针对实际测试中信号频率不集中等
实际测试时候我们通 ...
fuyibin 发表于 2012-5-22 08:03



1. 仿真也要用相干采样, 否则输入信号本身会包含很多能量很高的谐波.
2. 仿真, 尤其是MATLAB仿真取的点数也非常多, 采样点数太少容易造成分辨率不够, 具体可以看看process gain.  
3. 一般MATLAB常见算SNR的方法(比如SDM toolbox)算信号能量会取输入信号bin点及其左右各一个点.
作者: quantus    时间: 2016-1-20 17:23
回复 22# zhanghao301


    写个VerilogA模块直接把采保的输出读到一个.csv文件里, 然后用MATLAB处理数据, 下面给你个保存数据的VerilogA代码的例子, 我自己写的用起来很方便:
`include "constants.vams"
`include "disciplines.vams"

module DATA_LOG( clk, data_in );
  parameter VREF_P = 5.0;
  parameter VREF_N = 0.0;
  parameter VTH    = 2.5;
  parameter NUM_OF_CODES = 512;

  input clk, data_in;

  electrical clk, data_in;

  integer fid, i;

  analog
    begin
      @( initial_step )
        begin
          fid = $fopen( "path/SH_SNDR.csv", "w" ); //保存数据到双引号内的路径
          i   = 0;
        end
      @( cross( V( clk ) - VTH, +1 ) )
        begin
          $fstrobe( fid, " %g ", V( data_in ) );
          i = i + 1;
          if ( i > NUM_OF_CODES )
            begin
              $strobe ( " Simulation terminates! " );
              $fclose( fid );
            end
        end
    end
endmodule
作者: 蓝色薰衣草    时间: 2016-3-28 16:18
回复 1# xiamixiami


   最近也在做ADC测试,请问大神不同类型的ADC测试程序一样吗,对于SAR型和Delta-Sigma型ADC可以借鉴您的程序吗~~~求指导
作者: grace1100    时间: 2016-3-29 11:14
学习中....
作者: 136242644    时间: 2016-5-11 17:56
这个需要MARK一下!~
作者: 2Dota    时间: 2017-3-28 15:55
回复 51# 蓝色薰衣草


   兄弟,我对pipeline ADC,直接对输出的12路数据进行fft分析,没有经过dac转换,不知道你有没有这样的fft文件?能否给我一份啊。万分感谢。
作者: maosheng    时间: 2017-5-23 23:09
回复 13# 半支烟
谢谢分享,好东西
作者: xiaowenrun    时间: 2017-8-29 17:14
回复 13# 半支烟


   thanks
作者: 微二    时间: 2018-9-21 11:18
谢谢分享
作者: headforever    时间: 2018-11-7 17:12
很好。一直在学习。
作者: wutong56tg    时间: 2019-2-26 19:28
为什么我的fin=1。。。。。。
作者: phoenix219    时间: 2019-5-11 10:13
学习啦
作者: 孤独的自由    时间: 2019-5-27 21:52
研究看看
作者: 孤独的自由    时间: 2019-5-27 21:56
研究看看
作者: dc33912345    时间: 2023-10-10 10:51


   
wutong56tg 发表于 2019-2-26 19:28
为什么我的fin=1。。。。。。


您好,fin=1这个问题您解决了吗?





欢迎光临 EETOP 创芯网论坛 (原名:电子顶级开发网) (https://bbs.eetop.cn/) Powered by Discuz! X3.5