大家好, 我是数据科学的新手,想知道使用abs()函数的重要性,并将接收到的值作为python' s 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
答案 0 :(得分:0)
通用FFT消耗复值数据(即实数和虚数)并返回复值数据。即使你的输入是真实的,我熟悉的所有FFT例程(FFTW,Numpy的FFT,Scipy的FFTPACK,Matlab等)都有fft()
返回复值数据。
因此。要绘制复值向量,我们必须以某种方式将其转换为实数。一种选择是绘制真实的&分别想象组件,但通常不像幅度/ abs
(实平方加上图像平方)那样有趣:真实与图像可以告诉我们信号的阶段的行为,对于真实信号通常是随机和无趣的,而幅度结合了真实和成像组件,并以直接的方式告诉我们给定频率箱中的能量有用!
如果复数的大小是其能量,则幅度平方是其功率。通常工程师喜欢看到幅度平方,因为他们可以交叉引用这个数字,例如,他们正在使用的硬件的额定功率。这只是一个惯例。
一些附注:如果您的数据是真实的,那么实际到复杂的FFT将运行得更快。它被称为rfft
,但它的输出有点令人困惑:它返回格式为[real,imag,real,imag,...]的复杂输出。 (社区已经在这个Scipy issue中提出了关于FFTPACK的这种不寻常和非标准约定的担忧。)如果可能的话,我通常会尝试使用numpy.fft.rfft
,因为它会像预期的那样返回复值数据。 (这个实际到复杂的rfft
返回 half 与复杂到复杂fft
一样多的复值输出,这是运行时改进的来源。)< / p>
另一个侧面说明:这个问题与数据科学无关,只与数字信号处理有关。考虑下次http://dsp.stackexchange.com询问这些问题(尽管你在这里提出的问题没什么大不了的。)