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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3263|回复: 7

[求助] matlab的fft代码,我好像写错了很多,求助

[复制链接]
发表于 2019-3-12 15:43:32 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 cp214 于 2019-3-13 09:31 编辑

2楼fft代码。3楼理想sar+dac代码
Nsample对应ADC采样,Fsample是ADC的采样频率,是时域采样;Nfft是做fft时在频域中对量化器输出进行采样。
fft的结果,频域横坐标分辨率为Fsample/Nfft。
如果上面的说法没错的话,我遇到两个问题:
1、我想看Fsample、2*Fsample、3*Fsample处的谐波,看不到,横坐标貌似只能到Fsample/Nfft*Nfft=Fsample。
我在spectre里面用DFT都好好的。。。
2、Nfft=Nsample和Nfft=2*Nsample出来的频谱完全不一样。乘2我认为只是提高了分辨频率吧?

求大家解惑


编辑。
我自己搞错了,代码得改改。代码中Nsample是adc的采样,这是不对的,连续的sin信号,被量化器采样,这些数据应该在matlab中再次时域采样,然后在频域中采样进行fft
 楼主| 发表于 2019-3-12 15:44:13 | 显示全部楼层
本帖最后由 cp214 于 2019-3-12 16:03 编辑

clear all;clc
Fsample=10e6;
Nin=31;
Nsample=128;
Tsample=1/Fsample;
Tin=Tsample*Nsample/Nin;
Fin=1/Tin;
Nfft=Nsample*1;%FFT 点数,Nfft与Nsample有区别

t=(0:Nsample-1)*Tsample;
Vsample=0.5+0.5*cos(2*pi*Fin*(0:Nsample-1)*Tsample);

freq=(0:Nfft-1)/Nfft*Fsample;%频域横坐标

Vquantizer=arrayfun(@function_quantizer,Vsample);  %%%%%%%采样过后的sin信号输入到量化器

Vsample_fft=abs(fft(Vsample,Nfft)*2/Nsample);
Vquantizer_fft=abs(fft(Vquantizer,Nfft)*2/Nsample);


array_freq_clip=freq(1:Nfft/1);
Vsample_fft_clip=Vsample_fft(1:Nfft/1);
Vquantizer_fft_clip=Vquantizer_fft(1:Nfft/1);


figure(1);
plot(array_freq_clip,Vsample_fft_clip);
title('vin fft');
xlabel('f(Hz)');
ylabel('vin fft');
figure(2);
plot(array_freq_clip,Vquantizer_fft_clip);
title('vout fft');
xlabel('f(Hz)');
ylabel('vout fft');

figure(3);
plot(array_freq_clip,20*log10(Vsample_fft_clip));
title('vin fft log');
xlabel('f(Hz)');
ylabel('vin fft log');

figure(4);
plot(array_freq_clip,20*log10(Vquantizer_fft_clip));
title('vout fft log');
xlabel('f(Hz)');
ylabel('vout fft log');

figure(5);
stairs(t,Vsample);
title('vin time domain');
xlabel('t(s)');
ylabel('vin');

[vout_fft_sort,vout_fft_index]=sort(Vquantizer_fft_clip);
vout_fft_value1=vout_fft_sort(Nfft/2);
vout_fft_index1=vout_fft_index(Nfft/2);
vout_fft_freq1=(vout_fft_index1-1)*Fsample/Nfft;
vout_fft_value2=vout_fft_sort(Nfft/2-1);
vout_fft_index2=vout_fft_index(Nfft/2-1);
vout_fft_freq2=(vout_fft_index2-1)*Fsample/Nfft;
vout_fft_value3=vout_fft_sort(Nfft/2-2);
vout_fft_index3=vout_fft_index(Nfft/2-2);
vout_fft_freq3=(vout_fft_index3-1)*Fsample/Nfft;

