gpt4 book ai didi

python - 具有小数位频率的 FFT - 如何量化频率的权重相等?

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:15 26 4
gpt4 key购买 nike

通过下面的代码,我想大致了解输入信号中存在的不同频率及其“强度”。

如果正弦波的频率没有小数位(例如:5.020.0),这非常有效 - 请参见下面的第一个屏幕截图:我得到了两个频率fft 中的尖峰以及高度和频率本身都相当于我代码中的输入参数。

不幸的是,如果频率有小数位,情况就不同了(比如:5.4 表示一个频率)——见第二张截图:现在 5.4 不再是 fft 图中的尖峰,而且峰值的高度与该正弦波的 2.0 振幅不同。

我有两个问题:

  1. 关于更改 number of points (n) 或其他参数,我可以做些什么来使 5.4 也有一个尖锐的与另一个屏幕截图中一样,高度为 2.0 的峰值。

  2. 计算频率范围(如 0 < x < 10)强度并将其与另一个范围(如 20 < x < 30)进行比较的正确数学方法是什么?我的期望是,对于 5.4 的频率,两个范围也应该提供相同的频率强度

代码:

import matplotlib
matplotlib.use('QT5Agg')
import matplotlib.pyplot as plt
import numpy as np
from numpy.fft import fft, fftfreq

# setup for domain - number of points
n = 1000.

# distance (in meters) or time period (in seconds)
Lx = 100.

omega = 2.0 * np.pi / Lx
x = np.linspace(0, Lx, n)

y1 = 2.0 * np.sin(5.4 * omega * x)
y2 = 2.0 * np.sin(25.0 * omega * x)

y = y1 + y2

freqs = fftfreq(int(n))

mask = freqs >= 0

nwaves = freqs * n

fft_vals = fft(y)

# true theoretical fft
fft_theo = 2.0 * np.abs(fft_vals / n) # multiplied by 2 because I do not look at negative frequencies and have to take their values into account here, too.

plt.figure(8)
plt.plot(nwaves[mask], fft_theo[mask], "-o", markersize=4, label='fft')
plt.xlim(-0.1, 30)
plt.minorticks_on()
plt.grid(b=True, which='major', color='b', linestyle='--')
plt.grid(b=True, which='minor', color='y', linestyle='--')
plt.show()

Screenshot 1 :

截图一:频率较低的是5.0

Screenshot 2

截图2:较低的频率是5.4

最佳答案

在这两种情况下,您都可以使用 Sinc 插值(或重建)来查看孔径内严格整数周期频率之间加窗正弦波的实际频谱。

任何有限长度的信号都没有尖峰。它只是看起来那样,因为您只绘制整数周期频率点。

关于python - 具有小数位频率的 FFT - 如何量化频率的权重相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55483542/

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