在绘制给定数据集的功率谱密度时需要abs()方法



大家好, 我是数据科学的新手,想知道使用 abs () 函数并将收到的值平方作为 python scipy 的 fft () 函数的输出的重要性。FFTpack 库,在尝试绘制数据集的功率谱密度时使用。我发现许多绘制功率谱密度的代码示例确实使用了abs(),然后将此后获得的值平方。谁能给我一个这样做的理由?我们不能直接绘制从 python 的 scipy 中的 fft () 函数获得的值吗?fftpack 库?

这是我到目前为止编写的代码,通过参考一些代码示例来绘制功率谱密度,

import scipy.io as sio
import numpy as np
Import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv("denoised.csv")
data = df.values
x = data[:,0]
from scipy.fftpack import fft,fftfreq
dft= fft(data)        
PSD = np.abs(dft) ** 2

通用FFT使用复值数据(即实数和虚值)并返回复值数据。即使您的输入只是真实的,我熟悉的所有FFT例程(FFTW,Numpy的FFT,Scipy的FFTPACK,Matlab等)都有返回复值数据的fft()

所以。要绘制一个复值向量,我们必须以某种方式将其转换为实数。一种选择是分别绘制实数和 imag 分量,但这通常不如幅度/abs(实平方加 imag-squared)有趣:实数与 imag 可以告诉我们信号相位的行为,对于真实信号通常是随机且无趣的,而幅度结合了实部和 imag 分量,并以直接的方式告诉我们给定频率箱中的能量量——有用!

如果复数的大小是它的能量,那么大小平方就是它的幂。通常,工程师喜欢看到量级平方,因为他们可以将该数字与他们正在使用的硬件的额定功率进行交叉引用。这只是一个惯例。

一些旁注:如果你的数据是真实的,那么从真实到复杂的FFT会运行得更快。它被称为rfft但它的输出有点令人困惑:它返回格式化为 [real, imag, real, imag, ...] 的复杂输出。(社区对FFTPACK在这个Scipy问题中的这种不寻常和非标准的约定表示担忧。如果可能的话,我通常会尝试使用numpy.fft.rfft,因为它会像人们期望的那样返回复值数据。(这种实数到复数rfft返回的复值输出是复数到复数fft一半,这就是运行时改进的来源。

另一个旁注:这个问题与数据科学无关,只是数字信号处理。下次考虑在 http://dsp.stackexchange.com 上问这样的问题(不过你在这里问的没什么大不了的)。

最新更新