大家好,
             我是数据科学的新手,想知道使用abs()函数并将对作为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平方)有趣:实部与imag可以告诉我们信号相位的行为,对于真实信号,通常是随机且无趣的,而幅值将真实和imag分量结合在一起,并以直接的方式告诉我们给定频率仓中的能量数量-有用!

如果复数的大小是能量,则大小的平方是其幂。工程师通常喜欢看到幅度平方,因为他们可以交叉引用该数字和他们正在使用的硬件的额定功率。这只是一个约定。

一些注意事项:如果您的数据是真实的,则实数到复数的FFT将运行得更快。它称为rfft,但输出有些混乱:它返回格式为[real,imag,real,imag,…]的复杂输出。 (在此Scipy issue中,社区对FFTPACK的这种不寻常且非标准的约定提出了担忧。)如果可能,我通常会尝试使用numpy.fft.rfft,因为它会返回预期的复数值数据。 (此从实数转为rfft的复杂值输出的数量是从复数转为fft的一半,这是运行时改进的来源。)

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

关于python - 在绘制给定数据集的功率谱密度时需要abs()方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43287700/

10-12 17:23
查看更多