2017-04-07 35 views
1

大家好,我是数据科学的新手,想知道使用abs()函数的意义并将接收的值平方Python的scipy的fft()函数的输出。 fftpack库,在尝试绘制数据集的功率谱密度时使用。我发现很多绘制功率谱密度的代码示例都使用abs(),然后将之后获得的值平方。任何人都可以请给我一个这样做的理由吗?我们不能直接在python的scipy中绘制从fft()函数获得的值。 fftpack库?在绘制给定数据集的功率谱密度时需要abs()方法

这里是我已经写到现在通过参照一些代码的例子来绘制的功率谱密度的代码,

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

您的问题更适合交叉验证或信号处理堆栈交换。 – Stelios

+0

你的意思是'fft(x)',而不是'fft(data)'? –

+0

嘿,你知道了吗?如果是这样,你能发表一个答案并关闭它吗?或者如果我的答案有帮助,你能接受吗? –

回答

0

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

所以。要绘制一个复数矢量,我们必须以某种方式将其转换为真实的。一种选择是单独绘制真实的图像组件,但通常不如幅度/实际平方加图像平方那么有趣:真实与图像可以告诉我们信号的阶段的行为,其中对于真实的信号通常是随机的,无趣的,而幅度结合了真实和图像分量,并以直接的方式告诉我们给定频率的能量数量 - 有用!

如果一个复数的幅度是它的能量,幅度平方就是它的能量。通常工程师喜欢看到幅度平方,因为他们可以交叉引用这个数字,比如他们正在使用的硬件的额定功率。这只是一个惯例。一些附带说明:如果您的数据是真实的,则真实复杂的FFT将运行得更快。它被称为rfft,但它的输出有点令人困惑:它将复杂输出格式化为[real,imag,real,imag,...]。 (社区已经在这个Scipy issue中通过FFTPACK引起了这种不寻常和非标准惯例的担忧。)如果可能,我通常尝试并使用numpy.fft.rfft,因为它会像预期的那样返回复数值数据。 (这实到复杂rfft返回一半尽可能多的复值输出作为复杂到复杂fft,这就是运行时改进得来的。)

另一个侧面说明:这个问题是不是真正与数据科学有关,只是数字信号处理。考虑下次在http://dsp.stackexchange.com上提问这样的问题(尽管你在这里问过这个问题没什么大不了的)。