带小数点频率的FFT如何量化频率的加权相等?

2021-06-13 12:45:12 发布

您现在位置:Python中文网/ 问答频道 /正文

通过下面的代码,我想了解一下输入信号中的不同频率以及它们的“强度”。你知道吗

如果正弦波的频率没有小数点(比如:5.020.0),这个方法非常有效——请看下面的第一个屏幕截图:我在fft中得到了两个频率的尖峰,而且高度和频率本身都相当于代码中的输入参数。你知道吗

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

我有两个问题:

  1. 我能做些什么来改变number of pointsn)或其他参数,使5.4也有一个高度为2.0的尖峰,如其他屏幕截图所示。

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

代码:

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

截图二:低频率为5.4