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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 6617|回复: 11

[求助] matlab算adc的snr等动态参数时出错。请懂的帮忙看一下

[复制链接]
发表于 2015-4-14 22:22:33 | 显示全部楼层 |阅读模式

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

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

x
之前没接触过matlab,现在做完adc要测参数就很头疼了。在论坛里找了个matlab代码。应该是结合美信的代码写的。仿snr,SINAD,SFDR等参数需要1024个点,但时间太长,就用17个点来试一下,matlab代码可行性。出错在65行,红色位置。错误为:
错误.png

请大神指导。
付美信错误段代码,看着是一样的,为什么会出错呢。
美信代码.png




代码为:
[size=12.380952835083px]clear
[size=12.380952835083px]load C:\Users\Administrator\Desktop\verilog3.txt    %WaveScan保存的波形文件,文件必须以英文开头
[size=12.380952835083px]A= verilog3;         %将测量数据赋给A,此时A为N×2的数组
[size=12.380952835083px]x=A(:,1);                     %将A中的第一列赋值给x,形成时间序列
[size=12.380952835083px]x=x';                         %将列向量变成行向量
[size=12.380952835083px]y=A(:,2);                     %将A中的第二列赋值给y,形成被测量序列
[size=12.380952835083px]y=y';                         %将列向量变成行向量


[size=12.380952835083px]%显示原始数据曲线图(时域)
[size=12.380952835083px]subplot(1,1,1);
[size=12.380952835083px]plot(x,y) ;                                                                               %显示原始数据曲线图
[size=12.380952835083px]xlabel('时间 (s)');
[size=12.380952835083px]ylabel('被测变量y');
[size=12.380952835083px]title('原始信号(时域)');
[size=12.380952835083px]grid on;


[size=12.380952835083px]format long;
[size=12.380952835083px]%傅立叶变换
[size=12.380952835083px]y=y-mean(y);                          %消去直流分量,使频谱更能体现有效信息
[size=12.380952835083px]fclk=(length(x)-1)/(max(x)-min(x));   %仪器的采样频率
[size=12.380952835083px]numpt=length(y);                      %data.txt中的被测量个数,即采样个数




[size=12.380952835083px]%If no window function is used, the input tone must be chosen to be unique and with
[size=12.380952835083px]%regard to the sampling frequency. To achieve this prime numbers are introduced and the
[size=12.380952835083px]%input tone is determined by fIN = fSAMPLE * (Prime Number / Data Record Size).
[size=12.380952835083px]%To relax this requirement, window functions such as HANNING and HAMING (see below) can
[size=12.380952835083px]%be introduced, however the fundamental in the resulting FFT spectrum appears 'sharper'
[size=12.380952835083px]%without the use of window functions.
[size=12.380952835083px]Doutw=y;
[size=12.380952835083px]%Doutw=y'.*hanning(numpt);
[size=12.380952835083px]%Doutw=y'.*hamming(numpt);
[size=12.380952835083px]%Performing the Fast Fourier Transform
[size=12.380952835083px]Dout_spect=fft(Doutw);


[size=12.380952835083px]%Recalculate to dB
[size=12.380952835083px]Dout_dB=20*log10(abs(Dout_spect));


[size=12.380952835083px]%Display the results in the frequency domain with an FFT plot
[size=12.380952835083px]figure; %建立图形
[size=12.380952835083px]maxdB=max(Dout_dB(1:numpt/2));
[size=12.380952835083px]%For TTIMD, use the following short routine, normalized to —6.5dB full-scale.
[size=12.380952835083px]%plot([0:numpt/2-1].*fclk/numpt,Dout_dB(1:numpt/2)-maxdB-6.5);
[size=12.380952835083px]%plot([0:30/2-1].*fclk/numpt,Dout_dB(1:30/2)-maxdB);
[size=12.380952835083px]plot([0:numpt/2-1].*fclk/numpt,Dout_dB(1:numpt/2)-maxdB);
[size=12.380952835083px]grid on;


[size=12.380952835083px]title('FFT PLOT');
[size=12.380952835083px]xlabel('ANALOG INPUT FREQUENCY (Hz)');
[size=12.380952835083px]ylabel('AMPLITUDE (dB)');
[size=12.380952835083px]a1=axis; axis([a1(1) a1(2) -120 a1(4)]);


