Silverlight製のデモもあるよ ++C++; 岩永 フーリエ変換 Silverlight製のデモもあるよ ++C++; 岩永
Fourier Transformation フーリエ級数展開 フーリエ変換
𝑎 0 + 𝑘=1 ∞ 𝑎 𝑘 cos 𝑘𝑥+ 𝑏 𝑘 sin 𝑘𝑥 𝑓(𝑥) フーリエ級数展開 † 任意の周期関数はsin/cosの和に分解できる 𝑎 0 + 𝑘=1 ∞ 𝑎 𝑘 cos 𝑘𝑥+ 𝑏 𝑘 sin 𝑘𝑥 𝑓(𝑥) †正確には「区間的になめらか」っていう条件付き
sin𝑘𝑥? sin 𝑥 sin 2𝑥 sin 3𝑥 sin 4𝑥 周波数 音でいうと 絵でいうと 低周波数 低音 べた塗 高周波数 高音 変化激しい
= 𝑎 0 + 𝑘=1 ∞ 𝑎 𝑘 cos 𝑘𝑥+ 𝑏 𝑘 sin 𝑘𝑥 要するに いろんな周波数の正弦波の和 フーリエ級数展開 = 周波数分析 要するに = フーリエ級数展開 周波数ごとに分解 𝑎 0 + 𝑘=1 ∞ 𝑎 𝑘 cos 𝑘𝑥+ 𝑏 𝑘 sin 𝑘𝑥 いろんな周波数の正弦波の和
複素形 任意周期 フーリエ変換 離散フーリエ変換 周期T 周期のない関数向け 離散信号向け どれも本質的には同じ バリエーション 𝑓 𝑥 = 𝑘=−∞ ∞ 𝑐 𝑘 𝑒 𝑖𝑘𝑥 複素形 任意周期 周期T フーリエ変換 周期のない関数向け 離散フーリエ変換 離散信号向け sin 𝑥 = 𝑒 𝑖𝑥 − 𝑒 −𝑖𝑥 2𝑖 , cos𝑥= 𝑒 𝑖𝑥 + 𝑒 −𝑖𝑥 2 𝑓 𝑥 = 𝑘=−∞ ∞ 𝑐 𝑘 𝑒 𝑖 2𝜋𝑘 𝑇 𝑥 𝑓 𝑥 = 1 2𝜋 −∞ ∞ 𝐹 𝑘 𝑒 𝑖𝑘𝑥 𝑑𝑘 𝑓[𝑛] = 𝑘=−∞ 𝑁−1 𝐹[𝑘] 𝑒 𝑖𝑘𝑛 どれも本質的には同じ
What to use で?何ができるの?
偏微分方程式が解けます ちょっとコンピューターから離れすぎますね・・・ フーリエ変換を使うと ____ / \ /\ キリッ . / (ー) (ー)\ 線形方程式なら敵なしだお / ⌒(__人__)⌒ \ | |r┬-| | \ `ー’´ / ノ \ /´ ヽ | l \ ヽ -一””””~~``’ー?、 -一”””’ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ちょっとコンピューターから離れすぎますね・・・
音声解析ができます 画像解析ができます データ通信にも使えます ファイル圧縮したり 低音強調したりリバーブかけたり 同じく、圧縮したり フーリエ変換を使うと 音声解析ができます ファイル圧縮したり 低音強調したりリバーブかけたり 画像解析ができます 同じく、圧縮したり ぼかしとか輪郭強調かけたり データ通信にも使えます データの帯域 = 周波数帯域
例1: 音声フィルター ローパスフィルター ローパス(低域透過)
例2: スペクトログラム 信号の周波数分布を可視化 周波数 時間
人の耳 人の耳はフーリエ変換的な処理をしてる 巻貝みたいな器官 巻貝の中身の模式図 高周波を 共鳴させる 低周波を 共鳴させる
How to transform どうやって展開するの?
周波数ごとに分解できると便利っぽいけども フーリエ級数展開のしかた 周波数ごとに分解できると便利っぽいけども 𝑓 𝑥 = 𝑎 0 + 𝑘=1 ∞ 𝑎 𝑘 cos 𝑘𝑥+ 𝑏 𝑘 sin 𝑘𝑥 じゃあ、どうやって この 𝑎 𝑘 とか 𝑏 𝑘 とか求めるの?
三角関数には以下のような性質が −𝜋 𝜋 sin 𝑚𝑡 𝑑𝑡 =0 −𝜋 𝜋 cos(𝑚𝑡) 𝑑𝑡 =0 三角関数の直行性(1) 三角関数には以下のような性質が −𝜋 𝜋 sin 𝑚𝑡 𝑑𝑡 =0 −𝜋 𝜋 cos(𝑚𝑡) 𝑑𝑡 =0 −𝜋 𝜋 sin 𝑚𝑡 sin(𝑛𝑡)𝑑𝑡 = 𝜋 (𝑚=𝑛) 0 (𝑚≠𝑛) −𝜋 𝜋 cos(𝑚𝑡)cos(𝑛𝑡)𝑑𝑡 = 𝜋 (𝑚=𝑛) 0 (𝑚≠𝑛) −𝜋 𝜋 sin 𝑚𝑡 cos(𝑛𝑡)𝑑𝑡 =0
同じものを掛けて積分したときだけ非0 Φ= 1 2 , sin 𝑚𝑥 , cos𝑚𝑥 𝜙 1 , 𝜙 2 ∈Φ 三角関数の直行性(2) 同じものを掛けて積分したときだけ非0 Φ= 1 2 , sin 𝑚𝑥 , cos𝑚𝑥 𝑚は任意の自然数 𝜙 1 , 𝜙 2 ∈Φ 1 𝜋 −𝜋 𝜋 𝜙 1 𝑥 𝜙 2 𝑥 𝑑𝑥= 𝜙 1 と 𝜙 2 が同じ時だけ1
demo http://ufcpp.net/study/csharp/ClientBin/FourierPlot.html sin(x) cos(x) sin(x) * sin(2 * x) sin(2 * x) * sin(3 * x) sin(x) * sin(x) … 正の値しか持たない sin(x) * cos(x) sin(x) * cos(2 * x) cos(2 * x) * cos(3 * x) cos(2 * x) * cos(2 * x) … 正の値しか持たない まあ、ぶっちゃけ、 sin(5 * x) * sin(2 * x) == (cos(3 * x) - cos(7 * x)) / 2
直行分解(1) 掛けて積分 −𝜋 𝜋 𝑓 𝑥 𝑑𝑥 = −𝜋 𝜋 𝑎 0 + 𝑘=1 ∞ 𝑎 𝑘 cos 𝑘𝑥+ 𝑏 𝑘 sin 𝑘𝑥 𝑑𝑥 =2𝜋 𝑎 0 ここしか残らない −𝜋 𝜋 𝑓 𝑥 cos 𝑚𝑥 𝑑𝑥 = −𝜋 𝜋 cos𝑚𝑥 𝑎 0 + 𝑘=1 ∞ 𝑎 𝑘 cos 𝑘𝑥+ 𝑏 𝑘 sin 𝑘𝑥 𝑑𝑥 =𝜋 𝑎 𝑚 cos𝑚の項しか残らない sin𝑚の項しか残らない −𝜋 𝜋 𝑓 𝑥 sin 𝑚𝑥 𝑑𝑥 = −𝜋 𝜋 sin 𝑚𝑥 𝑎 0 + 𝑘=1 ∞ 𝑎 𝑘 cos 𝑘𝑥+ 𝑏 𝑘 sin 𝑘𝑥 𝑑𝑥 =𝜋 𝑏 𝑚
𝑝 =𝑎 𝑖 𝑥 +𝑏 𝑖 𝑦 𝑝 𝑏 𝑎= 𝑝 ̇ 𝑖 𝑥 𝑏= 𝑝 ̇ 𝑖 𝑦 𝑖 𝑦 𝑎 𝑖 𝑥 直行分解(2) やってることはベクトルの直行分解と同じ 𝑖 𝑦 𝑖 𝑥 𝑝 𝑝 =𝑎 𝑖 𝑥 +𝑏 𝑖 𝑦 𝑎 𝑏 𝑎= 𝑝 ̇ 𝑖 𝑥 𝑏= 𝑝 ̇ 𝑖 𝑦
やってることはベクトルの直行分解と同じ ベクトル フーリエ級数展開 𝑝 =𝑎 𝑖 𝑥 +𝑏 𝑖 𝑦 𝑎= 𝑝 ̇ 𝑖 𝑥 直行分解(3) やってることはベクトルの直行分解と同じ ベクトル フーリエ級数展開 𝑓 𝑥 = 𝑎 0 + 𝑘=1 ∞ 𝑎 𝑘 cos 𝑘𝑥+ 𝑏 𝑘 sin 𝑘𝑥 𝑝 =𝑎 𝑖 𝑥 +𝑏 𝑖 𝑦 𝑎 0 = 1 2𝜋 −𝜋 𝜋 𝑓 𝑥 𝑑𝑥 𝑎= 𝑝 ̇ 𝑖 𝑥 𝑎 𝑘 = 1 𝜋 −𝜋 𝜋 𝑓 𝑥 cos 𝑘𝑥 𝑑𝑥 𝑏= 𝑝 ̇ 𝑖 𝑦 𝑏 𝑘 = 1 𝜋 −𝜋 𝜋 𝑓 𝑥 sin 𝑘𝑥 𝑑𝑥
ということで、結果 𝑓 𝑥 = 𝑎 0 + 𝑘=1 ∞ 𝑎 𝑘 cos 𝑘𝑥+ 𝑏 𝑘 sin 𝑘𝑥 フーリエ級数展開 ということで、結果 𝑓 𝑥 = 𝑎 0 + 𝑘=1 ∞ 𝑎 𝑘 cos 𝑘𝑥+ 𝑏 𝑘 sin 𝑘𝑥 𝑎 0 = 1 2𝜋 −𝜋 𝜋 𝑓 𝑥 𝑑𝑥 𝑎 𝑘 = 1 𝜋 −𝜋 𝜋 𝑓 𝑥 cos 𝑘𝑥 𝑑𝑥 𝑏 𝑘 = 1 𝜋 −𝜋 𝜋 𝑓 𝑥 sin 𝑘𝑥 𝑑𝑥
複素形 フーリエ変換 離散フーリエ変換 バリエーション 𝑓 𝑥 = 𝑘=−∞ ∞ 𝑐 𝑘 𝑒 𝑖𝑘𝑥 𝑓 𝑥 = 𝑘=−∞ ∞ 𝑐 𝑘 𝑒 𝑖𝑘𝑥 𝑐 𝑘 = 1 2𝜋 −𝜋 𝜋 𝑓 𝑥 𝑒 −𝑖𝑘𝑥 𝑑𝑥 𝑓(𝑥)= −∞ ∞ 𝐹 𝑘 𝑒 𝑖𝑘𝑥 𝑑𝑘 𝐹(𝑘)= 1 2𝜋 −∞ ∞ 𝑓 𝑥 𝑒 −𝑖𝑘𝑥 𝑑𝑥 𝑓 𝑛 = 𝑘=0 𝑁−1 𝐹 𝑘 𝑒 𝑖𝑘𝑛 𝐹 𝑘 = 1 𝑁 𝑛=0 𝑁−1 𝑓 𝑛 𝑒 −𝑖𝑘𝑛
Let’s Fourier transform サンプル
demo 矩形波 のこぎり波 𝑥 インパルス いくつか具体例 http://ufcpp.net/study/csharp/ClientBin/FourierPlot.html ・矩形波 floor(sin(x))+0.5 floor(sin(2 * x))+0.5 sin(x)+sin(3*x)/3+sin(5*x)/5+sin(7*x)/7+sin(9*x)/9 ・のこぎり波 x sin(x)-sin(2*x)/2+sin(3*x)/3-sin(4*x)/4+sin(5*x)/5-sin(6*x)/6+sin(7*x)/7-sin(8*x)/8+sin(9*x)/9-sin(10*x)/10 atan2(sin(2*x), cos(2*x)) ・とがってる場所が苦手 x * x * x * x 両端辺りで値が小さい ・|x| abs(x) acos(cos(x)) acos(cos(2 * x)) 不連続がないんで、割と収束が速い ・インパルス abs(x) < 0.1 ? 10 : 0 abs(x) < 0.001 ? 1000 : 0 次数 N を増やすと徐々に・・・ x == 0 ? 18 :sin(9.5*x)/sin(0.5*x)
部分和を取ることで関数近似が可能 不連続な点はなかなか収束しない インパルスのフーリエ変換 = 定数 なめらかでない点も少し苦手 性質 部分和を取ることで関数近似が可能 不連続な点はなかなか収束しない なめらかでない点も少し苦手 不連続な場所にピークが出る インパルスのフーリエ変換 = 定数
Further Reading 参考 (時間が余ったとき用)
任意の周期関数が三角関数で展開できる という前提で話進めたけども、ほんとに? 取りこぼしないの? 任意の周期関数が三角関数で展開できる という前提で話進めたけども、ほんとに? 𝑓 𝑥 = 𝑘=−∞ ∞ 𝑐 𝑘 𝑒 𝑖𝑘𝑥 , 𝑐 𝑘 = 1 2𝜋 −𝜋 𝜋 𝑓 𝑥 𝑒 −𝑖𝑘𝑥 𝑑𝑥 𝑓 𝑥 = 𝑘=−∞ ∞ 1 2𝜋 −𝜋 𝜋 𝑓 𝑡 𝑒 −𝑖𝑘𝑡 𝑑𝑡 𝑒 𝑖𝑘𝑥 累和と積分の順序交換 = −𝜋 𝜋 𝑓 𝑡 1 2𝜋 𝑘=−∞ ∞ 𝑒 𝑖𝑘 𝑥−𝑡 𝑑𝑡 ディリクレ核 = −𝜋 𝜋 𝑓 𝑡 lim 𝑛→∞ 𝐷 𝑛 𝑥−𝑡 𝑑𝑡 =𝑓 𝑥 詳しくは専門書読んで
便宜上、こんな関数を考えてみる (ほんとは関数とは言えない。関数もどき) デルタ関数と呼ぶ 𝛿 𝑥 = ∞ 𝑥=0 0 𝑥≠0 𝛿 𝑥 = ∞ 𝑥=0 0 𝑥≠0 任意の関数𝑓 𝑥 に対して、 𝑓 0 = 𝑎 𝑏 𝑓 𝑥 𝛿 𝑥 𝑑𝑥 ただし、𝑎,𝑏は𝑎<0,𝑏>0となる任意の実数
デルタ関数はフーリエ変換でよく使う デルタ関数とフーリエ変換 1 2𝜋 𝑘=−∞ ∞ 𝑒 𝑖𝑘 = 𝑘=−∞ ∞ 𝛿 𝑡−2𝜋𝑘 1 2𝜋 𝑘=−∞ ∞ 𝑒 𝑖𝑘 = 𝑘=−∞ ∞ 𝛿 𝑡−2𝜋𝑘 ディリクレ核の収束値は デルタ関数級数 デルタ関数を積分で表現 1 2𝜋 −∞ ∞ 𝑒 𝑖𝑘𝑥 𝑑𝑥 =𝛿 𝑥 デルタ関数の フーリエ変換は定数 1 2𝜋
以下のキーワードで調べて見て Distribution(シュワルツの超関数、分布) Hyper function(佐藤の超関数) デルタ関数の正当化 以下のキーワードで調べて見て Distribution(シュワルツの超関数、分布) Hyper function(佐藤の超関数) ∞を含む関数を正当化する理論 安易に∞に触れるとろくなことがないんで、結構面倒なことをしてます
デルタ関数を使うと、積分と累和を変換できる 離散関数と連続関数(1) デルタ関数を使うと、積分と累和を変換できる 連続関数𝑓 𝑥 に対して、デルタ関数級数を掛ける これを積分すると・・・ 𝑓 𝑥 𝑘=−∞ ∞ 𝛿 𝑥−𝑘 −∞ ∞ 𝑑𝑥 𝑓 𝑥 𝑘=−∞ ∞ 𝛿 𝑥−𝑘 = 𝑘=−∞ ∞ 𝑓 𝑘
= 離散関数𝑓 𝑛 に対して、以下の連続関数𝑓 𝑥 を定義 このとき、 𝑓 𝑛 の離散フーリエ変換 𝑓 𝑥 のフーリエ変換 離散関数と連続関数(2) 離散関数𝑓 𝑛 に対して、以下の連続関数𝑓 𝑥 を定義 このとき、 𝑓 𝑥 = 𝑘=−∞ ∞ 𝑓 𝑘 𝛿 𝑥−𝑘 𝑓 𝑛 の離散フーリエ変換 = 𝑓 𝑥 のフーリエ変換
フーリエ変換 𝐹 𝑘 が収束するための十分条件 (少なくともこの条件を満たしていれば変換可能) 𝑓 𝑥 が二乗可積分 フーリエ変換可能な関数 フーリエ変換 𝐹 𝑘 が収束するための十分条件 (少なくともこの条件を満たしていれば変換可能) 𝑓 𝑥 が二乗可積分 𝑓(𝑥)= −∞ ∞ 𝐹 𝑘 𝑒 𝑖𝑘𝑥 𝑑𝑘 𝐹(𝑘)= 1 2𝜋 −∞ ∞ 𝑓 𝑥 𝑒 −𝑖𝑘𝑥 𝑑𝑥 −∞ ∞ 𝑓 𝑥 2 𝑑𝑥 <∞
単なる積分でなく、以下のような積分を使う フーリエ変換可能な範囲を広げる 単なる積分でなく、以下のような積分を使う ガウス関数で抑えられる関数ならなんでもフーリエ変換可能 緩増加(tempered)関数 𝑥とか 𝑥 2 もフーリエ変換可能 フーリエ変換の結果は通常の関数にはならない (超関数になる) 1 2𝜋 −∞ ∞ 𝑒 − 𝑥 2 𝑓 𝑥 𝑒 −𝑖𝑘𝑥 𝑑𝑥 ガウス関数で発散を抑える
純粋数学寄り 信号処理寄り ルベーグ積分(Lebesgue integral) 関数解析(functional analysis) その他、関連キーワード 純粋数学寄り ルベーグ積分(Lebesgue integral) 測度(measure) 関数解析(functional analysis) 固有関数展開(eigen function expansion) 信号処理寄り インパルス応答(impulse response) ラプラス変換(Laplace transformation) Z変換(Z transformation)