"機械学習","信号解析","ディープラーニング"の勉強

読者です 読者をやめる 読者になる 読者になる

"機械学習","信号解析","ディープラーニング"の勉強

"機械学習","信号解析","ディープラーニング"について、それぞれ勉強しながらブログにまとめていきます。テーマは気分によってバラバラかもしれません。

フーリエ解析の基本

信号解析 信号解析-スペクトル解析

はじめに

フーリエ解析とは

フーリエ解析は現代科学での重要な解析手法になっており、その基本はフーリエ級数展開やフーリエ積分(フーリエ変換)などに基づいています。この2つに関してはフーリエ級数展開がまず研究され、その後発展形としてフーリエ変換が導出されることとなりました。

 

フーリエ級数展開とフーリエ積分の数学的な性質には当前差異がありますが(この差異によって数学的には興味深い研究が進みました)、元々どういう理由で生まれてきたのかという人間の要望に関しては共通する部分があります。

 

まずは是非フーリエ級数展開を用いようという心を理解してください。

以下の記事を読めば、フーリエ級数展開の狙いが何なのかを理解できるでしょう。

 

s0sem0y.hatenablog.com

 

フーリエ級数展開

フーリエ級数展開では、関数f(t)を以下のように展開することです。

 

f(t)=\sum_{n=-∞}^{∞} a_n e^{jnω_0t}

 

a_nが適当な係数であり、e^{jnω_0t}の線型結合で関数f(t)を近似しようということです。この近似は、関数f(t)tの値によって周期的な形をしている場合に有効です。e^{jnω_0t}の方も周期関数であるため、周期関数を複数の周期関数の線型結合でフィッティングするのがフーリエ級数展開と言えます。

 

整数nが変われば、周期関数e^{jnω_0t}の周波数が変わってきます。ω_0は基本各周波数と呼ばれ、これを基準にその整数倍の各周波数の関数を準備することになります。いろいろな各周波数の関数e^{jnω_0t}の線型結合でf(t)を近似するということですね。

係数a_nは、周期関数e^{jnω_0t}がどれくらいの重みでf(t)に含まれているのかを表す指標になってきます。

 

非常に簡単な例を考えます。

以下のような関数f(t)を考えましょう。

f:id:s0sem0y:20170106162230p:plain

 

このような関数を何とか波の波形の和で表現できないでしょうか?というのがフーリエ級数展開のやろうとしていることです。実は上記の波形f(t)は以下で表されます。

 

f(t)=3\sin(t)+2\sin(2t)-\sin(3t)

 

上の画像は単に私が上記の式をプロットしただけです。しかし、このことが未知の場合に、単に上記のような波形が与えられたときに、このように何らかの波の和であるということを明らかにしてくれるのがフーリエ級数展開です。

 

f(t)=3\sin(t)+2\sin(2t)-\sin(3t)

f:id:s0sem0y:20170106162230p:plain

図上:左辺の波形f(t)

f:id:s0sem0y:20170106163055p:plain

図下:右辺の波形3\sin(t)+2\sin(2t)-\sin(3t)

 

今回はわざと波形として綺麗な形を使いましたが、周期的でありさえすれば、右辺への分解が必ず存在します。 どの周波数の波形が、どの程度含まれているのか(今回で言えば係数3,2,-1)を発見するのがフーリエ級数展開なのです。

 

当然\cos(t)などが含まれている場合にはその係数も知ることができます。

\sin波と\cos波をたくさん準備しておけば、必ず周期的な波形を表現することができ、フーリエ級数展開はe^{jt}=\cos(t)+j\sin(t)というオイラーの式を使い、指数関数で展開するのが一般的です。

 

 

フーリエ変換

フーリエ変換では、関数f(t)を以下のような形で表記することを言います。

 

f(t)=\frac{1}{2π}\int_{-∞}^{∞}F(ω)e^{jωt}dω

 

これは通常「フーリエ逆変換」と呼ばれますが、フーリエ級数展開の心を素直に引き継ぐならこちらの「逆変換」から見たほうが良いでしょう。

