马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
用我设计的14bitADC加理想DAC,采1024个数据,做fft分析时,报如下错误。
我怀疑是我的数据有问题,于是对理想正弦波相干采样,踩了1024个点,也是报如下问题。
我怀疑肯能是采出来的数据需要进行处理一下才可以,因为我用如下fft程序,加载很早以前采出来的数据进行fft分析,是能跑通的。
高手帮忙分析一下是什么原因,拜谢了!
另外问一下,14bit ADC做fft分析,没有必要必须采大于2^14个点的数据吧?
>> sim_fft
下标索引必须为正整数类型或逻辑类型。
出错 sim_fft (line 22)
Ps = sum(pow_spec(fin-widm:fin+widm));
fft程序如下:
clear all;
vout=load('sine.txt');
vout = vout(:,2);
vout = vout(1:length(vout)-1);
vout = rot90(vout);
d_len = length(vout);
vout = vout.*rot90(kaiser(d_len,18));
pow_spec = fft(vout).*conj(fft(vout));
pow_spec = pow_spec/max(pow_spec);
d_len2 = floor(d_len/2);
pow_spec = pow_spec(1:d_len2);
% find the signal bin number
fin = find(pow_spec(1:d_len2)==1);
% set the main lobe width of the input signal
widm = 6; %设置信号的主瓣宽度,主瓣的宽度=2*widm+1,对于整数个周期采样,令widm=0即可
widmh = 2; % 设置用于寻找谐波位置的范围
%*****************求直流失调功率**************************************
Pdc = sum(pow_spec(1:widm));
%*****************求信号总功率****************************************
Ps = sum(pow_spec(fin-widm:fin+widm));
% 定义谐波位置和大小的数组变量
Fh = []; Ph=[];
%*****************寻找谐波位置和其幅值********************************
for har_num=1:10
tone=rem((har_num*(fin-1)+1)/d_len, 1);
if tone>0.5 tone=1-tone; end
Fh = [Fh tone];
har_peak = max(pow_spec(round(tone*d_len)-widmh:round(tone*d_len)+widmh));
har_bin = find(pow_spec(round(tone*d_len)-widmh:round(tone*d_len)+widmh)==har_peak);
har_bin = har_bin+round(tone*d_len)-widmh-1;
Ph = [Ph sum(pow_spec(har_bin-1:har_bin+1))];
end
%*****************求总谐波失真功率********************************
Pd = sum(Ph(2:5));
%*****************求噪声功率********************************
Pn = sum(pow_spec)-Pdc-Ps-Pd;
%*****************求ADC动态指标**********************************
format;
SNDR = 10*log10(Ps/(Pn+Pd)) %求SNDR
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_EFF = (SNDR-20*log10(vpp)-1.76)/6.02 % 等效分辨率
ENOB = (SNDR-1.76)/6.02
%***************** 画出功率谱 *****************************************
xz = 0:1/d_len d_len2-1)/d_len; %这里的xz只是对X轴坐标进行了重新定义,在最终画功率谱图时将xz作为X轴的坐标
plot(xz,10*log10(pow_spec)) %画功率谱图,Y轴是对数刻度
%title('ADC Output Spectrum')
xlabel('fi/fs')
ylabel('Power (dB)')
axis([0,0.5,-120,0])
grid
|