logo

How to Compute the Inverse Fourier Transform Directly in Julia 📂Julia

How to Compute the Inverse Fourier Transform Directly in Julia

Overview

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

Code

Slow inverse Fourier transform

당연히 속도는 최적화된 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)

Sampling interval

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

$T = 120/8$

120

$T = 12/8$

12

$T = 1/8$

1