このフーリエ変換では、f(t)が周期関数であることを要求しません。一般的な関数を上記の形で表現できるのです。こちらの狙いも基本的には周期関数e^{jωt}を色々混ぜてf(t)を表現しようというものなのですが、ωを連続的に扱うことで、周期的でない関数f(t)を扱うことを可能としました。実際には、関数f(t)は周期が∞の周期関数であると扱うことによって極限操作が必要となり、その操作によって積分が出現してきたというのが経緯です。

 

簡単に解釈するならば周期関数e^{jnωt}ωを少しずつ変化させて係数F(ω)を掛けて線形結合していくというのが基本であり、その際にωの変化を無限に小さくしたということになります。

 

フーリエ解析の心

フーリエ級数展開を見てみましょう。式は以下で表されます。

 

f(t)=\sum_{n=-∞}^{∞} a_n e^{jnω_0t}

 

具体的にa_nという係数を求める方法は提示していません。今はフーリエ級数展開ができたとしたら、どんな美味しいことが待っているのかを見てみましょう。

 

フーリエ級数展開を考える理由

微分が簡単になる

周期関数e^{jnω_0t}tによる微分はjnω_0e^{jnω_0t}と容易に求められます。もしも時間関数f(t)が複雑な形をしており微分が難しそうでも、一度フーリエ級数展開できてしまえば、その微分は

 

f'(t)=\sum_{n=-∞}^{∞} jnω_0a_n e^{jnω_0t}

 

と簡単に求まってくれるのです。「だからどうした!」と思うかもしれません。

 

微分方程式への応用

しかし、以下のような微分方程式があった場合を想定しましょう。これは簡単なので、普通に微分方程式の解法を知っている方ならばゴリゴリ計算をして解くことができるでしょう。

 

f''(t)+αf'(t)+βf(t)=0

 

ここであえてf(t)をフーリエ級数展開してしまったものを微分して上記の式に代入してしまうということを考えます。1階微分も2階微分も求めるのは容易です。代入してしまえば

 

\sum_{n=-∞}^{∞} (jnω_0)^2a_n e^{jnω_0t}+α\sum_{n=-∞}^{∞} jnω_0a_n e^{jnω_0t}+β\sum_{n=-∞}^{∞} a_n e^{jnω_0t}=0

 

と表すことができます。これを見て、何だか余計に複雑になってるように感じるかもしれません。しかしそれは文字数が多いというだけで、実際には大した計算を今のところしていません。これを更に変形していきます。

 

\sum_{n=-∞}^{∞} \left((jnω_0)^2a_n e^{jnω_0t}+αjnω_0a_n e^{jnω_0t}+βa_n e^{jnω_0t}\right)=0

 

Σで括る操作をしたに過ぎません。更に共通した項があるのでくくっていきます。

 

\sum_{n=-∞}^{∞} \left( (jnω_0)^2 +αjnω_0 +β \right)a_ne^{jnω_0t} =0

 

ここまでくると複雑そうに見えた微分方程式がいつの間にか単純な問題になっています。常にe^{jnω_0t}=0であるということはあり得ません。更に全てのna_n=0ということはあり得ますが、これは要するにf(t)=0という自明な解なのでどうでもいいものです。

そうなると、今考えるべきものは

 

\left( (jnω_0)^2 +αjnω_0 +β \right)a_n=0

 

が成り立つというものです。微分方程式が普通の代数方程式になりました。結局のところnの累乗を上手く処理できるような微分方程式を相手にする場合にはフーリエ級数展開を用いることが問題の単純化に繋がるというわけです。

 

そんな都合の良い微分方程式は実際には限られた数しかありません。しかし物理学で現れるような微分方程式ではフーリエ級数展開を使うと上手く解けるようなものがたくさんあるのです。そもそもフーリエ級数展開は微分方程式を上手く解く方法が無いかを考えた際に生まれてきたものなのです。

 

線形システム論

フーリエ級数展開の形は、

 

f(t)=\sum_{n=-∞}^{∞} a_n e^{jnω_0t}

 

というものでした。すなわち関数f(t)はいろんな周波数の波の線型結合であるということを言っています。フーリエ級数展開では「いろんな周波数」というのはあくまでω_0を基準とした整数倍の値を指しています。一方でフーリエ積分の形(下記は実際はフーリエ逆変換)は

 

