porsche7533967 发表于 2007-10-22 00:05

如何校正FFT后最大振幅值(请高手解惑,感激不尽)

本帖最后由 wdhd 于 2016-9-8 13:54 编辑

  我的情形是这样的,我跑出一个车身位移时域图(Y轴:即amplitude值,X轴:time)要把它转成频谱图,因为只有位移中间有振荡,我只撷取其中振幅较大的那一段(A.例如3.2秒~3.3秒),问题就是撷取不同长度的时域图(B.例如3.2秒~3.4秒),一样是照下列程序去跑出频谱图,其结果波形是几乎一样的,但是其y轴最大振幅值却不一样,且差约2倍(A例子是B例子的2倍),为什么会这样呢,这问题困扰我好久了,请高手解惑,感激不尽!其中3.3秒~3.4秒振幅已很小,3.4秒以后几乎是0
  %程序:
  n=1024;
  nh=n/2;
  nh1=nh+1;
  N1=124;% amplitude值共取124点
  Y1 = fft(amplitude,n);
  Py1 = abs(Y1)./N1;%校正放大N倍的值
  f1 = 1/0.0035*(0:nh)/n;
  %我的取样频率是每0.0035秒取一点
  plot(f1,Py1(1:nh1));
  title('Frequency content of y-up5cm')
  xlabel('frequency (Hz)')
  ylabel('Length(mm)')
  legend('20km/hr');
  %
  amplitude值共取124点
  0
  21.501804039540136
  43.98548131900878
  70.91529649745378
  100.50477183819521
  129.61537921396646
  156.953249046414
  183.45898830805413
  207.53632010013752
  230.2707577142209
  253.0688084762911
  270.17928524897235
  279.5617474383296
  284.5538310136583
  284.5483920987078
  282.8377927255328
  279.7927168091018
  283.40990641630344
  281.3830587859606
  278.5814523362579
  270.8734530898399
  257.63484629874836
  239.23055511669975
  217.54783258222847
  193.47614777839314
  167.72916962525414
  140.65022763349984
  112.6437324255382
  83.9514261089326
  55.33091696974037
  30.29436425165986
  8.719987106948592
  -10.329023638449481
  -25.500491094258603
  -38.92114095766206
  -49.688284345498325
  -57.130517931938435
  -61.06822385111339
  -61.946046754236015
  -60.042378357993854
  -56.508252007038266
  -52.017786358547326
  -47.09855073708182
  -42.45765269257321
  -37.99740346375544
  -34.155406285791045
  -30.787254290836668
  -27.904999921740224
  -25.397385496041558
  -23.014268389369988
  -20.720361292107015
  -18.417899727059854
  -16.22413743413862
  -14.149575743719462
  -12.271533892645452
  -10.535310934066885
  -8.852081218124267
  -7.120391536694734
  -5.279896663848938
  -3.298112903923216
  -1.164214868171359
  1.088536165313243
  3.403327842848894
  5.693347160670953
  7.856618130522284
  9.799685589679155
  11.426313999301975
  12.686691766857276
  13.532942011042074
  13.981499014289737
  14.04699358640404
  13.799035095228971
  13.286533167175795
  12.567461354362186
  11.680972196748522
  10.678239956896956
  9.594148783461987
  8.465174357099668
  7.317220060854003
  6.172992946017431
  5.050067497524314
  3.961422170758077
  2.913326042002998
  1.891640002579911
  0.899292093823719
  -0.051247117517295
  -1.447362020114169
  -9.854326459236397
  -27.503083055733192
  -54.84726870497945
  -91.15476962940575
  -132.95104088481864
  -178.77016875489815
  -224.16610075487552
  -267.3577713655101
  -305.71153776297615
  -334.6719414212301
  -348.3757633096496
  -346.2024333320699
  -331.3640057435133
  -305.19345349971496
  -276.43210655975247
  -252.2132899513571
  -234.90860215447347
  -226.61838464431486
  -222.44223533250434
  -216.9148477611869
  -208.14082890909143
  -194.70730688596367
  -175.51269980163605
  -150.03763963720277
  -119.1840646267534
  -83.8507436846325
  -44.98776333660302
  -6.584783864814536
  26.521475906889076
  50.37275906685009
  63.871184224760064
  68.19663605119378
  64.52556271037548
  54.519229956294964
  40.94804079506927
  26.342059392615045
  0

