Python:为什么 FFT 对相同的数据给出不同的结果?

问题描述 投票:0回答:1

我有一个名为“yclip.txt”的数据文件,它只是一个单列数据。该程序使用函数

ps.acf_dacf()
找到此数据的自相关函数(此处为 dacf)的梯度。然后它计算 dacf 的 FFT,它给出了 ADP。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq
import pulsar as ps

#Load data
data = pd.read_csv('yclip.txt', header = None)
data = np.array(data)
acf, dacf = ps.acf_dacf(data)
n = len(dacf)

#Fourier transform of dacf
adp = np.fft.fft(dacf)
adp = (np.abs(adp[:n//2]))**2

adp = adp/np.max(adp)                       #Normalizing

adpfreq = fftfreq(n, 0.65536)[:n//2]        #Frequency domain

#Plotting
fig, ax = plt.subplots(1, 2)
ax[0].plot(dacf)
ax[0].set_xlabel("Lags")
ax[0].set_ylabel("d/dt(ACF)")
ax[0].set_title("d/dt(ACF)")
ax[1].plot(adpfreq, adp)
ax[1].set_xlabel("Frequency (kHz)")
ax[1].set_ylabel("Power") 
ax[1].set_title("ADP")
plt.suptitle("When dacf is calculated and then fft is taken")
plt.show()

dacf 和 ADP 的图: 该 ADP 是错误的,因为它是 FFT,因此零分量频率中应该有峰值。现在奇怪的是,如果我们将数组 dacf 保存为 txt 文件,将该 txt 文件加载到 python 中而不做任何更改,然后找到 FFT,它输出的 ADP 是不同的,如下所示。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq
import pulsar as ps

#loading dacf from txt
dacf = pd.read_csv('dacf.txt', header = None)
dacf = np.array(dacf)
n = len(dacf)

#Fourier transform of dacf
adp = np.fft.fft(dacf)
adp = (np.abs(adp[:n//2]))**2
adpy = adp/np.max(adp)                           #Normalizing

adpfreq = np.fft.fftfreq(n, 0.65536)[:n//2]      #Frequency domain

#Plotting
fig, ax = plt.subplots(1, 2)
ax[0].plot(dacf)
ax[0].set_xlabel("Lags")
ax[0].set_ylabel("d/dt(ACF)")
ax[0].set_title("d/dt(ACF)")
ax[1].plot(adpfreq, adp)
ax[1].set_xlabel("Frequency (kHz)")
ax[1].set_ylabel("Power") 
ax[1].set_title("ADP")
plt.suptitle("When the same dacf is saved, loaded and then fft is taken")
plt.show()

dacf 在这两种情况下都是相同的,但我认为 ADP 会发生变化,这取决于数据到达 FFT 的方式。

这是功能

ps.acf_dacf()

def acf_dacf(y):

  if np.any(y != y[0]):
    yacf = acf(y, nlags = len(y))
    dyacf = np.gradient(yacf)
  else:
    yacf = np.ones(len(y))
    dyacf = np.zeros(len(y))

  return yacf, dyacf

有人可以解释这里发生了什么吗?

我尝试展平阵列,检查两个 dacfs 中是否有任何标准偏差。但是不好,两种情况下的标准偏差都相同。使用了 numpy 和 scipy,但结果相同。

python data-science fft autocorrelation
1个回答
0
投票

我解决了这个问题。看起来

np.fft.fft()
要求数据采用特定格式。为了在不将
dacf
保存为txt文件的情况下获得第二个ADP图(正确的具有0频率峰值的图),我在应用FFT之前使用了
dacf = pandas.DataFrame(dacf)

© www.soinside.com 2019 - 2024. All rights reserved.