푸리에 변환을 수행하려는 시간 관련 데이터가 있습니다. 데이터는 http://pastebin.com/2i0UGJW9에 있습니다. 문제는 데이터의 간격이 균일하지 않다는 것입니다. 이를 해결하기 위해 데이터를 보간 한 다음 고속 푸리에 변환을 수행했습니다.
import numpy as np
from scipy.fftpack import fft, fftfreq, fftshift
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
x = np.linspace(min(times), max(times), len(times))
y = interp1d(times, data)(x)
yf = fft(y)
xf = fftfreq(len(times), (max(times)-min(times))/len(times))
xf = fftshift(xf)
yplot = fftshift(yf)
plt.figure()
plt.plot(xf, 1.0/len(times) * np.abs(yplot))
plt.grid()
plt.show()
그러나 이것은 예상 빈도 그래프 대신 0에 중심을 둔 단일 스파이크를 제공합니다. 정확한 결과를 얻으려면 어떻게해야합니까?
댓글을 게시 할 평판이 충분하지 않기 때문에 내 제안을 답변으로 게시하고 그중 하나가 답변으로 연결되기를 바랍니다.
수행중인 작업보다 훨씬 더 미세한 그리드에 보간하는 것이 현명 할 것입니다. 그렇지 않으면 보간이 예상 할 수없는 방식으로 잡음이있는 데이터를 부드럽게합니다. 데이터를 평활화하려면 FFT를 통해 수행하는 것이 좋습니다 (이것이 연습의 전체 요점 일 수 있습니다 ...).
시간 데이터의 최소 간격은 24이므로 그 절반 정도의 보간 그리드를 사용해야합니다. 더 좋은 점은 시간 간격이 일정하지 않지만 매우 규칙적이라는 것입니다. 입력 후 print times % 24
사용하기에 좋은 그리드가 될 것 같습니다 np.arange(min(times), max(times)+1, 24)
. (가) 있습니다 +1
너무 마지막 시간을 포함하는 단지입니다.
데이터는 주기적이지 않지만 FFT는 데이터를 마치 그랬던 것처럼 취급합니다. 이는 첫 번째 데이터 포인트와 마지막 데이터 포인트 사이에 큰 점프가 있음을 의미합니다. 데이터 확장을 수행하도록 지시하는 방법에 대해서는 FFT 문서를 참조해야합니다.
주파수 0에서의 스파이크는 신호에 평균 0이 없다는 사실의 결과 일뿐입니다.
이것이 도움이 되었기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다