具有小数位频率的FFT-如何量化这些频率的均等加权?

时间:2019-04-02 21:03:33

标签: python fft

使用下面的代码,我想概述一下输入信号中如何存在不同的频率以及它们具有哪些“强度”。

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

不幸的是,如果一个频率具有小数位(例如:5.4代表一个频率),情况就不同了-请参见第二张屏幕截图:现在5.4不再是fft图中的尖峰,也不是峰值不同于该窦波的2.0振幅。

我有两个问题:

  1. 与其他屏幕快照一样,如何更改number of pointsn)或其他参数以使5.4也具有高度为2.0的尖峰。< / p>

  2. 什么是计算频率范围(例如0 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

屏幕截图1:较低的频率为5.0

Screenshot 2

屏幕截图2:较低的频率是5.4

1 个答案:

答案 0 :(得分:2)

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

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