gpt4 book ai didi

python - 从 np.fft 计算振幅

转载 作者:太空宇宙 更新时间:2023-11-04 00:14:50 27 4
gpt4 key购买 nike

我似乎在使用 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()

enter image description here

最佳答案

我认为你错误地计算了振幅。你应该改变

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()

enter image description here

amplitudes 的峰值不完全是 72 但如果你增加 n_samples 它们会变得更多准确。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com