我似乎使用np.fft.fft为原始波计算了不正确的幅度。

显示了所示的fft图,您可以看到所示的幅度大约为3和1.5,但是如果您查看代码,则使用幅度7和3来生成信号。该图应具有两个尖峰,在x = 13时上升到y = 3,在x = 15时上升到y = 7

要在图表中看到正确的振幅(3和7),我该怎么做?

我可以从实验上看到将振幅乘以2.3所需的常数,但是如何精确计算该数字呢?

import numpy as np
import matplotlib.pyplot as plt

t0 = 0
t1 = 20
n_samples = 1000

xs = np.linspace(t0, t1, n_samples)
# Generate signal with amplitudes 7 and 3
ys = 7*np.sin(15 * 2 * np.pi * xs) + 3*np.sin(13 * 2 * np.pi * xs)

np_fft = np.fft.fft(ys)
amplitudes = 1/n_samples * np.abs(np_fft) #This gives wrong results

frequencies = np.fft.fftfreq(n_samples) * n_samples * 1/(t1-t0)

plt.plot(frequencies[:len(frequencies)//2], amplitudes[:len(np_fft)//2])
plt.show()


python - 从np.fft计算幅度-LMLPHP

最佳答案

我认为您在计算幅度。您应该更改

amplitudes = 1/n_samples * np.abs(np_fft)




 amplitudes = 2 / n_samples * np.abs(np_fft)


结果:

import numpy as np
import matplotlib.pyplot as plt

t0 = 0
t1 = 1
n_samples = 10000

xs = np.linspace(t0, t1, n_samples)
ys = 7 * np.sin(15 * 2 * np.pi * xs) + 3 * np.sin(13 * 2 * np.pi * xs)

plt.subplot(2, 1, 1)
plt.plot(xs, ys)

np_fft = np.fft.fft(ys)
amplitudes = 2 / n_samples * np.abs(np_fft)
frequencies = np.fft.fftfreq(n_samples) * n_samples * 1 / (t1 - t0)

plt.subplot(2, 1, 2)
plt.semilogx(frequencies[:len(frequencies) // 2], amplitudes[:len(np_fft) // 2])

plt.show()



  python - 从np.fft计算幅度-LMLPHP


amplitudes的峰不完全是72,但是如果增加n_samples,它们将变得更加准确。

关于python - 从np.fft计算幅度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51298604/

10-12 19:38