我似乎正在使用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()
答案 0 :(得分:1)
我认为您在计算幅度。您应该更改
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()
amplitudes
的峰不完全是7
和2
,但如果增加n_samples
,它们将变得更加准确。