sxinwei 发表于 2007-6-2 16:18

求助:matlab给出的fft例子的问题

matlab中给出的fft例子如下:
t = 0:0.001:0.6;
x = sin(2*pi*50*t)+sin(2*pi*120*t);
y = x + 2*randn(size(t));
plot(1000*t(1:50),y(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('time (milliseconds)')
Y = fft(y,512);
Pyy = Y.* conj(Y) / 512;
f = 1000*(0:256)/512;
plot(f,Pyy(1:257))
title('Frequency content of y')
xlabel('frequency (Hz)')

画出的波形见附件
在画出的频谱图中x轴表示频率,y轴表示的什么意思?是能量吗?还是信号的幅值?
如果是幅值的话,50hz和120hz的信号幅值不是应该为1吗?为什么是70呢?
如果我想要它的y轴表示幅值,程序应该怎么修改呢?
不好意思,刚刚接触fft,谢谢大家的帮助!

[ 本帖最后由 sxinwei 于 2007-6-2 16:23 编辑 ]

zhlong 发表于 2007-6-2 16:31

回复 #1 sxinwei 的帖子

请搜索本版FFT相关帖子

zhlong 发表于 2007-6-2 16:51

参考下贴:
http://forum.vibunion.com/forum/viewthread.php?tid=36477&highlight=fft

zhlong 发表于 2007-6-2 17:08

根据上面链接的那个帖子中Songzy的回贴,为方便对FFT幅值和能量的理解,将你的问题改成如下:

t = 0:0.001:1-0.001;
x = 2*sin(2*pi*50*t)+sin(2*pi*120*t);
y = x ;
subplot(311);
plot(1000*t(1:50),y(1:50))
title('时域波形')

Y = fft(y,1000);
P= abs(Y)*2/1000;%幅值
Pxx=P.*P;%能量
f = 1000*(0:500)/1000;
subplot(312);
plot(f,P(1:501))
title('幅值谱')

subplot(313);
plot(f,Pxx(1:501))
title('能量谱')
xlabel('frequency (Hz)')

zhlong 发表于 2007-6-2 17:27

添加噪声的情况:
t = 0:0.001:1-0.001;
x = 2*sin(2*pi*50*t)+sin(2*pi*120*t);
y = x+2*randn(size(t)) ;
subplot(311);
plot(1000*t(1:50),y(1:50))
title('时域波形')
Y = fft(y,1000);
P= abs(Y)*2/1000;%幅值
Pxx=P.*P;%能量
f = 1000*(0:500)/1000;
subplot(312);
plot(f,P(1:501))
title('幅值谱')
subplot(313);
plot(f,Pxx(1:501))
title('能量谱')
xlabel('frequency (Hz)')

马社 发表于 2007-6-2 20:50

matlab有的版本帮助fft纵轴是错的,少除了N/2,所以很大

行者无疆TJ 发表于 2007-6-4 15:24

回复 #1 sxinwei 的帖子

呵呵,还是不太明白,请问MATLAB中的这个例子纵坐标对不?还是整不明白70怎么回事,我在用MATLAB生成随机序列
t = 0:0.001:0.6;
x = sin(2*pi*50*t)+sin(2*pi*120*t);
y = x + 2*randn(size(t));
将数据代入一个用的FORTRAN程序中计算其对数普谱,结果如图,纵坐标是 20log10(),峰值在20多点

[ 本帖最后由 行者无疆TJ 于 2007-6-4 15:47 编辑 ]

zhlong 发表于 2007-6-4 15:38

回复 #7 行者无疆TJ 的帖子

请仔细看楼主的帖子

行者无疆TJ 发表于 2007-6-4 15:56

还是看不明白呀,请指教。花了好长时间也没弄明白,这一学期就为了验证我的那个FORTRAN程序是正确的,想了好多办法都没成功,急死我了

zhlong 发表于 2007-6-4 15:59

回复 #9 行者无疆TJ 的帖子

楼主的意思是纵坐标70是不对的

行者无疆TJ 发表于 2007-6-5 11:01

本帖最后由 wdhd 于 2016-9-8 14:08 编辑

  呵呵,谢谢,再请教一下:MATLAB中关于CSD的一个例题
  randn('state',0);
  h = fir1(30,0.2,rectwin(31));
  h1 = ones(1,10)/sqrt(10);
  r = randn(16384,1);
  x = filter(h1,1,r);
  y = filter(h,1,x);
  csd(x,y,1024,10000,triang(500),0,[])
  其最后的纵坐标是DB,也就是应该为对数谱,但我用另一程序算出来的对数谱20LOG10()纵坐标大小相差两倍。不知为何?是20的原因吗?
  [ 本帖最后由 zhlong 于 2007-6-5 11:15 编辑 ]

zhlong 发表于 2007-6-5 11:21

回复 #11 行者无疆TJ 的帖子

会不会是单边谱和双边谱的问题?

行者无疆TJ 发表于 2007-6-5 11:28

回复 #12 zhlong 的帖子

但是随机序列是一样的呀,您的意思CSD的计算也是按20LOG的?如果我的主要目的是为了验证一个计算相关函数和谱的程序是正确的,您有什么好的见意吗?之前是想以星谷胜的随机振动分析一书为参考,验证一个有限带宽白噪声,但根据白噪声谱获得随机序列有点问题,所以最后返回谱计算时其数值大小也存在问题

[ 本帖最后由 行者无疆TJ 于 2007-6-5 11:35 编辑 ]

行者无疆TJ 发表于 2007-6-5 12:44

回复 #12 zhlong 的帖子

csd作出的图有三条线,分别是什么呀?

zhlong 发表于 2007-6-5 12:48

回复 #14 行者无疆TJ 的帖子

没用过这个函数
页: [1] 2
查看完整版本: 求助:matlab给出的fft例子的问题