[vin_fft_sort,vin_fft_index]=sort(Vsample_fft_clip);
vin_fft_value1=vin_fft_sort(Nfft/2);
vin_fft_index1=vin_fft_index(Nfft/2);
vin_fft_freq1=(vin_fft_index1-1)*Fsample/Nfft;
vin_fft_value2=vin_fft_sort(Nfft/2-1);
vin_fft_index2=vin_fft_index(Nfft/2-1);
vin_fft_freq2=(vin_fft_index2-1)*Fsample/Nfft;
vin_fft_value3=vin_fft_sort(Nfft/2-2);
vin_fft_index3=vin_fft_index(Nfft/2-2);
vin_fft_freq3=(vin_fft_index3-1)*Fsample/Nfft;


SNR=20*log10(vout_fft_value2/vout_fft_value3);
ENOB=(SNR-1.76)/6.02;
 楼主| 发表于 2019-3-12 15:58:02 | 显示全部楼层
量化器代码

function dec_data=dec_data(vin)

vref=1;
Bit=12;
%vin=0.5;
LSB=vref/2^Bit;
vcomp=vref/2;

data=[];
for i=1:Bit-1   
    if(vin<vcomp) sign=0;
    else sign=1;
    end   
    vcomp=vcomp+(sign-1)*vref/2^i+vref/2^(i+1);
    data(i)=sign;
end
if(vin<vcomp) sign=0;
else sign=1;
end
data(Bit)=sign;

dec_data=0;
for i=1:Bit
    dec_data=dec_data+data(i)*2^(Bit-i);
end
dec_data=dec_data/2^Bit;
 楼主| 发表于 2019-3-12 16:11:40 | 显示全部楼层
Vsample1=0.5*cos(2*pi*Fin1*(0:Nsample-1)/Fsample);
Vsample2=0.2*cos(2*pi*Fin2*(0:Nsample-1)/Fsample);
Vsample3=0.8*cos(2*pi*Fin3*(0:Nsample-1)/Fsample);
Vsample=0.5+Vsample1+Vsample2+Vsample3;

对这个信号fft,Nfft=Nsample*1和Nfft=Nsample*2完全不一样

系数1

系数1


系数2

系数2
 楼主| 发表于 2019-3-12 16:13:09 | 显示全部楼层
3楼代码

clear all;clc
Fsample=1e6;
Nin1=31;
Nin2=62;
Nin3=124;
Nsample=2048;
Fin1=Nin1/Nsample*Fsample;
Fin2=Nin2/Nsample*Fsample;
Fin3=Nin3/Nsample*Fsample;
FUsample=Fsample/Nsample;
Nfft=Nsample*2;
FUfft=Fsample/Nfft;


Vsample1=0.5*cos(2*pi*Fin1*(0:Nsample-1)/Fsample);
Vsample2=0.2*cos(2*pi*Fin2*(0:Nsample-1)/Fsample);
Vsample3=0.8*cos(2*pi*Fin3*(0:Nsample-1)/Fsample);


Vsample=0.5+Vsample1+Vsample2+Vsample3;
                                                                                                                             
freq=(0:Nfft-1)/Nfft*Fsample;%频域横坐标

Vquantizer=arrayfun(@function_quantizer,Vsample);

Vsample_fft=abs(fft(Vsample,Nfft)*2/Nsample);
Vquantizer_fft=abs(fft(Vquantizer,Nfft)*2/Nsample);


array_freq_clip=freq(1:Nfft/1);
Vsample_fft_clip=Vsample_fft(1:Nfft/1);
Vquantizer_fft_clip=Vquantizer_fft(1:Nfft/1);


figure(1);
plot(array_freq_clip,Vsample_fft_clip);
title('vin fft');
xlabel('f(Hz)');
ylabel('vin fft');

figure(2);
plot(array_freq_clip,20*log10(Vsample_fft_clip));
title('vin fft log');
xlabel('f(Hz)');
ylabel('vin fft log');
发表于 2019-3-13 08:51:46 | 显示全部楼层
xuexi le
发表于 2019-3-13 09:24:04 | 显示全部楼层
看看先,楼主解决了,把正确代码贴一下哦。为论坛留下些宝贵参考资料
发表于 2024-8-13 17:40:31 | 显示全部楼层
学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-22 10:33 , Processed in 0.021016 second(s), 7 queries , Gzip On, Redis On.

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