VibrationMaster 发表于 2007-10-22 07:06

要是想保证一致,FFT之后的谱要除以FFT的长度

songzy41 发表于 2007-10-22 08:21

1,A例和B例是指什么,图?怎么没有给出?
2,楼主给出124个点,采样频率似乎是1/0.0035(从计算频率刻度中看出),则124个点仅0.5秒左右,怎么和3.2~3.4秒对应起来?

zhlong 发表于 2007-10-22 08:21

回复 #1 porsche7533967 的帖子

可以先拿一个标准正弦信号试试不同长度时,你的程序得到的幅值是否一致。

porsche7533967 发表于 2007-10-22 09:13

本帖最后由 wdhd 于 2016-9-8 13:55 编辑

原帖由 songzy41 于 2007-10-22 08:21 发表
1,A例和B例是指什么,图?怎么没有给出?
2,楼主给出124个点,采样频率似乎是1/0.0035(从计算频率刻度中看出),则124个点仅0.5秒左右,怎么和3.2~3.4秒对应起来?
  这是我的图文件资料,请高手解惑,感激不尽!

porsche7533967 发表于 2007-10-22 23:19

请高手解惑,感激不尽!感激不尽

VibrationMaster 发表于 2007-10-23 06:50

回复 #6 porsche7533967 的帖子

不用高手,help fft就会发现, fft计算时没有除以fft长度N,因此最大谱值对应NA。如果想不同长度之间保持一直就必须除N

porsche7533967 发表于 2007-10-23 09:34

本帖最后由 wdhd 于 2016-9-8 13:55 编辑

原帖由 VibrationMaster 于 2007-10-23 06:50 发表
不用高手,help fft就会发现, fft计算时没有除以fft长度N,因此最大谱值对应NA。如果想不同长度之间保持一直就必须除N
  Py1 = abs(Y1)./N1;%校正放大N倍的值
(请高手解惑,感激不尽)

VibrationMaster 发表于 2007-10-23 10:44

%Y1 = fft(amplitude,n);
%Py1 = abs(Y1)./N1;%校正放大N倍的值

Py1 = abs(Y1)./N1==》Py1 = abs(Y1)./n % 细心一点,耐心一点

porsche7533967 发表于 2007-10-24 01:03

本帖最后由 wdhd 于 2016-9-8 13:55 编辑

原帖由 VibrationMaster 于 2007-10-23 10:44 发表
%Y1 = fft(amplitude,n);
%Py1 = abs(Y1)./N1;%校正放大N倍的值

Py1 = abs(Y1)./N1==》Py1 = abs(Y1)./n % 细心一点,耐心一点
  我想你没详细看我的说明吧,
  n=fft图取点数%(请高手解惑,感激不尽)
  N1=amplitude值取点数%(请高手解惑,感激不尽)
  照你说的话
  Py1 = abs(Y1)./n %不同n值会不一样,那n要取多少!?
  [ 本帖最后由 zhlong 于 2007-10-25 11:16 编辑 ]

VibrationMaster 发表于 2007-10-24 07:19

闲着也是闲着。 n 就是你执行这句话Y1 = fft(amplitude,n)的n。

witty01 发表于 2007-10-24 08:48

abs(fft(Y1,N))/n,要除的采样数据的个数n,N是将n以0补齐到2的整数次幂后的长度,

我现在有一个问题,有的说abs(fft(Y1,N))/n 后还要乘2,应不应该乘2呢

[ 本帖最后由 zhangnan3509 于 2007-10-24 08:50 编辑 ]

zhangnan3509 发表于 2007-10-24 08:51

回复 #12 witty01 的帖子

求单边谱应该乘2,这个问题版里之前讨论过很多次了,你可以看看zhlong版主的置顶贴,里面有关于这个问题的帖子

VibrationMaster 发表于 2007-10-24 10:20

回复 #12 witty01 的帖子

如果你的原始数据是实单频信号,如果回到原始幅值需要乘2。 但是我们在做数值仿真,有时用复单频信号,x=Aexp(j*wt),则不用乘2。

witty01 发表于 2007-10-25 10:58

我知道了,谢谢:lol
页: [1] 2
查看完整版本: 如何校正FFT后最大振幅值(请高手解惑,感激不尽)