Применение преобразования Фурье к данным временного ряда и избежание наложения - PullRequest
0 голосов
/ 05 ноября 2018

Я готов применить преобразование Фурье к данным временного ряда, чтобы преобразовать данные в частотную область. Я не уверен, что метод, который я использовал для применения преобразования Фурье, правильный или нет? Ниже ссылка на данные, которые я использовал.

После прочтения файла данных я построил оригинальные данные, используя

t = np.linspace(0,55*24*60*60, 55)
s = df.values
sns.set_style("darkgrid")
plt.ylabel("Amplitude")
plt.xlabel("Time [s]")
plt.plot(t, s)
plt.show()

Поскольку данные поступают ежедневно, я преобразовал их в секунды, используя 24*60*60, и в течение 55 дней, используя 55*24*60*60

.

График выглядит следующим образом: Original Time Series

Далее я реализовал преобразование Фурье, используя следующий фрагмент кода, и получил изображение следующим образом:

#Applying Fourier Transform
fft = fftpack.fft(s)

#Time taken by one complete cycle of wave (seconds)
T = t[1] - t[0] 

#Calculating sampling frequency
F = 1/T

N = s.size

#Avoid aliasing by multiplying sampling frequency by 1/2 
f = np.linspace(0, 0.5*F, N)

#Convert frequency to mHz
f = f * 1000

#Plotting frequency domain against amplitude
sns.set_style("darkgrid")
plt.ylabel("Amplitude")
plt.xlabel("Frequency [mHz]")
plt.plot(f[:N // 2], np.abs(fft)[:N // 2])  
plt.show()

Transformed

У меня есть следующие вопросы:

Я не уверен, верна ли моя приведенная выше методология для реализации преобразования Фурье.

Я не уверен, что метод, который я использую, чтобы избежать псевдонимов, является правильным.

Если то, что я сделал, правильно, чем то, как интерпретировать три пика на графике частотной области.

Наконец, как бы я инвертировал преобразование, используя только значащие частоты.

1 Ответ

0 голосов
/ 05 ноября 2018

Хотя я бы воздержался от ответа на ваши первые два вопроса (мне кажется, это нормально, но мне бы понравился опыт эксперта), я могу взвесить последние два:

Если то, что я сделал, правильно, чем то, как интерпретировать три пика на графике частотной области.

Что ж, это означает, что у вас есть три основных компонента для вашего сигнала на частотах примерно 0,00025 МГц (не лучший выбор единиц измерения здесь, возможно!), 0,00125 МГц и 0,00275 МГц.

Наконец, как бы я инвертировал преобразование, используя только значащие частоты.

Вы можете просто обнулить каждую частоту ниже выбранного вами уровня отсечки (скажем, абсолютное значение 3 - которое должно охватывать ваши пики здесь). Тогда вы можете сделать:

below_cutoff = np.abs(fft) < 3
fft[below_cutoff] = 0
cleaner_signal = fftpack.ifft(fft)

И это действительно должно сделать!

...