python scipy.fft 快速傅立叶变换的巨大 y 尺度

python scipy.fft huge y scale of Fast Fourier Transform

我有一个用于快速傅里叶变换 (fft) 信号的工作 python 脚本,它可以正确绘制图形和 fft,我正在从 postgre 获取数据,所以我省略了该代码。 由于粘贴的限制,我粘贴了较短版本的信号,但信号在较长时间范围内非常相似。

fft 的 x 尺度很好,但我得到的是一个大的 y 尺度,我不明白。

我有一个由机器直接处理的 fft,看起来是正确的,我有另一个测量是由手持机器完成的。 ffts 在 x 尺度和 y 尺度上的相对大小看起来几乎相同,但实际计算的 y 尺度差异很大。

data

plot from python

from device

在脚本中 data_step 是两个时间戳之间的微秒。 n 和 datastep 不会错,因为 x 轴很好。 从我得到的数据中:

Min of signal(value_points_sensor1): -0.057881687

Max of signal: 0.07810274

Max of fft y: 5522.93

fft的大小不应该和信号幅度的大小差不多吗?另外fft的振幅单位和y轴的信号单位不一样吗?

import matplotlib.pyplot as plt
from scipy.fft import rfft, rfftfreq, irfft
import numpy as np

figure, axis = plt.subplots(2, 1)
plt.subplots_adjust(hspace=1)
    
time_points_sensor1 = np.array(row[4])
value_points_sensor1 = np.array(row[3])
    
axis[0].plot(time_points_sensor1, value_points_sensor1)

   
n  = len(row[2])
data_step = (abs((int(row[2][-2] - row[2][-1]))) / 1000000)

yf = rfft(value_points_sensor1)
xf = rfftfreq(n,data_step)

axis[1].plot(xf,abs(yf))
    
plt.show()

rfft 的值与数据量级和点数成正比。所以你应该期望 yf 中的值很大。

比较:

# One cycle of a cosine curve
x = rfft(np.cos(np.linspace(0, 2 * np.pi, 1000)))
max(abs(x))
500.2493021844711

# Two cycles of a cosine curve, again 1000 points per cycle
x = rfft(np.cos(np.linspace(0, 4 * np.pi, 2000)))
max(abs(x))
1000.2484171710441