logo

줄리아에서 푸리에 역변환 직접 구하는 법 📂줄리아

줄리아에서 푸리에 역변환 직접 구하는 법

개요

줄리아에서 고속 푸리에 변환을 사용하려면 FFTW.jl 패키지를 쓰면 되는데, 이미 구현된 푸리에 역변환 ifft 대신 삼각함수를 직접 다루려면 푸리에 급수를 수식적으로 이해하고 계수를 다룰 수 있어야 한다.

코드

느린 푸리에 역변환

당연히 속도는 최적화된 ifft보다 훨씬 느리지만, 우리가 이론적으로 알고 있는 푸리에 변환 방식 그대로 계산된만큼 직관적이고 개입할 여지가 많다.

using DataFrames, FFTW, Plots

data = CSV.read("https://freshrimpsushi.github.io/ko/posts/2765/example.csv", DataFrame).x

Fs = 8
T = 120/8
fften = fft(data[1:round(Int64, Fs*T):end])

L = length(fften)
t_ = 1:L
a_ = 2real(fften[2:div(L,2)]) / L
b_ = -2imag(fften[2:div(L,2)]) / L

y = fill(real(fften[1]) / L, round(Int64, L))
for k in eachindex(a_)
    _sincos = sincospi.((2k/L)*t_)
    _sin = first.(_sincos)
    _cos = last.(_sincos)
    y .+= (a_[k] .* _cos) + (b_[k] .* _sin)
end
plot(data)
plot!(t_*(Fs*T), y, lw = 2)

샘플리 간격

다음은 샘플링 간격 $T$ 를 바꿔가며 푸리에 역변환을 구한 예시다.

$T = 120/8$

120

$T = 12/8$

12

$T = 1/8$

1