[size=12.380952835083px]%Calculate SNR, SINAD, THD and SFDR values
[size=12.380952835083px]%Find the signal bin number, DC = bin 1
[size=12.380952835083px]fin=find(Dout_dB(1:numpt/2)==maxdB);  
[size=12.380952835083px]%Span of the input frequency on each side
[size=12.380952835083px]span=max(round(numpt/200),5);%span=max(round(numpt/200),5);
[size=12.380952835083px]%Approximate search span for harmonics on each side
[size=12.380952835083px]spanh=2;%spanh=2;
[size=12.380952835083px]%Determine power spectrum
[size=12.380952835083px]spectP=(abs(Dout_spect)).*(abs(Dout_spect));
[size=12.380952835083px]%Find DC offset power
[size=12.380952835083px]Pdc=sum(spectP(1:span));
[size=12.380952835083px]%Extract overall signal power
[size=12.380952835083px]Ps=sum(spectP(fin-span:fin+span));
[size=12.380952835083px]%Vector/matrix to store both frequency and power of signal and harmonics
[size=12.380952835083px]Fh=[];
[size=12.380952835083px]%The 1st element in the vector/matrix represents the signal, the next element represents
[size=12.380952835083px]%the 2nd harmonic, etc.
[size=12.380952835083px]Ph=[];
[size=12.380952835083px]%Find harmonic frequencies and power components in the FFT spectrum
[size=12.380952835083px]for har_num=1:10 %har_num谐波总数
[size=12.380952835083px]%Input tones greater than fSAMPLE are aliased back into the spectrum
[size=12.380952835083px]tone=rem((har_num*(fin-1)+1)/numpt,1); %rem(x,y)x除以y的余数  numpt(Number of Points)
[size=12.380952835083px]if tone>0.5
[size=12.380952835083px]%Input tones greater than 0.5*fSAMPLE (after aliasing) are reflected
[size=12.380952835083px]tone=1-tone;
[size=12.380952835083px]end
[size=12.380952835083px]Fh=[Fh tone];
[size=12.380952835083px]%For this procedure to work, ensure the folded back high order harmonics do not overlap
[size=12.380952835083px]%with DC or signal or lower order harmonics
[size=12.380952835083px]%har_peak=max(spectP(round(tone*numpt)-spanh:round(tone*numpt)+spanh));
[size=12.380952835083px]%har_bin=find(spectP(round(tone*numpt)-spanh:round(tone*numpt)+spanh)==har_peak);
[size=12.380952835083px]%har_bin=har_bin+round(tone*numpt)-spanh-1;
[size=12.380952835083px]%Ph=[Ph sum(spectP(har_bin-1:har_bin+1))];
[size=12.380952835083px]Ph=[Ph sum(spectP(har_num*(fin-1):har_num*(fin-1)+2))];
[size=12.380952835083px]end
[size=12.380952835083px]%Determine the total distortion power
[size=12.380952835083px]Pd=sum(Ph(2:10)); %Pd总失真功率  Ph(1) is fundamental harmonic谐波 power
[size=12.380952835083px]%Determine the noise power
[size=12.380952835083px]Pn=sum(spectP(1:numpt/2))-Ps-Pd;  %Pn噪声功率  Ps信号功率


[size=12.380952835083px]format;%设置输出格式
[size=12.380952835083px]SNR = 10*log10(Ps/Pn)    %信噪比
[size=12.380952835083px]SINAD=10*log10(Ps/(Pn+Pd)) % SINAD = 10*log10(Ps/(Pn+Pd))  信号与噪声失真比
[size=12.380952835083px]disp('THD is calculated from 2nd through 10th order harmonics');
[size=12.380952835083px]SFDR=10*log10(Ph(1)/max(Ph(2:10)))  %SFDR无杂散动态范围
[size=12.380952835083px]ENOB = (SINAD-1.76)/6.02
[size=12.380952835083px]disp('Signal & Harmonic Power Components:');
[size=12.380952835083px]HD=10*log10(Ph(1:10)/Ph(1))
发表于 2018-7-18 11:38:48 | 显示全部楼层
因:fin=find(Dout_dB(1:numpt/2)==maxdB);可能将直流分量当做最大值,那么fin=1.
那么:Ps=sum(spectP(fin-span:fin+span));
中fin-span将为负数,所以出错。
所以在求fin时,需将Dout_dB中的直流分量去除,再进行最大值的搜索。
发表于 2018-8-26 14:09:56 | 显示全部楼层
為了學習
发表于 2021-3-25 15:31:53 | 显示全部楼层


yahooszh 发表于 2018-7-18 11:38
因:fin=find(Dout_dB(1:numpt/2)==maxdB);可能将直流分量当做最大值,那么fin=1.
那么:Ps=sum(spectP(fin ...


那直流分量该怎么去除呢,按照MAXIM的代码就是Dout=code-(2^numbit-1)/2;感觉没什么用啊
发表于 2021-6-29 22:20:54 | 显示全部楼层
同问
发表于 2021-7-2 22:52:31 | 显示全部楼层
我用的同样的代码,同样的问题,怎么解决的
发表于 2022-4-3 11:31:50 | 显示全部楼层
同问,有人知道怎么解决的吗
发表于 2023-10-10 10:33:45 | 显示全部楼层


auch0311 发表于 2022-4-3 11:31
同问,有人知道怎么解决的吗


您好,请问这个问题您当时解决了吗?
发表于 2023-10-10 10:34:54 | 显示全部楼层


模拟电路入门者 发表于 2021-7-2 22:52
我用的同样的代码,同样的问题,怎么解决的


您好,请问这个问题您解决了吗?请问是如何解决的?
发表于 2023-10-10 10:35:56 | 显示全部楼层


vbstar 发表于 2021-3-25 15:31
那直流分量该怎么去除呢,按照MAXIM的代码就是Dout=code-(2^numbit-1)/2;感觉没什么用啊
...


您好,请问这个问题您是怎么解决的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-21 20:37 , Processed in 0.031173 second(s), 10 queries , Gzip On, Redis On.

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