f(t)=\frac{1}{2π}\int_{-∞}^{∞}F(ω)e^{jωt}dω

 

となっています。これは積分の形になっていますが、積分は無限小の和であって、線型結合をする際の周波数の変化を整数倍に限るのではなく、非常に細かい値も用意するということから始まっています。

 

この線形結合で表現するということが効いてきて、フーリエ変換とその類似であるラプラス変換は線形システムを解析する際の重要なツールとなっています。

 

通常、線形微分方程式は複数の特殊解を持ちますが、一般解はそれら特殊解の線型結合で表すことができます。フーリエ変換でとりあえず全ての周波数の波を線形結合しておいて、特殊解に相当するものを包含する形にしておき、不要な波の係数をあとで0としてしまおうと考えてもいいということです。

F(ω)が角周波数ωの係数に相当するわけで、こいつが求まれば良いということになります。当面はF(ω)を求めるのが目的となってきます。通常f(t)に対してフーリエ変換と言えば、このF(ω)を求めることであり

 

F(ω)=\int_{-∞}^{∞}f(t)e^{-jωt}dt

 

と表現されます。

フーリエ変換の細かい数式には興味がなくなるのでf(t)のフーリエ変換を単にF(ω)と表記すると考えておけばよく、f(t)に対して微分をすることがF(ω)にどんな操作を施したことになるかさえ把握すれば良くなります。

大抵f(t)に対する何らかの操作は、変換後のF(ω)で見れば非常に単純になっています。従って問題を解くのが簡単になる場合が多いです。通常f(t)を直接考えることを「時間領域で見る」と表現します。F(ω)を考える場合は周波数領域で見ると言います。

 

F(ω)を求めることで、f(t)での波の含まれ具合が分かったことになるので、その情報からF(ω)の係数を持っている波の集合体がどんな関数になっているのかをフーリエ逆変換

 

f(t)=\frac{1}{2π}\int_{-∞}^{∞}F(ω)e^{jωt}dω

 

で求めることで、本来知りたかったものを復元するという形になります。

フーリエ変換に対する様々な性質は調べつくされてますから、その公式表を見ながら計算をすれば難しそうに見える計算も簡単な操作で終わらせることができてしまうのです。

 

特に重要なのは畳み込み積分と呼ばれるものに対する性質です。

 

通常、ある波形(例えば電流とか)をあるシステム(回路など)に入力した場合の応答y(t)は、波形x(t)とシステムh(t)の畳み込み積分で表現されます。

 

y(t)=\int_{0}^{t}h(t-τ)x(τ)dτ

 

このように複雑に見えるものでも、両辺をフーリエ変換してしまうと

 

Y(ω)=H(ω)X(ω)

 

と極めて単純な形に表現することができます。時間領域での解析よりも周波数領域での解析のほうがよっぽど簡単そうであることが分かるでしょう。

他にも入力波形が例えば、t'だけずれるような場合(x(t-t')が入力となる場合)、周波数領域でどのようなことが起こるのかなどが調べつくされています。

このような体型を整理したものが線形システム論であり、制御工学や信号処理の基礎となっています。

 

 

フーリエ解析の応用

フーリエ解析の基本はフーリエ逆変換とフーリエ変換にあります(フーリエ逆変換から述べているのは、本来の線型結合で表したいという要望が宿っているのがこちらだからです)。

 

f(t)=\frac{1}{2π}\int_{-∞}^{∞}F(ω)e^{jωt}dω

 

F(ω)=\int_{-∞}^{∞}f(t)e^{-jωt}dt

 

この2つの式に対する様々な操作を使うことで対象を解析するのがフーリエ解析です。

 

線形システム解析

フーリエ解析は前述の通り線形システム解析をするための基本的な手法になります。線形システム解析と言ったら、フーリエ解析を使うのはほぼ前提となっており、実際に教科書の中ではいきなり状態空間表現などが解説されているかもしれません(状態空間表現は連立微分方程式を扱うものであり、線形代数が基礎となっています)。

 

信号処理

