python - 从 np.fft 计算振幅
问题描述
我似乎正在使用 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()
解决方案
我认为您错误地计算了幅度。你应该改变
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
,它们会变得更准确。
推荐阅读
- javascript - 如何从表单中获取用户名并放入段落 html
- javascript - 如何在不登录的情况下使用firebase创建用户
- python - 如何使用 Python 转置具有多个条目的文本文件,以便每一行都是输出到 Excel 工作表的列
- python - 在 Parquet 中编写数据框
- omnet++ - 将多个主机添加到 INET/OMNET++ 吞吐量示例
- python - 文字冒险python销售系统
- python - 将元组列表与数据框中的列进行比较
- vim - nvim 找到函数,但 vim 没有
- powerbi - 如何在 Power BI 中按州和市场查找表中的最低成本
- html - PowerShell Regex - 匹配不包含不同字符串的字符串