LoginSignup
13
5

More than 5 years have passed since last update.

juliaで再学習フーリエ変換(その0)

Posted at

理工系界隈でフーリエ変換とよく耳にしますが……

フーリエ変換という単語を聞きき、理工系の方でこの単語を知らない方は少ないと思います。

僕自信の経験談として、修士のときまで、偏微分方程式を専攻していましたが……
結局、フーリエ変換は、偏微分方程式を解く道具としか、当時考えておらず……
音声処理や画像処理に使われているという事実だけ、知っている程度で、どのように応用されているか知りませんでした。
社会人になり、エンジニアになったときに「高速フーリエ変換」という単語を知りました。
当時、「高速」ってなに?
「フーリエ変換に早いも遅いもあるの?」と単語に純粋に疑問を感じたことだけあります。
今は、科学計算系の会社のエンジニア?になって、フーリエ変換を学部で習う計算問題から、数学科が道具として使うときや音声処理や画像処理などについて、まとめてみようと思い立ちこの記事を書きました。
言語は、話題性、早い、実行環境がJupyterなど、手軽で話題性があるという点で、Julia v1.1.0で書いていきます。

とりあえず、フーリエ変換級数展開

フーリエ変換と聞いて、まず思い出すのがフーリエ級数です。

区間 $[-\pi, \pi]$ 上の関数 $f$ を以下のように展開する

f = \displaystyle {\frac {a_{0}}{2} +\sum _{k=1}^{\infty }(a_{k}\cos kx+b_{k}\sin kx)} \frac{a_0}{2} + \sum_{k=1}^\infty (a_k\cos kx+b_k\sin kx) \\
\begin{eqnarray}
    \begin{cases}
        \displaystyle a_n = \frac{1}{\pi} \int_{-\pi}^{\pi} f\left(t \right) \cos nt\,dt \ \left(n = 0,1,2,3,\cdots \right) \notag \\
        \displaystyle b_n = \frac{1}{\pi} \int_{-\pi}^{\pi} f\left(t \right) \sin nt\,dt \ \left(n = 0,1,2,3,\cdots \right)
    \end{cases}
\end{eqnarray}

ことをフーリエ変換展開といいます。

関数にいろいろ制約は付きますが、とりあえず、初回なので、固いことは、後に回しましょう。

簡単な例

\begin{eqnarray}
    f(x) =
    \begin{cases}
        x & (0 \leqq x \leqq 1) \notag \\
        0 & (-1 \leqq x \leqq 0)
    \end{cases}
\end{eqnarray}
function f(x)
    if x >= 0. && x <= 1.
        val = x
    elseif x >= -1. && x <= 0.
        val = 0.
    else
        val = 0.
    end
    return val
end

フーリエ級数展開すると

f(x) = \frac{1}{4} - \frac{2}{\pi^2} \left( \cos{\pi x} + \frac{\cos{3\pi x}}{3^2} + \cdots + \frac{\cos{(2n-1)\pi x}}{(2n-1)^2} + \cdots \right) + \frac{1}{\pi} \left( \sin{\pi x} - \frac{\sin{2\pi x}}{2} + \cdots + (-1)^{n-1} \frac{\sin{n\pi x}}{n} + \cdots \right)
function f_fourier_seri(x, n)
    val = 1/4
    for i in 1:n
        val -= 2/(π^2) * (cos.((2*i-1)*π*x)/(2*i-1)^2)
        val += 1/π * ((-1)^(i-1) * sin.((i*π*x))/i)
    end
    return val
end

描画すると

x = -1.5:0.1:1.5
y0=[f(xx) for xx in x]
anim = @animate for i=1:1:100
    y1=[f_fourier_seri(xx, i) for xx in x]
    plot(x,y0, color="red", alpha = 0.8)
    plot!(x,y1, color="darkcyan", alpha = 0.4) 
end
gif(anim, "output_gif/fourier_anim_fps60.gif", fps = 60)

fourier_anim_fps60.gif

Gist

13
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
5