例えばローパスフィルターとかハイパスフィルターとかをアナログ回路でつくろうと思った場合には、抵抗やコイル、コンデンサーを駆使して電圧を操作することをしなければなりません。

通常これらの素子を用いて作られる回路は微分方程式の形に表すことができます。

 

普通に微分方程式を解けば振る舞いを知ることはできますが、ローパスフィルターとかをつくろうとしている場合に興味があるのは、どれくらいの大きさまでの周波数の波を通過させたいかということです。

すると構築した回路に対する電圧の振る舞いをv(t)としたならば、知りたいのはこれが様々な波の線型結合であると見た場合

 

v(t)=\frac{1}{2π}\int_{-∞}^{∞}V(ω)e^{jωt}dω

 

におけるV(ω)の方になってくるはずです。フーリエ解析はv(t)が満たすべき微分方程式(回路の素子や入力電圧を反映したもの)に何らかの変更をした場合のV(ω)の変化を完全に把握することができます。

ならばV(ω)を求めておいて、例えば20Hzまでしか通過させたくないのならば、V(ω)20Hz以降で0に収束していくような回路を作ってしまえばいいということになります。すなわち周波数領域で考えてしまうのが一番早いということです。

 

線形システム論の優れているところは、何らかの回路(システム)を結合していった場合に、その結合の仕方で全体としてV(ω)がどうなるのかを知ることもできるということです。

 

制御工学

制御工学でもフーリエ解析は頻繁に用いられます。実際にはラプラス変換を用いて線形システムを記述しておいて、とある代入操作でフーリエ変換と同じ結果を獲得するということが行われています。

なぜかというと、制御工学においては今からシステム(フィルターなど)を構築するというよりは既に存在するシステムがあったとして、それが思い通りの振る舞いをするための追加操作が何なのかを求めるのが目的だからです。既に存在するシステムというものは、必ずしもフーリエ変換ができるような形になっているとは限らないため、より(大雑把に言えば)適用範囲が広いラプラス変換を用いるというわけです。

例えば振動してほしくなければ、振動の成分がなくなるような追加の入力システム(通常コントローラと言う)がどのような形をしているべきかを考えることになります。

 

こちらでは周波数領域での解析は、物理的な振動の解析において重要であり、かつ実際のシステムは時間的に振る舞うため時間領域での解析も重要になります。

古典制御での定石は、制御したい変数y(t)に対して入力x(t)があるとして、対象を微分方程式で表しておき、ラプラス変換をして周波数領域Y(ω)、X(ω)での解析を行い、振動成分を少なくする追加のシステムを考慮することでX(ω)に対するY(ω)を制御しようと試みます。

 

この際には、振動がシステムの起動からどれくらいで収まるのかという速さなども考慮する必要があるため時間領域での検討も必要となります。(時間領域での検討を周波数領域だけである程度行うこともでき、ボード線図だとかナイキスト線図だとかはそれを見るためのものだと思えばいいです。当然完全に正確に知るには、時間領域で収束の様子を見るのが確実です)

 

スペクトル解析

スペクトル解析は物理や化学などで頻繁に用いられます。信号解析の一手法ですが、もはや独立した1つの解析手法として概要を覚えておけば様々な分野で応用が効くこと間違いないでしょう。フーリエ解析のことを知っていれば、物理的な解析を行う場合でも意味をすぐに理解できるはずです。

 

パワースペクトル

フーリエ逆変換(上)とフーリエ変換(下)の式は以下でした。

 

f(t)=\frac{1}{2π}\int_{-∞}^{∞}F(ω)e^{jωt}dω

 

F(ω)=\int_{-∞}^{∞}f(t)e^{-jωt}dt

 

 

波形f(t)が与えられた時、F(ω)を求める手続きがフーリエ変換です。

そしてこれは本来の概念から言えば、フーリエ逆変換の式を見ると分かり、波形f(t)を波e^{jωt}に係数F(ω)を掛けて足し合わせたもの(ωを無限に細かく用意するので積分になる)ですから、F(ω)というのは言わば係数です。

 

