用FFT计算Python中单个峰值下的面积

时间:2012-11-06 14:53:56

标签: python math numpy matplotlib fft

我在Python 2.7.3中生成了一个FFT图表,其中包含许多单独的峰值。

http://imgur.com/O9E0e

我理解为了计算整个图形下的面积,我可以对这些值求和或者使用trapz,但是当我试图将这些计算限制在一个区域时,我正在努力。例如,我想计算105到120Hz之间或145到155Hz之间的区域。

如果有帮助,生成此图表的代码为:

x=arange(0,15,0.01)

y=exp(-0.3*x)*exp(x*pi*20j)+exp(-0.9*x)*exp(x*pi*25j)+exp(-0.9*x)*exp(x*pi*15j)

fft(y)
plot(fft(y))
xlabel('frequency (Hz)')
show()

我确信我可能只是错过了一些相对简单的东西,但作为一个完整的编程新手,我很感激您提供的任何帮助,并且对SO的简要搜索没有提供任何答案。感谢。

2 个答案:

答案 0 :(得分:1)

如果您使用简单的求和(或梯形)积分:

ft = np.fft.fft(y)
integral = sum(ft[105:121])

integral = np.trapz(ft[105:121])

似乎应该有用。

>>> import numpy as np
>>> x = x=np.arange(0,15,0.01)
>>> from numpy import exp,pi
>>> y=exp(-0.3*x)*exp(x*pi*20j)+exp(-0.9*x)*exp(x*pi*25j)+exp(-0.9*x)*exp(x*pi*15j)
>>> ft = np.fft.fft(y)
>>> np.trapz(ft[105:121])
(642.14009362811771+142.9776425340925j)
>>> sum(ft[105:121])
(652.29308789751224+152.70583448308713j)

答案 1 :(得分:0)

指数的积分,$ \ int_a ^ {b} \ exp(x * q)=(1 / q)*(\ exp(b * q) - \ exp(a * q))$