Google Classroom
GeoGebraGeoGebra Classroom

周波数を抜きだそう

このワークシートはMath by Codeの一部です。 アプレット、背景、実装の順に見ていきましょう。

フーリエ級数と周波数表示

時間領域関数f(t)と周波数領域関数F(ω)の連動

フーリエ級数展開は 特定区間の関数や周期関数を倍音周波数の純音に分解することだった。 今回は、一般の関数を周波数を抜き出すフーリエ変換を みていこう。 フーリエ変換がいろんな音に使えるとすごく便利になる。 たとえば、ギターやマイクをPCにつないで、オーディオデータとしてPC入力したとしよう。 そのデータをフーリエ変換すれば、音の周波数、つまり音程がわかるはずだね。 つまり、その音程をMIDIデータとして活用できるよいうことだ。 最近のDAW(digital audio workstation)というDTMソフトならば、オーディオデータを midiデータに変換してくれる機能がある。これで、midiデータをポチポチ入力しなくても、 すでにある音楽データをmidiデータにしてくれるということになる。 この機能はまさに、フーリエ変換が基本にあるのではないでしょうか。

1.背景

フーリエ級数展開を周波数分析という視点で振り返ることからはじめよう。 ・純音はy=a sin[ 2π f t] (f=440でA4の音)だった。 ・ノコギリ波は[ーπ、+π]の区間で、f(t)=t, T=2πのときのフーリエ級数展開は f(t) = 2 Σ(-1)(n+1)/n sin(nt) wa(x)=Σ[(1/m) sin(m 220 frq*2 π x) (-1)^(m+1)]という形で実装した。 ・矩形波は[0, π]区間で作れたら奇関数で、f(t)=1, T=2πのときのフーリエ級数展開は f(t) = Σ(1-(-1)n) /nπ sin(nt) wa(x)=Σ[(1/(2p+1)) sin((2p+1) 220 frq*2 π x)]という形で実装した。 ・三角波はf(t) = t (0からπ/2) ;π-t (π/2, π)を偶関数化したフーリエ級数展開は f(t)=π/4- 2/π{ cos 2t + 1/32 cos 6t +1/ 52 cos 10t + ......1/ (2m+1)2 cos2(2m+1)+.......} wa(x)=(π/4)+Σ[(-2/π)*1/((2p+1)^2)) cos((2p+1) 220 frq *2 π x ]という形で実装した。 これらをまとめてみよう。 フーリエ級数展開では、周期関数f(t)と倍音周波数の純音に和分解していることになる。 たとえば、基本周波数をfとすると、(周波数の倍率,振幅の倍率)のペアのリストができる。 ・純音   ;(1,1) ・ノコギリ波;(1,1),(2,-1/2), (3, 1/3),(4,-1/4),(5,1/5),......................, ( k, (-1)k+1/k ),..... ・矩形波  ;(1,1)    , (3, 1/3) ,(5,1/5),......................., ( k, (1-(-1)k)/k ),..... ・三角波  ;(1,1),    ,(3, 1/32) ,(5,1/52),,..................., (2k-1, 1/(2k-1)2),..... この数列や数式を最初のアプレットで実感してみよう。 これを作ることができたのはフーリエ級数展開の公式のおかげだったね。 <フーリエ級数から複素フーリエ級数へ> 一般に、周期Tのf(t)のフーリエ級数はcos波やsin波のような周期関数の無限個のたし算だったね。 f(t)=a0+ Σ( an cos[ 2π n t/T ] + bn sin[ 2π n t/T] ) a0 = 1/T ∫ f(t) dt (-T/2, T/2) an = 2/T ∫ f(t) cos[ 2π n t/T ] dt ( -T/2, T/2) 、 bn = 2/T ∫ f(t) sin[ 2π n t/T ] dt (-T/2, T/2) のように。 ・ここで、オイラー公式eit=cos t+ i sin t, e-it=cos t - i sin tを思いだそう。  eixはcosx, sinxで作れれているのだから、周期関数と言える。  cos t =( eit +e-it)/2 , sin t =( eit -e-it)/2i におきかえられるね。  さらに、kn=2πn/T, x = kn t , cn=(an-ibn)/2 (cn*=(an+ibn)/2)とすれば、 sinx,cosxではなく、eixを基本の波として無限個たし算する複素フーリエ級数公式ができるはずだ。 knは単位円での回転で2πを1周としたときの周期をTとするとき、k1=2π/Tの何倍の角周波数かを表す。 f(t)=a0+ Σ( an cos knt + bn sin knt ) =a0+1/2Σ [ an( eiknt +e-iknt)- ibn(eiknt -e-iknt)](1,∞)   =a0+1/2Σ [ (an-ibn)eiknt +(an+ibn)e-iknt](1,∞)    =a0+Σ [ cn eiknt +cn*e-iknt](1,∞)  これから、n=0のときのa0も含むものとして、 複素フーリエ級数f(t) =...+c-1e-ik-1t+c0+c1eik1t+...... = Σcn eiknt(‐∞,∞) cn=(an-ibn)/2をまとめると、 cn={an-i bn}/2 =[ 2/T ∫ f(t) cos[ 2π n t/T ] dt ( -T/2, T/2) -i 2/T ∫ f(t) sin[ 2π n t/T ] dt (-T/2, T/2) }/2 cn= 2/T ∫ f(t) 1/2(cosknt- i sinknt) dt (-T/2, T/2) となるので、 複素フーリエ係数cn=1/T ∫ f(t) e-iknt dt( -T/2, T/2) sin,cosにばらけていたものが、eixに一本化されてスッキリしたね。 周期Tの波の記述をカンタンにした、ともいえる。 <複素フーリエ級数からフーリエ変換へ> さらに、複素フーリエ級数の周期T→∞にしたものがフーリエ変換と逆フーリエ変換だ。 区間(周期)Tの関数f(t) =Σcn eiknt(‐∞,∞)のT→∞にすると 角周波数kn=2πn/T→0は連続化してkとなる。 複素フーリエ係数cnのT倍をFT(k)= ∫ f(t) e-ikt dt( -T/2, T/2)とかこう。級数f(t)のうち、角周波数knの項はcneiknt=1/T FT(kn)eiknt = 1/2π *(2π/T FT(kn)eiknt) とかけるね。 ( )の中は幅2π/T=k1,高さFT(kn)eikntの長方形の面積で、その和がf(t)とみることができる。 だから、T→∞のとき、ωn→0で連続化する。すると、積分の意味から、 f(t)=1/2π(長方形の細分の和)=1/2π(dk * FT(kn)eikntの和)=1/2π ∫F(k) e ikt dk (‐∞,∞) となる。 ここで、F(k) はT→∞だから、FT(k)=∫ f(t) e-ikt dt( -T/2, T/2) → F(K)=∫ f(t) e-ikt dt( -∞, ∞) で求められる。 つまり、f(t)のフーリエ変換はF(k)=∫ f(t) e -ikt dt (‐∞,∞)  F(k)の逆フーリエ変換f(t)= 1/2π∫F(k) e ikt dk (‐∞,∞)  f(t)という時間領域の非周期関数から、F(k)という周波数領域の連続関数への変換 これが、フーリエ変換だということがわかったね。 (例) 時間領域の関数f(t)=1 ( )に対するフーリエ変換は  F(x)=∫f(x)e-ixt dt(-∞,∞)=[e-ixt/-ix](-ε/2, ε/2)=-1/ix(e-ixε/2-eixε/2) =-1/ix[ cos(xε/2)-i sin(xε/2)- (cos(xε/2)+i sin(xε/2)) ] = 2i sin(x ε/2)/ix = ε sin(x ε/2)/(x ε/2) εを大きくすると、時間領域tが広がる。それに連動して、周波数はx=0に集中します。 εを小さくすると、時間領域tが狭くなり、連動して、周波数領域は広がるという逆の関係が 見られるところが面白いね。 これは、冒頭の2番目のアプレットで確認しよう。

2.実装

質問:フーリエ変換のイメージをgogebraで視覚化するにはどうしたらよいでしょうか。 フーリエ変換は、f(t)という時間領域の非周期関数から、F(k)という周波数領域の連続関数への変換 だった。 変換のイメージをつかむだけなら、f(t)が周期関数で、F(k)が離散値でもよいね。 それが、冒頭のアプレットだ。 このアプレットでは、 たとえばノコギリ波の時間関数は、 para=Sequence(n)という自然数列に連動して、 sw(x)=Sum(Zip(((1)/(m)) sin(m f*2 π x) (-1)^(m+1),m,para)) これをグラフィックビューで表示する。 周波数の分布リストは、 saw=Sequence($point(k,(((-1)^(k+1))/(k))),k,1,n) 別のグラフィックビューで表示する。 これを上下に並べてみると、連動がよくかるね。 他の三角波、矩形波でもどうようにできる。 それをスライダーをつけて、整数値を変化させることで、表示の切り替えができるね。 周波数の深さnを変えると、関数のSumの深さも点列の数も連動して変わえられるね。