F(ω)を見ればe^{jωt}という波がどの程度含まれていると言えるのかを知ることができますが、実際には係数は正の値の可能性もあり負の値の可能性もありますから、その絶対値を見たほうが「量」としてある周波数の波がどの程度含まれているのかを把握しやすいです。

絶対値は計算が面倒になるかもしれない(例えば後で微分したいとか)ので、通常は二乗を取ることで正の値にしてしまいます。

 

|F(ω)|^2というのが良い評価対象になるはずです。

 

例えば、|F(ω)|^2という値をプロットしたときに以下の図が現れたとしましょう。

f:id:s0sem0y:20170106165924p:plain

 ω=1のところでのみ値が4となっています。すなわち、今解析した波形はω=1の波のみが含まれており、その係数の二乗が4であるということを意味します。通常これはパワースペクトルと言われます。「パワー」というのはエネルギーという意味で使われ、通常物理的な振動において、振幅の二乗はエネルギーの次元を持つのでそう呼ばれます。F(ω)ωの波の振幅を表すため、これの二乗がエネルギーになるというわけです。

 

実際には他の部分も値を持つかもしれませんし、持たないかもしれません。

これが何の役に立つのでしょうか。それは問題によりけりですが、例えば今、「赤色」の材料を作りたいとします。「赤色」に見えるためには「赤色の周波数」の光を反射する必要があります。

従って、材料に光を当て、その反射光のパワースペクトルを見たときに「赤色の周波数ω_{red}」におけるパワー|F(ω_{red})|^2が大きな値であって欲しいのです。材料が上手く作れているのかをパワースペクトルで確認すればいいということです。(実際にはこんな問題は目で見ればいいというだけですが)

 

実用上は、例えば可視光ではないもの、例えば紫外線とか赤外線を反射する、あるいは吸収するというのを確認したい場合に使えます。

メガネのレンズにある塗料を塗ると、紫外線をシャットアウトしてくれる効果が出るとしましょう。

そうすると、塗料を塗る前のメガネに太陽光を当て、レンズを透過した太陽光のパワースペクトルと塗料を塗ったあとのパワースペクトルでは変化があるはずです。塗料により紫外線がシャットアウトされていれば、紫外線に相当する周波数のパワーが落ちているということになります。

 

周波数と物理的な現象が結びついているシーンにおいて、パワースペクトルは重要な解析の種であり、そういう場合は非常に多いのです。

音声はもちろん、光の吸収、反射、透過を評価する場合に用いられます。

 

発展トピック

スペクトル解析には限界があります。

ある波形が刻一刻と変化していくような場面において、普通のスペクトル解析は実は無力です。

例えばある材料の反射光を見るというのは、材料に変化がない限りは、おそらく反射光はある一定の波であることは間違いないでしょう。つまり、その波を無限に長く観測しておき、ある程度の長さでどこを切り取っても同じであるということです。

しかし、我々人間の声はどうでしょうか。「あーーーーー」と言い続ければおそらく「あーーーーー」のスペクトルを調べることができます。しかし「あしたはいい天気だな」と発した際のスペクトルを調べることには意味があるでしょうか?この言葉を発した際の波形を記録し、フーリエ変換をしたところで、その係数に何の意味があるのでしょうか。

音が変わるたびに波は変化を受けているはずです、「あ」と「し」と「た」というようにそれぞれのスペクトルを調べる必要があるかもしれません。そもそも発音など言語によりけりで、物理的にどの部分で区切ればいいのかなんて分かりません。

 

最も単純な方法は、フーリエ変換を短時間に区切って繰り返し行う方法です。すると、時間的に変化していくスペクトルを見ることができます。しかしこれには不確定性関係という厄介な問題が潜んでおり、解析には十分に注意が必要です。

 

一般にこの手の、時間的に変化するスペクトルを解析する方法として「時間周波数解析」があります。上記のフーリエ変換を短時間毎に行うのを「短時間フーリエ変換」と言います。

他にも「ウェーブレット変換」や「経験的モード分解」など様々な手法が存在します。

 

 

この手のことを学ぶならば以下の記事の本がオススメです。

s0sem0y.hatenablog.com

 

s0sem0y.hatenablog.com

s0sem0y.hatenablog.com