줄리아에서 푸리에 역변환 직접 구하는 법
개요
줄리아에서 고속 푸리에 변환을 사용하려면 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$

$T = 12/8$

$T = 1/8$


저희들의 저서 「줄리아 프로그래밍」이 2024 세종도서 학술부문에 선정되었습니다!

