tsugaru’s blog

主に技術的なことをつぶやきます。プログラミング,ポケモンGO,音楽,アニメ等

「星の子」を読んで -この世の中の受け止め方

星の子 今村夏子

普段全く小節を読みませんが、「星の子」を読んで思ったことを書かせていただきます。あくまで個人の感想です。

ネタバレをしていくので注意してください。

 

----------------------------------------------------------------------
「頭に清いとされる水に染み込ませたタオルを乗っける」、子供を助けようと藁にもすがる思いで頼った人から言われた言葉に、なるほどと、実践する両親。この小説ではそんな宗教にのめりこむ両親ではなく、第三者的目線を持つ子供「私」の視点から書かれている。両親に反発し姉が家を出て行く一方、変なところがあることを認めながらも両親が好きな「私」。

「私」はその教会の実態を掴めていないものの、家族や会員との交流が好きで関わり続ける。リンチがあったとか、教会でお世話になってるお兄さん、お姉さんが催眠術をかけて訴えられたとか、真相かどうかもわからない情報をどんどん受け取って行く。


「私」はそれに対して何も思わない。ただ、聞いた事実を聞いた事実と受け止めるだけである。「私」はただ、楽しいものを楽しいと認め、かっこいいものをかっこいいと認め、それだけである。

 

最後の最後にはまさに今間も無く、自分が変革されるかもしれない、という予感がする。しかし「私」は何もしない。流れに従い、起こるかもしれないと思うだけなのである。 

 ----------------------------------------------------------------------

 

この話を読み、自分は思えば私のような人かもしれない。小学生、中学生の時は、自分の芯のようなものがあった。あれをやっては行けないとか、こうすべきだとか。しかしだんだんと世の中の多様性に気づき始める。大学生になって社会人になった大人、自由な大学生と身近に接するうちに、あらゆる多様性を認めるようになってきた。そして外界の刺激に対して無関心とは行かないまでも、小さい頃のように物事に感情移入することが減ったように思う。

 

それと同時に自分の軸がどんどんなくなっていくのを感じていた。自分は自分で良い、そうであるが、多様性を認めた自分は過去の自分に囚われることを許そうとしないのだ。こうして自分は形を失う。こうして私は私の置かれた環境に納得することはないが、あらがうことをやめてしまったのではないか、と感じるのである。

 

この小説は宗教がテーマではない。外界からの刺激に対する受け止め方にあると思うのである。私はこの小説の最後がとても印象的である。私の読解力、あるいはコンテクスト理解力が少ないせいで、多くの小説は最後99までは分かったとしても最後の最後は単なる本筋とは関係ない飾りに見えてしまう。しかし、この小説の終わりは私にとって理解でき、意味あるものであった。私は宗教的に改革されるかもしれないと言うところで終わっており、続きがどうなるか感じさせるところは今まで読んできた数少ない小節と変わらないわけだが、これは結論がはっきりしている。この結論は改造されるかどうかや、実際周りからアクションがあるかどうかではない。私が動こうとしないところにあるのである。私はこれからも現状をただありのままに受け止めて、自分の置かれた環境でその環境なりに生きる人生を選択するのであろう。それが良いか悪いかはどうでも良い。そのような生き方をする人が宗教と接するとどうなるか描いているのがこの小節なのである。

 

最後まで読んでいただきありがとうございました。

楽器用チューナーアプリ作成の理論(第1回)

単にピッチを認識するだけだと思っていたが、いろいろな困難にぶち当たった。音程の認識は音高認識というようであるが、この検索ワードで調べても、音「声」認識のための分析であって、さらにリアルタイムではないので、似ている部分はあれど、精度もリアルタイム分析も難しいものがあった。様々な資料を読んで色々と調べてみたが、Philip McLeod のFast, Accurate Pitch Detection Tools for Music Analysisが最も要点をまとめ、網羅的であったので、これを読んで欲しい。自分なりに以下に概要をまとめる。

チューナーアプリとして求められるクオリティー

以下のように、測定精度、計算速度共に求められ、非常に困難が多い。

  • 人が区別でいる音程は区別できないといけない
    • 人が知覚できる違い(JND:just noticeable difference)は周波数や音の大きさ、長さ、突然の音の変更に依存するが、1000~4000HzではJNDはおよそ8セント程度
    • ちなみにYAMAHAのTDM-700は+-1セント
  • あらゆる楽器に対応しないといけない
    • コントラバスの最低音E1(41.2Hz)から、ピッコロのC8(4186Hz)まで
    • 声の場合はローパスフィルターを使って、音の間引きをして(ダウンサンプリング)効率化できたが、分析範囲の関係上使えない。(違うフィルターを用いる)
    • ナイキスト周波数を考えると、サンプリング周波数44100Hzは目的の周波数を測定可能である。
      • サンプリング周波数が大きいということはデータが多くなるので、効率の良いアルゴリズムが必須である。
    • ちなみにYAMAHAのTDM-700はC1(32.7Hz)からC8(4186Hz)
  • 音の入力から出力までの時間を最小限にしなければならない
    • その時刻での周波数を決定するための入力サンプル(窓の長さという)が少ないほどピッチ分析は不正確になるが、正確さを求めると長くなる
  • 音の入力間隔に対応できるだけの計算処理が求められる

使用する技術

当ブログ主の注

周波数波長に変換してピッチを分析する手法がある。 音声認識の世界ではたまに使われているようであるが、F0法である。周期的な周波数ピークのうち根音となるF0を取り出すというものである。これは音声認識の世界では有効であるが、二つ問題がある。FFTは一回で計算するデータ量に精度が依存する。例えばサンプリング周波数が44100Hzで窓の長さが1024とすると、FFTでの最も長い周期は1024/44100秒、つまり、周波数にして、43Hzである。これでは多少の音の工程がわかれど、とてもチューナーとして使えるものではない。さらにこれが使える分解能であったとしても、楽器の音程は周波数ドメインでのピークをみればわかるほど単純でもない。その理由は、別で記事を書く予定である。

本題

周波数ドメインにおいて、一般的な波を正確に分析するには3~5周期分のデータが必要だが、ここでは楽器の音に関連した波形を取り出したいので、その場合、自己相関法(autocorrelation)やSDF(Square Difference Function)を用いることで、2周期分程度の波形で分析ができる。細かいことは触れないが、どちらも時間ドメインでの手法で、音が一定であれば、どんな音色であっても波形に繰り返しがあるという想定で分析する。実用の際は、短い時間での分析であるので、音が一定であるという過程がある。

では自己相関とSDF、どちらを使うべきだろうか。長い時間一定の音においてはほぼ違いは出ないが、短時間においては大きな違いが出るようだ。以下でグラフをみてもらうために式を抑えておく。

窓の長さをWとする。自己相関方においては、波が周期\tauであるような度合い(大きいほどその周期であると言える)r'(\tau)は、r'(\tau)=\sum _ { j = 0 }^ { W-\tau -1 } x _ j *x _ {j+ \tau },ただし(0 \leq \tau \lt W)と表される。 SDFにおいては、波が周期\tauであるような度合い(小さいほどその周期であると言える)d'(\tau)は、d'(\tau)=\sum _ { j = 0 }^ { W- \tau -1 }( x _ j -x _ {j+ \tau })^ 2,ただし(0 \leq \tau \lt W)と表される。 いずれも0の時最大、最小(0)をとる。

ここで、同じ周期2.25で初期位相を変えた正弦波について、自己相関方とSDFで分析した結果が以下のようになる。

f:id:pika-bika:20200920160020p:plainf:id:pika-bika:20200920160042p:plainf:id:pika-bika:20200920160054p:plain
自己相関方とSDFの比較

上のように、自己相関方では初期位相によって、誤差が出ていることがわかる。そのため、以下ではSDFを用いることとし、どのようにして計算速度を上げるかに焦点を当てる。

SDF

式をみてわかるように、SDFにおいて時間計算量はO(W^ 2)となる。近年のプロセッサーが3GHz程度であることから、窓の大きさは1024か2048程度まで大きくしても実現可能であると言える。ここでd'は自己相関法で用いたr'を使って、d'(\tau)=\sum _ { j = 0 }^ { W- \tau -1 }( x _ j^ 2 +x _ {j+ \tau }^ 2)-2\sum _ { j = 0 }^ { W-\tau -1 } x _ j *x _ {j+ \tau }=m'(\tau)-2r'(\tau)とあらわあせるとすぐわかる。

ここで、自己相関法で求めるr'は定義通りであれば計算量はO(W^ 2)であるが、パワースペクトル密度関数の逆フーリエ変換と一致することで知られている(Wiener-Khintchineの定理)。逆フーリエ変換に高速離散フーリエ逆変換(IFTT:inverse fast Fourier transform)を使うことで計算量をO(W \rm {log} W)に抑えられる。

さらに、m'について、m'(\tau)=m'(\tau -1) - x^ 2 _ {\tau -1} - x^ 2 _ {W-\tau}とあらわせるので、m'(0)の計算をすれば、帰納的にすぐにもとまることがわかる。

結果として、全体で時間計算量はO(W \rm {log} W)となる。FFTによって、丸め誤差が発生することもあるが、32bitの不動小数点を使えば十分である。

SDFの改良

SDFによって求めるためには、0に近いもの周期を取り出せばよかった。しかし、それはどのくらい近ければ良いのだろうか。最小値を求めると、もしかしたら、取り出すべき周期の整数倍の波長を取り出すかもしれない。そのように、基準が難しい。それに対し、自己相関法では初めて0を通ってから次の0までの最大値を求めるようにすれば、基準が明確である(原文:a zero centre-reference)。そこで、SDFの自己相関法に勝る正確性を生かしつつ、取り出すべき周期の基準を明確にできるような工夫をしたい。

唐突ではあるが、ここでn'(\tau)=\dfrac{2\sum _ { j = 0 }^ { W-\tau -1 } x _ j x _ {j+ \tau }}{\sum _ { j = 0 }^ { W- \tau -1 }( x _ j^ 2 +x _ {j+ \tau }^ 2)}=\dfrac{2r'(\tau)}{m'(\tau)}なるn'を定義する。これは計算するとわかるが自己相関方の値について-1から1になるように正規化したもので、このような正規化の仕方を特にSNAC(specially-normalised autocorrelation)と呼ぶ。この式はこれまでに示した式を用いてn'(\tau)=\dfrac{m'(\tau)- d'(\tau)}{m'(\tau)}=1-\dfrac{d'(\tau)}{m'(\tau)}と表せる。したがって、n'はSDFを利用しつつ、自己相関法での周期特性表記のメリットを生かした関数であると言える。さらに正規化しているため、ピークについての相対的な基準も決めやすい(あまりにゼロで囲まれた最初のピークが小さい時、飛ばしたりできる)。この経緯から、SNACのことを、NSDF(Normalized SDF)と呼ぶこともある。この論文では発音がしやすいでしょ、ってことでSNACを採用しているのでそれに従う。

SNACと共に窓関数を利用する

計算量

上での分析の主役d'の代わりに\hat{d'}(\tau)=\sum _ { j = 0 }^ { W- \tau -1 }w _ j w _ {j+\tau}( x _ j -x _ {j+ \tau })^ 2を分析の主役とする。wは窓関数である。この時、\hat{d'}(\tau)=\sum _ { j = 0 }^ { W- \tau -1 }w _ j w _ {j+\tau}( x _ j^ 2 +x _ {j+ \tau }^ 2)-2\sum _ { j = 0 }^ { W-\tau -1 }w _ j w _ {j+\tau} x _ j x _ {j+ \tau }=\hat{m'}(\tau)-2\hat { r'}(\tau)\hat{m'}(\tau)=\sum _ { j = 0 }^ { W-\tau -1 } (x _ j ^ 2 w _ j * w _ {j+\tau}) +\sum _ { j = 0 }^ { W-\tau -1 } (x _ {j+\tau} ^ 2 w _ {j+\tau} * w _ {j}) \hat{n'}(\tau)=\dfrac{2\hat{r'}(\tau)}{\hat{m'}(\tau)}=\dfrac{2\sum _ { j = 0 }^ { W-\tau -1 } w _ j w _ {j+\tau} x _ j x _ {j+ \tau }}{\sum _ { j = 0 }^ { W- \tau -1 }( w _ j w _ {j+\tau} x _ j^ 2 +x _ {j+ \tau }^ 2)}というように対応させる。この時、先ほどのように、\hat{d'}の代わりに\hat{n'}を用いて分析する。ここで、 \hat{n'}の分子\hat{m'}は上の式で分解したものをみてもらうと、jj+\tauで分離して表記しているのがわかる。それぞれを関数として、相互相関関数とみてFFTを使うことにより計算時間をO(W \rm {log} W)に抑えられる。分母についてはこれまでのようにFFTを用いる。このようにして求めることをWSNAC(windowed SNAC)と名付けている。

窓関数

ハン窓を使うとある。 窓関数については筆者が勉強不足なので略す。

放物線補完

\tauはこれまで整数であるので、精度を上げるために放物線補完をする。ピークの点と両サイドの点を通る放物線の頂点を計算することで求め、精度をより上げる。

精度の比較

これらは原文のChapter 5にグラフ付きで詳しく述べてある。 SNAC,Unbiased Autocorrelation,Autocorrelation,Windowed Unviassed Autocorrelation,WSNACで比較をしている。 まず、サイン波を周波数を変えて測定する。次に、複数周波数のサイン波を混ぜて測定する。いずれにおいてもSNACが最も精度が良くWSNACが次によかった。SNACはずれても2セントほどであったが、自己相関法は10セント程度なら平気でずれてしまうほど、誤差に違いが出ていた。次に、グリッサンドやビブラートの影響、音量の影響を調べるため、定常波でなく、時間変動する波の実験をする。すると、SNACよりWSNACの方が良い精度を得られていることが多くなった。

ピッチと基本周波数

これについては後日記事を書く予定。 原文においては6章に相当。

続きを別で書く予定。

管楽器の音色ってどうやって決まるんだろう

音のスペクトル

コンピュータで純音(純粋なサインカーブの音)を鳴らすと、明らかに機械音がなる。素朴でつまらない音である。

しかし、同じ音程だと思っている(この意味深な書き方については、記事を書く予定)楽器達は、豊かな響きを持つ。しかもそれは楽器の種類によって異なる。なぜだろうか、それは、聞こえている周波数以外の周波数成分を持っていることに由来する。

音は波であるから、一つの音は、様々な周波数を持つサイン波の足し合わせと考えて良い。わかりやすい例で言えば、バスクラリネットみたいな楽器で低い音を耳を済ませて聞くと、なんとなーく高い音が聞こえてくるであろう。

f:id:pika-bika:20200920032619p:plainf:id:pika-bika:20200920032656p:plain

そういう感じで一つの音に聞こえる音は、いろんな周波数の集まりと考えることができるのだ。このようにして、楽器の音を周波数成分ごとに取り出したものを音のスペクトルという。光のスペクトルは、光を周波数ごとに分けたもので、虹は代表的なアナログなスペクトルと言える。(下の画像は太陽光 - Wikipediaより)

f:id:pika-bika:20200920032959p:plainf:id:pika-bika:20200920033546p:plain

それの音バージョンと考えて欲しい。音のスペクトルを観察することで、 楽器の音色の秘密を探ることができる。

物理的にどのように音が聞こえるのか

音とは、空気の圧力の変化である。例えば、除夜の鐘を感じる時、除夜の鐘が打たれたことによって、鐘自体が振動し、その振動が空気の振動(圧力変化、粗密の変化)を引き起こす。その空気の粗密の変化を人の内耳の鼓膜が受け取り、耳小骨により増幅されて、蝸牛に伝わる。長さの異なる基底膜が、対応する周波数の音によって振動し、対応する神経組織を反応させることで、人は様々な音を知覚している。(下の画像及びこの説明は東京医科歯科大学教養部生物和田 勝様のページ)を参考、引用) f:id:pika-bika:20200920035618j:plain

共鳴

楽器の音が純音でない理由を考えるにあたって、共鳴の説明をする必要がある。 同じ音のなる音叉があった時、一方をたたいて鳴らすとなぜかもう一方も鳴り出す現象がおこる。これが共鳴である。一方を叩いた時、長さに応じて固有の振動をする。これは振り子を想像してもらうとわかりやすいかもしれない。長い振り子はゆっくりの周期で揺れて、短い振り子ははやく揺れる。こうして揺れた固有の振動が空気の振動となって、隣の音叉にも伝わる。隣の音叉がでたらめな長さだったら、揺れてくれない。よって共鳴は起こらない。しかし、もし同じ長さだったら、振動周期が同じであるので、同調して揺れ出す。こうして共鳴する。このような感じで、音というのは、一つのソースから音を鳴らしているつもりであっても知らぬうちに他の振動を生じさせることがある。耳に筒をあてがうとゴーという音を聞いた経験があるだろう。それは、筒の長さにフィットした音が筒によって連動して聞こえてきたからである。さて、以下では管楽器の共鳴について考えてみる。

円柱管の共鳴

上で見たのと同様、管にも、周波数と菅の長さ、形により、共鳴するか否か密接な関係がある。 ここでは、管の形は円柱に限定し、片側開口端か両側開口端かで周波数とどのような関係があるか見ていく。

この辺の説明は名前の通りわかりやすい、 気柱の振動 ■わかりやすい高校物理の部屋■ というページがあるので見て欲しい。まとめると、片側開口端では、基本振動の奇数倍、両側開口端では基本振動の整数倍の振動を固有振動として持つ。

片側開口端

http://www.wakariyasui.sakura.ne.jp/p/wave/koyuu/kityuu-img/2222-60-1.gif

両側開口端 http://www.wakariyasui.sakura.ne.jp/p/wave/koyuu/kityuu-img/2222-25-1.gif

よって、基本振動の音を鳴らしても、実は微妙にそれらの固有振動が共鳴してなることがある。

管楽器の共鳴

上の例で触れた例に最も近い例から考えよう。 クラリネット、フルートは、円柱であり、クラリネットは片側開口端、フルートは両側開口端と似た性質を持っていると、形から予測できるだろう。実際その通りになる。 ほぼ同じ長さであるのに、フルートの方がクラリネットより一オクターブ高いのは、フルートは開口端であり、基本周波数がクラリネットに比べて大きいからであると説明できる。さらに、倍音成分について見てみると、クラリネットについては、偶数波長成分がフルートに比べて少なくなる。このようにして、クラリネットとフルートでは音色に違いができる。

さて、続いて、円柱でない場合の音色について考える。 金管楽器は構造上、閉管と見なされるべきであるのに、倍音をならすと両側開管のような列を持つ(ドに対して、片側開管なら3倍振動であるオクターブ上のソがなるはずだが、その前に2倍振動であるオクターブ上のドがなる)。この秘密はベル(ホーン)にある。円柱である時の共鳴振動数は上で述べたような性質を持っていたのだが、円柱でない時の共鳴振動数は、ベッセル関数という波動方程式の解析解で与えられる。この解析解は、当然円柱の時の片側閉管の結果も含むのであるが、実際の楽器における値を表すパラメタを代入すると、整数倍の全ての音が解に含まれることが示される。実はこのことはサックスやオーボエにもいうことができる。

以上のようにして、管楽器は概ね三つの種類に分けることができる。

f:id:pika-bika:20200920060512p:plain
楽器の科学(以下のリンクの本)より

管楽器ふくめ、これらの音色の違いについては 東京大学物質基礎科学コースのスライド を見て欲しい。さらに詳しいことについては楽器の科学 図解でわかる楽器の仕組みと音の出し方という本が、物理に明るくない人に対しても比較的優しく書かれていると思われる。

www.amazon.co.jp

物理に詳しい人にとっては、N.H.Fletcher,T.D.Rossingの楽器の物理学が定番なようである。私は物理学専門でないので難解かもしれないが、是非とも読んでみたいところである。

www.amazon.co.jp

より細かな違い

実際には、こんな整数倍みたいなきれいな感じではなく、楽器や人に応じて様々な中途半端な周波数の音が重なり合い、独自の音色を形成している。さらに、それらの構成成分は、楽器の穴を塞いだり長さを伸ばしたりすると、倍音成分が変わるので、音色は楽器の音程によっても変わってくるところが面白い。さらに、周波数によって、人間への聞こえ方は変わってくる。この辺の聞こえ方については、次回、楽器の音程はどうやってきまるの?みたいな記事をかこうとおもうのでそこで言及する。また、人間による演奏において、楽器の音程は一定ではなく、(ビブラートよりも)微妙な揺らぎが生じている。この揺らぎが音色の人間らしさというかまろやかさというか、を感じさせる要素になったりもする。そんな感じで、電子的に本物のような音色を再現するのはなかなか大変なものであるなぁと、思うのであった。

引用のない画像はイラストや

WAVファイルを覗いてみた

音を分析するために、ファイル形式を知る必要があると思い、調べてみた。 音の非圧縮ファイルWAVは、RIFFを継承したファイル構造をとる。

ファイル形式の基本情報

IFF(Interchange File Format)

エレクトロニック・アーツ社がコモドールのAmigaというコンピュータゲーム向けに異なるアプリケーション間でのデータ転送を用意にするために開発された。詳しくはRIFFで。

RIFF(Resource Interchange File Format)

形式はIFFと全く同じであり、エンディアンが、IFFではAmigaMacintoshで使われるため(関連:AIFF)、ビッグエンディアンであるが、RIFFはIBMのPCのx86プロセッサに合わせて、多バイト整数をリトルエンディアン形式(後ろのバイトデータが前に記録)で格納することが異なる。 音以外にも使われる、フォーマットのフォーマットのようなもの。 chunk(チャンク)というデータ単位によって構成される。 定義はMultimedia Programming Interface and Data Specificationsに書いてある。

RIFFファイルの構成

以下のような情報単位、チャンクを持ち、チャンク内にサブチャンクを持つこともできる。

ID(識別子) 4byte チャンクを識別するためのASCIIコード4文字分データ fmt,dataなど FourCCと呼ばれる(MacではOSType)。
Size(サイズ) 4byte データサイズ(byte)を指定する。リトルエンディアン32bit整数(IDとSizeを省いた大きさ)
Date(データ) nbyte データ本体
(パディング) (1byte) (チャンク長が偶数バイトでない場合に1バイト追加される)

なお、ファイル全体は一つのRIFFチャンクで構成されるので、RIFF形式のファイルは、 元の4byteで「RIFF」、次の4byteでサイズの情報を必ず持つ。 また、チャンクごとに、データフィールドのはじめに追加フィールドが存在することがある。

RIFFチャンク

RIFFチャンクはDataの最初の4バイトにフォームタイプを追加フィールドとして持つ。フォームタイプは、ファイルに格納されているデータの形式を識別する4文字のコードで、たとえば、Microsoft波形オーディオファイルのフォームタイプは「WAVE」となる。 ほかに、PAL (RIFF Palette Format),RDIB( RIFF Device Independent Bitmap Format), RMID (RIFF MIDI Format),RMMP (RIFF Multimedia Movie File Format),RTF(Rich Text Format),BFF(Bundle File Format)などがある。

Rich Text Format

Microsoft Word Technical Reference: For Windows and OS/2で述べられている。書籍なので購入するしかない。

Waveform Audio File Format (WAVE)

https://sites.google.com/site/musicgapi/technical-documents/wav-file-format https://www.recordingblogs.com/wiki/wave-file-format

音に関する様々な情報を含むチャンク。特にfmtチャンク、dataチャンクは必須に近いほど重要。順番は どちらでも良いが、処理における慣習上、fmtチャンクをdataチャンクより先におくべき。逆にするとストリーミング再生が、最後まで読み取られてからでないとできなくなってしまう。

fmtチャンク

WAVEチャンクに含まれる。 マイクロソフトの_WAVEFORMATEX構造体に相当。 https://docs.microsoft.com/ja-jp/windows/win32/wmdm/-waveformatex

オフセット サイズ (Field) 説明
0x00 4 チャンクID(fmt) 「fmt」 | (0x666D7420)
0x04 4 チャンクデータサイズ(FormatTagが1の時、通常16) 16 +追加のフォーマットバイト
0x08 2 wFormatTag 圧縮コード 1〜65,535
0x0a 2 wChannels チャンネル数 1〜65,535
0x0c 4 dwSamplesPerSec サンプルレート 1-0xFFFFFFFF
0x10 4 dwAvgBytesPerSec 1秒あたりの平均バイト数 (ストリーミング再生でデータを読み込むべき速度) 1-0xFFFFFFFF
0x14 2 wBlockAlign ブロック整列 (1サンプルあたりのバイト数) 1〜65,535

ここで、AvgBytesPerSec=SamplesPerSec*BlockAlgnである。

wFormatTagについて

value(16進数) Format Category
WAVE_FORMAT_PCM (0x0001) Microsoft Pulse Code Modulation (PCM) format
IBM_FORMAT_MULAW (0x0101) IBM mu-law format
IBM_FORMAT_ALAW (0x0102) IBM a-law format
IBM_FORMAT_ADPCM (0x0103) IBM AVC Adaptive

他にも富士通NECYAMAHAらしきものもあったが、https://www.recordingblogs.com/wiki/format-chunk-of-a-wave-file を参照のこと。

特に圧縮コードが1(Line PCM)の時、以下の項目が上に追加される。

オフセット サイズ (Field) 説明
0x16 2 wBitsPerSample サンプルあたりの重要なビット 2-65,535

また、このとき、 BlockAlign = SignificantBitsPerSample / 8 * Channels

以下の項目が上に追加されることもある。追加されているかは、datasizeを確認すればわかるハズ。

オフセット サイズ (Field) 説明
0x18 2 cbSize 追加のフォーマットバイト 0〜65,535

wFormatTagの追加属性を格納できる。 wFormatTagが追加情報を必要としない場合、このメンバーは0に設定する必要がある。

dataチャンク

チャンクに新しいフィールドはない。複数のチャンネルを持つ場合、一つのサンプルごとにチャンネル別のデータを 持つような配列の配列をデータとしている。つまり「sample_1_ch_1,sample_1_ch_2,sample_2_ch_1,...」というかんじ。 量子化数によって、符号ありかどうか変わることに注意。8bitの場合は、符号なし整数である。

other

他にもWAVEformatのチャンクではfactチャンク、silentチャンク、instrumentチャンク、playlistチャンクなどを持つことがある。

LISTチャンク

LISTチャンクはDataの最初の4バイトにリストタイプを追加フィールドとして持つ。 こちらのチャンクは複数のチャンクをまとめた総称としてのタイプであり、例えばリストタイプが INFOのLISTチャンクは、著作権および作成日の情報を提供する「ICOP」および「ICRD」チャンクを含めることができる。

waveファイルをみてみる。

https://maoudamashii.jokersounds.com/list/se2.html よりワンポイント31のwave形式をダウンロードした。

バイナリコードを16進数煮直してみる。 Macの場合、ターミナルで簡単にバイナリを確認する 方法がある。 結局、はじめRIFFのヘッダに12byte,fmtチャンクに24byte、dataのヘッダに8byte使うので、データ本体は 45byte目からあることになる。

xxd -bits filename.wavの結果。左端はバイト数、右端はasciiコードへの変換を表ている。

00000000: 01010010 01001001 01000110 01000110 10101000 10100111  RIFF..
00000006: 00000101 00000000 01010111 01000001 01010110 01000101  ..WAVE
0000000c: 01100110 01101101 01110100 00100000 00010000 00000000  fmt ..
00000012: 00000000 00000000 00000001 00000000 00000010 00000000  ......
00000018: 01000100 10101100 00000000 00000000 00010000 10110001  D.....
0000001e: 00000010 00000000 00000100 00000000 00010000 00000000  ......
00000024: 01100100 01100001 01110100 01100001 11100000 10100110  data..
...

hexdump filename.wavの結果。

0000000 52 49 46 46 a8 a7 05 00 57 41 56 45 66 6d 74 20
0000010 10 00 00 00 01 00 02 00 44 ac 00 00 10 b1 02 00
0000020 04 00 10 00 64 61 74 61 e0 a6 05 00 11 00 0d 00
...

xxd filename.wavの結果

00000000: 5249 4646 a8a7 0500 5741 5645 666d 7420  RIFF....WAVEfmt 
00000010: 1000 0000 0100 0200 44ac 0000 10b1 0200  ........D.......
00000020: 0400 1000 6461 7461 e0a6 0500 1100 0d00  ....data........
...

以上から適切なデータ形式に変換した結果は以下のようになる。

項目 根拠
chunkID RIFF形式 (52(R)49(I)46(F)46(F)
サイズ 370600bytes (a8a7 0500 リトルエンディアンなので、1バイトごとの塊を反転させて0005a7a8)
format type WAVEformat (57415645)
chunkID fmt chunk(66(f)6D(m)74(t)20(space))
size 16Bytes (1000 0000 to 00000010)
圧縮コード LPCM (0100 to 0001)
ch 2ch (0200 to 0002)
サンプリング周波数 44100Hz (44ac 0000 to 0000ac44)
1秒あたりの平均バイト数 176400bytes (10b1 0200 to 0002b110)
1サンプルあたりのバイト数 4bytes (0400 to 0004)
サンプルあたりの重要なビット 16bits (1000 to 0010)
chunkID data 64617461
size 370400 e0a6 0500
data本体 1100...以下

なお、ここで、176400bytes =44100Hz 4bytes と、4bytes =16bits/82chが確かに成立していることがわかる。 また、Macにおいて、情報をみてみると、種類:WAVEオーディオ、サイズ:370,608 バイト(ヘッダのぶん多い)、オーディオチャンネル:ステレオ、 サンプルレート:44.1kHz,ビット/サンプル:16となっていて、正しいと言える。 そのほかの情報(作成日など)はファイルが保有しているのではなく、OSやファイルソフトウェアが保有している。 今の状態では、dataがどのように保存されているかわかりにくい。したがって、わかりやすいデータについて調べてみた。

以下のデータはおよそ440Hzの台形波がなるように人工的に作った音声ファイルである。(Excelで学ぶフーリエ変換の教材を流用) dataよりあとで、同じ並びが繰り返されていることがうかがえる。

00000000: 5249 4646 6aac 0000 5741 5645 666d 7420  RIFFj...WAVEfmt 
00000010: 1000 0000 0100 0100 2256 0000 44ac 0000  ........"V..D...
00000020: 0200 1000 6461 7461 46ac 0000 e0b1 f0d8  ....dataF.......
00000030: 0000 1027 204e 204e 204e 204e 204e 204e  ...' N N N N N N
00000040: 204e 204e 204e 204e 204e 204e 204e 204e   N N N N N N N N
00000050: 204e 204e 204e 204e 204e 204e 204e 1027   N N N N N N N.'
00000060: 0000 f0d8 e0b1 e0b1 e0b1 e0b1 e0b1 e0b1  ................
00000070: e0b1 e0b1 e0b1 e0b1 e0b1 e0b1 e0b1 e0b1  ................
00000080: e0b1 e0b1 e0b1 e0b1 e0b1 e0b1 e0b1 e0b1  ................
00000090: f0d8 0000 1027 204e 204e 204e 204e 204e  .....' N N N N N
000000a0: 204e 204e 204e 204e 204e 204e 204e 204e   N N N N N N N N
000000b0: 204e 204e 204e 204e 204e 204e 204e 204e   N N N N N N N N
000000c0: 204e 1027 0000 f0d8 e0b1 e0b1 e0b1 e0b1   N.'............
000000d0: e0b1 e0b1 e0b1 e0b1 e0b1 e0b1 e0b1 e0b1  ................
000000e0: e0b1 e0b1 e0b1 e0b1 e0b1 e0b1 e0b1 e0b1  ................
000000f0: e0b1 e0b1 f0d8 0000 1027 204e 204e 204e  .........' N N N
...

以上から適切なデータ形式に変換した結果は以下のようになる。

項目 根拠
chunkID RIFF形式 (52(R)49(I)46(F)46(F)
サイズ 44138bytes 6aac 0000
format type WAVEformat (57415645)
chunkID fmt chunk(66(f)6D(m)74(t)20(space))
size 16Bytes (1000 0000 to 00000010)
圧縮コード LPCM (0100 to 0001)
ch 1ch (0100 to 0001)
サンプリング周波数 22050Hz 2256 0000
1秒あたりの平均バイト数 44100bytes 44ac 0000
1サンプルあたりのバイト数 2bytes (0200 to 0002)
サンプルあたりの重要なビット 16bits (1000 to 0010)
chunkID data 64617461
size 44102 46ac 0000
data本体 e0b1 f0d8 以下

ここで、繰り返した部分をみてみると、

F0D80000 1027204E 204E204E 204E204E 204E204E 204E204E 204E204E 204E204E 204E204E 204E204E 204E204E 204E204E 204E1027 0000F0D8 E0B1E0B1 E0B1E0B1 E0B1E0B1 E0B1E0B1 E0B1E0B1 E0B1E0B1 E0B1E0B1 E0B1E0B1 E0B1E0B1 E0B1E0B1 E0B1E0B1

であり、チャンネルが1でサンプルあたりのビットが16bit(2byte)であることを考えると、一つのサンプルあたり16進数において、 4桁=4bit*4桁=16bitで一つ分となる。ここで、特に204Eは20000、E0B1は-20000であり、0000は0、1027は10000、F0D8は-10000、であることを 考えると、確かに台型波を表現していると言える。また、50サンプリングデータごとに繰り返しているので、サンプリング周波数が22050Hzであることを 考えると、出力される音程は22050/50=441Hzと言える。確かに狙い通りのデータを表現していると言える。

実際に音データを利用していく際は、ここから離散コサインフーリエ変換の技術と、人間の耳の特性を利用してさらに圧縮して mp3ファイルなどにして保存される。

参考文献

PokemonGoへの私の思い

gamepress.gg に感銘した私は、ポケモンGoに対する思いをここに書き留めることにしました。あくまで私視点の思いです。

私について

  • 私はポケモンGoを2019年8月頭頃にはじめました。そのため、それまでの変遷を基本的に知りません。
  • 私はポケモン原作を第四世代しかしたことがありません。
  • 私はほぼ無課金勢ですが、GoFest2020のための課金しました。
  • 私は現状TL36です

はじめに

まず、上の記事を見ていただきたいです。日本語版の要約リンクは、以下におきました。

https://pokemongo-get.com/bbs/200/?ci=161

私は大局的な見方をしているこの記事の方向性に対して、全くその通りだと思っています。 まず、ポケモンGoは収集ゲームです。出会ったポケモンに対してモンスターボールを投げて 捕まえるのが基本です。いろいろな種類の、あるいは色違いの、あるいは、大量のポケモンを捕まえる というように、人によって動機は様々ではあると思います。

私のポケモンGoに対する課金の立場

ポケモンGoがこれだけ批判的な変更を加えられているのに、何年も続くスマホオンラインゲームコンテンツとなっているのは、 稀な事態です。ここには、

  • ポケモンという、全世界で愛される強力なコンテンツがあること
  • 隙間時間をねって誰もが遊べること
  • 根幹がシンプルで、お年寄りの方含め、コミュニティーを作りやすいこと

などが原因として挙げられます。つまり、ポケモンGoを 支えるユーザーは多くのライト勢であるということです。したがって、課金システムというのは、慎重である必要があります。 利益を得る以上、お金を得るシステムが必須であるのは明らかです。したがって、ナイアンティックは利益とユーザーフレンドリーを 同時に追求する必要があります。私が思うにポケモンGoにおいては課金システムは、それがなくてもユーザーが満足する物でないといけません。 多くの課金ゲームではガチャのシステムが採用されており、このアイテムがないとなかなかうまくいかない、ということがあるために、 ある程度の段階まで進むと、課金をしないと面白くないという段階に突入してしまいます。

しかし近年までのポケモンはこれを感じさせませんでした。 なぜか、それは課金システムはとてもユーザーフレンドリーだったからです。無課金で手に入らないポケモンはほぼ存在しません。課金によって 得られる恩恵は、ポケモンをゲットするサイクルを加速させるか、強化するサイクルを加速させるか、(あるいはアバターの入手か)ぐらいです。 したがって、ユーザーは是非課金してでも手に入れたい愛情あるポケモンのために課金をすることができます。これはとても気持ちの良いことです。 私は新参であったのでGoFestにおいて、ディアルガ達を手に入れるために課金しました。ガチャの要素がなく(個体値や色違いは確かにガチャですが) 高確率(ゲットチャレンジのクリアのこと)で手に入るディアルガ達や色違いのカイオーガ(偶然手に入れられました!)に大きな満足を覚え、ナイアンティックへの感謝の気持ちを持ったものでした。この課金勢に対し、 無課金勢は課金勢の存在ゆえにコンテンツから撤退する動機にはなり得ません。なぜなら、収集は、個人の趣向(欲しいポケモンや目指すゴール)が大きく違う以上、差別化できるからです。異なるベクトルにいる人に対して、マイナスな感情は起こりにくい物です。(これが対戦などの一つのベクトルで比べられると、負の感情が生まれてしまいます。) したがって、現在新たに組み込まれるメガ進化の実装には大きな憤りを感じます。上の記事とも重なりますが、メガ進化はレンタルの仕様です。 そして、そのレンタルを日常的にするためには課金がほぼ必須となります。収集ゲームにおいて、課金しないと維持できないメガ進化というのは、 いかがな物でしょうか、もし、これがpvpに組み込まれもしたら、課金勢と無課金勢を同じベクトルに並べることにつながります。それは ポケモンGOのユーザーの特性上、ユーザーの大量流出を意味します。解決策については上の記事や多くのインフルエンサーの方が言及されているので略します。

つまり、ナイアンティックはアップデートですべきことは、課金勢への楽しみを増やすことではなく、無課金勢への楽しみを増やすことをメインとすべきなのです。大なり小なりポケモンへの愛着のあるユーザーに対し、ナイアンティックはポケモンのイメージを悪くするような処置をするべきではないのです。

私のポケモンGoに対する古参、新参についての立場

昨年はじめた私は、実装されたpvpに対し、はじめ大きく歓喜したものでした。育てたポケモン達を他のユーザーと競わせることができる、 ナイアンティックは素敵な場所を用意してくれたものだと思っていました。

しかし、蓋を開けてみるとどうでしょうか、ハイドロカノンを連打するラグラージ、コメットパンチを打つメタグロスディアルガミュウツー、 コミュニティーディでしか手に入らない限定技や、一定期間でしか手に入らない伝説、幻のポケモンが主戦場を締めていたのでした。 ここで、反論として、TL35でも、とか、最近始めたけどランク10、世界一位になった人がいるという方がいるかもしれません。当たり前ですが、 母数が多ければそのような人がいるのは当たり前のことです。しかし私が言いたいのは、以上で述べたようなライトなユーザーの多数しめるコンテンツに対して、特定のユーザーが不利になるようなシステムを作り上げることには疑問を感じるということです。これは交換やすごいわざマシンで根本的に解決するわけではありません。交換というのは交換をするコミュニティーの存在が必要となり、これまたユーザーを限定します。また、すごいわざマシンは今のところ そのような層向けの配布頻度でないことは明確です。レイドやコミュディのための数ヶ月待つようなユーザーはそう多くありません。そんなわがままいうなら止めれば良い、という人がいるかもしれませんが、ユーザーの確保はジムやpvpポケモンGoコミュニティーの維持の観点から重要な意味を持ちます。

したがって私の限定技とpvpに対する改善案は以下のようになります。

案1:(最低pvpで使える)限定技の廃止

そもそも限定技はピカチュウが波乗りを覚えたことが発端だと聞きます。これはコレクションの観点からとても面白いものでした。 現状、そのようなピカチュウpvpでは使われているのを見たことがありません。あくまで収集用です。ここに、新規ユーザーと古参の差別化を つけていくのは古参にとって有意義なことです。これがpvpで使えるわざとなったとたん、同じベクトルに古参と新参が並べられます。これでは ポケモンGOコミュニティーの拡大を阻害するだけです。したがって、限定技は廃止すべきだと思います。

案2: すごいわざマシンの配布無料配布を増やす

タスクやレイド、pvpの報酬として他のわざマシン同様に報酬に組み込む。

また、私の伝説、幻のポケモンに対する意見は以下のようです。

原作において、伝説のポケモンは基本的に一体しか手に入らないものです。しかし、ポケモンGoの世界では 多くのポケモンがいくらでも手に入れることができます。私がはじめていない頃、友人の画面をのぞいて、変なの、と 思っていましたが、これに関しては収集ゲームであるので、ポケモンGoならではの楽しみであると思います。つまり、この部分は 良い意味での差別化であります。また、伝説のポケモンpvpが導入される前では古参と新参の差別化に貢献していました。しかし、pvpにより 同じベクトルで比べられると話は違ってきます。それらが必須のものとなってしまったのです。この解決策は以下の章の中で言及します。

位置情報ゲーム、ポケモンGo

上で貼った記事においての軸の一つはポケモンGoは収集ゲームであるということにあります。私はさらに、ポケモンGoでブームとなった画期的なジャンル、位置情報ゲームについても触れておきたいです。

私がポケモンGoをする前、ポケモンGoにたいする期待はとても大きなものでした。位置情報ゲーム?じゃあ夜になるとポケモンが変わったり、池のそばや天気でポケモンが変わるのでは?というものです。ナイアンティックはアップデートにより見事にこの機能を実装し、さらに天候ブーストなる面白いシステムを生み出しました。これは原作ではない仕様ですが、収集ゲームという観点から適切な差別化ができていると言えます。私はさらに思っていました。 北海道ではユキヌオー、沖縄ではサニーゴとかかな、北海道ではアグノムたちが出たりするのかなぁ、県を跨ぐとポケモンが変わるのかなぁ、と。 ナイアンティックは実装してくれました。しかし、これは不十分に思います。日本という地域コミュニティーにおいて、沖縄とそれ以外の二区分は あまりにざっくりとしているのではないでしょうか、私はせっかくなら、日本を旅行した時にできる楽しみがあるようなゲームシステムにして欲しかった と思ったものです。原作のポケモンのように、細かい区分と地域限定を増やしても良いのではないでしょうか?もちろんこれは多大な労力を費やします。 適切な限定ポケモンの数、地域事情(交通の便など)の考慮が必要です。したがって、打開策として、伝説のポケモンの設置を提案します。 伝説のポケモンが必須となったpvpにおいて、伝説のポケモンの配布は急務です。しかしながら、古参勢にとって、復刻レイドの意味はとても小さい。そこで、テンガンザンでディアルガパルキアを手に入れたように、特定の場所で一体のみ伝説のポケモンを入手可能とするのです。 これはライト勢にとっても楽しみを増やすことになります。そして、pvpの問題に対する一つの答えともなります。特定の場所というのはもちろん複数あって良いと思っています。これも地域事情を反映して、適切な位置におくべきではありますが、新たなアップデート機能としては盛り上がるのではないでしょうか?

最後に

ポケモンGoはユーザー離れが明らかに深刻であると思います。このコンテンツでは現在、大きく分けて、一向に改善されず、修正も無残なバグ達、課金勢に振り切った運営の姿勢、新参を受け入れない仕様(pvp限定だが)の三つが問題であると思っています。私はポケモンGoというのは、流行ってはピークのすぎたあらゆるコンテンツゲームの枠組みに入って欲しくないと思っています。ポケモンというジャンルの続く限り、日記帳のような日々の自分を反映したようなゲームであってほしいというふうに願っています。課金勢、無課金勢や、老若男女の境なく、みんなに愛されるゲームであり続けるを願っています。読んでいただきありがとうございました。

フーリエ解析の理論と自然現象のフィーリエ解析(2)


備忘録がてら書きましたが、誤りがあるかもしれません。
自分に都合が良いように書いたので飛ばし読みでお願いします。
また、このシリーズの更新を気まぐれで行うことがあります。

このシリーズでは、第一回で関数の三角関数による展開を簡単な事例から導入し、一般的な事例まで数学的な視点で確認する。第二回では実際に利用されることを想定した説明を試みる。デジタル的な分析においては標本化し、量子化するので、さらに応用して考える必要がある。

第二回では

で構成される。

実際のデータにおいてのフーリエ解析

ある事象を観測する時、その事象が時間的に連続であっても、観測は離散的に行われるということはよくある。コンピュータによる分析では必然的に離散的になってしまう。また、その事象が持つ特徴も連続であったとしても、観測値は離散的であるということもよくある。人間による観測では認識の限界以下は切り捨てられてしまうし、コンピュータであれば計算精度以下は切り捨てられてしまう。このように、フーリエ解析するにあたって観測データは離散的であることがよくある。今までは連続的なデータについて考えていたので、第二回では、離散的な時どのように分析すればより適切な値として分解できるか考えてみる。

離散的な観測

標本化

時間的連続な事象から離散データとして観測する操作をサンプリング(標本化)と呼び、その周期Dをサンプリング周期、周波数1/Dをサンプリング周波数という。
以下は標本化のイメージ

標本化 - Wikipediaより


量子化

ある物理現象について量子を規定し、その物理量を量子の整数倍として表現すること。デジタイズともいう。
以下は標本化と量子化を行った例。連続的な事象に近い高さの横線を観測値としている。

Quantization (signal processing) - Wikipediaより


以上のように、時間的に離散的な観測値から、連続信号f(t)の周波数情報F(w)を
取り出すことが、大きなミッションとなる。ここで用いる手法が離散フーリエ解析である。

適切にサンプリングを行うために

サンプリング周期が大きすぎた場合、適切な分析ができなくなる可能性がある。
極端な例で言えば、$f(t)={\rm sin}2\pi \dfrac{t}{T}$の波に対し、サンプリング周期Tでデータを取得すると、観測データは定数となってしまう。これでは元のf(t)が定数関数であるように感じてしまう。つまり、我々が観測したい成分の波に対して、十分に細かく標本化をする必要がある。

例えば、人間の耳に聞こえる範囲については正確にフィーリエ解析を行いたいのであれば、超超高い音まで分析できるぐらい細かくサンプリングする必要はない。

また、下図は初期移送が同じで振動数が10/2=5.0を境に0.1ずつずれた二つの波
$sin(2\pi*4.9t)$、$sin(2\pi*5.1t)$を、サンプリング周波数10で標本化した図である。下のように、同時刻においてyの符号が異なる同じ大きさの強度の波が観測され、二つの波は区別されていないことがわかる。

f:id:pika-bika:20200827000341p:plain
二つの波の観測

このように、サンプリング周波数に対して半分の周波数以上のものは、それ以下のものを同様に観測されて、混ざり合ってしまう。そのため、サンプリング周波数の半分以上の周波数の波は、観測前に予め除去する必要がある。サンプリング周波数の半分の周波数のことをナイキスト周波数と呼び、高い周波数を取り除く仕組みをローパス・フィルターという。ナイキスト周波数に関するより詳しい説明と、フィルターの説明は後ほど示す。

ここでは、サンプリング周波数に対して有効な観測周波数帯を考える。

ナイキスト周波数はなぜ$f_s/2$か

ここは文献がないがために念のため自力で説明を試みただけなので、読む必要はありません。(クソ長い)

任意の二つの波が混ざり合って観測されては困るので、ここでは二つの波があった時低い周波数の方を測定したいものとする。すなわち、サンプリング周波数に対して二つの波$f_1,f_2$$(0< f_1< f_2)$を観測した時、二つの波がサンプリングによって同じであると判定される$f_2$の下限を考えれば良い。

上では初期位相を揃えたが、観測開始時刻t=0においての波の初期位相は0とは限らない。また、二つの波が同様に観測されるとは、同時刻において常にyが同じまたは符号が逆ではなく、より一般には、観測により得られた数列において、その数列が
初項がずれているだけで一致するまたは、初項がずれて符号違いで一致する場合である。

本来振幅の異なる波で考えるべきであるが、振幅が異なっていても、同じ振幅について分解して取り出すことにより同じ効果をみることができるのでここでは考えない。

以下においては、 先に述べたように、$f_1,f_2(0< f_1< f_2)$を観測した時、二つの波がサンプリングによって同じであると判定されるw_2の下限を考える。そのために、そのほかの文字の存在条件を考える。

$y_1(t)=Asin(2\pi f_1t+\phi_1)$と、$y_2(t)=Asin(2 \pi f_2t+\phi_2)$の波がある。これをサンプリング周波数$f_s$で観測する。この時、得られるデータ列についての条件は、
$
\forall n_{\in Z}(\exists f_1,l,\phi_1,\phi_2(
y_1(\dfrac{n}{f_s})=y_2(\dfrac{n+l}{f_s})
\land 0< f_1< f_2 \land l \in Z)\\
\quad \lor\exists f_1,l,\phi_1,\phi_2(-y_1(\dfrac{n}{f_s})=y_2(\dfrac{n+l}{f_s})\land 0< f_1< f_2\land l \in Z))
$


となる。符号はnによって変わってはいけないことに注意する。
ここで、$\pm y_1(\dfrac{n}{f_s})=y_2(\dfrac{n+l}{f_s})$を計算する。

$$
{\rm cos}(\dfrac{f_2\pm f_1}{f_s}n\pi+\dfrac{f_2}{f_s}l\pi+\dfrac{\phi_2\pm \phi_1}{2}){\rm sin}(\dfrac{f_2\mp f_1}{f_s}n\pi+\dfrac{f_2}{f_s}l\pi+\dfrac{\phi_2\mp \phi_1}{2})=0
$$
上式を二つをまとめた表記として、$P_{m}$$P_{\pm}$、個別に$P_{+}$、$P_{-}$とする。また、cosの位相を$X_{\pm}(n)$、$X_{+}(n)$、$X_{-}(n)$、sinの位相を$Y_{\pm}(n)$、$Y_{+}(n)$、$Y_{-}(n)$とする。この時、任意のnについて$P_{\pm}=0$となる条件は
$\forall n\exists m( (
X_{\pm}(n)=\dfrac{\pi}{2}+m\pi
\land m \in Z)\lor(
Y_{\pm}(n)=m\pi
\land m \in Z) )$
。注意点として、今回はnに対してcosが0になるかsinが0になるか変わっても良い。

以上を整理すると、

$
\forall n_{\in Z}(\exists f_1,l,\phi_1,\phi_2(
\exists m ( (X_{+}(n)=\dfrac{\pi}{2}+m \pi \land m \in Z)\lor (Y_{+}(n)=m \pi \land m \in Z))
\land 0< f_1< f_2 \land l \in Z)\\
\quad \lor \exists f_1,l,\phi_1,\phi_2(
\exists m ( (X_{-}(n)=\dfrac{\pi}{2}+m \pi \land m \in Z)\lor (Y_{-}(n)=m \pi \land m \in Z))
\land 0< f_1< f_2\land l \in Z) )
$
となる。ここで、nに応じてsinかcosかどちらを0にするか変えて良いということであったが、結局どちらが0になるか考える。

$X_{\pm}(n)=\dfrac{\pi}{2}+m\pi$、$Y_{\pm}(n)=m\pi$をこれをmのnに関する一次式と見る。ここで、$X_{\pm}$において、mが整数となるようなnが1つも存在しない時は、任意のnについて$Y_{\pm}(n)=m\pi$が条件となる。mが整数となるようなnが2つ以上存在する時、そのようなnの差が最小であるものをkとする。この時、そのnを起点にkずつずれたnについては全てmが整数となり、これを機能的に繰り返すことで、$X_{\pm}$においてmが整数となるようなnは結局全ての整数の場合か、kごとのnとなる。kごとのnとなる時、それ以外のnについては$Y_{\pm}$における式でmが整数となることが必要である。ここでも先ほどと同様に考えると、$X_{\pm}$、$Y_{\pm}$で相互に見たし会うのはnについて交互に入れ替わる時のみ(k=2)である。以上から、任意のnについてcosとsinの積が0となるようなmの存在条件は、

$(\forall n \in Z \exists f_1,l,\phi_1,\phi_2 , m (X_{\pm}(n)=\dfrac{\pi}{2}+m\pi\land m \in Z \land 0< f_1< f_2\land l \in Z))
\\
\lor(\forall n \in Z \exists f_1,l,\phi_1,\phi_2,m (Y_{\pm}(n)=m\pi\land m \in Z \land 0< f_1< f_2\land l \in Z))
\\
\lor (\forall p \in Z \exists f_1,l,\phi_1,\phi_2,m (X_{\pm}(2p)=\dfrac{\pi}{2}+m\pi\land Y_{\pm}(2p+1)=m\pi \land p \in Z \land 0< f_1< f_2\land l \in Z))
\\
\lor (\forall p \in Z \exists f_1,l,\phi_1,\phi_2,m (X_{\pm}(2p+1)=\dfrac{\pi}{2}+m\pi\land Y_{\pm}(2p)=m\pi \land p \in Z \land 0< f_1< f_2\land l \in Z))
$

ただし上の条件を$Q_{\pm}$とすると、正しくは$Q_{+}\lor Q_{-}$である。
さて、ここで、位相の条件式のうち整数n(あるいはp)、mに着目する。mのn(p)についての一次方程式とみて、任意のn(p)に対し、常にmが整数であるので、切片、傾きが共に整数である。
したがって

$\forall n \exists m (X_{\pm}(n)=\dfrac{\pi}{2}+m\pi)$ $\dfrac{f_2\pm f_1}{f_s}\in Z \land \dfrac{f_2}{f_s}l+\dfrac{\phi_2\pm \phi_1}{2\pi}-\dfrac{1}{2}\in Z$
$\forall n \exists m (Y_{\pm}(n)=m\pi)$ $\dfrac{f_2\mp f_1}{f_s}\in Z \land \dfrac{f_2}{f_s}l+\dfrac{\phi_2\mp \phi_1}{2\pi}\in Z$
$\forall p \exists m (X_{\pm}(2p)=\dfrac{\pi}{2}+m\pi\land Y_{\pm}(2p+1)=m\pi)$ $\dfrac{f_2\pm f_1}{f_s}2\in Z\land \dfrac{f_2\mp f_1}{f_s}2\in Z \land \dfrac{f_2}{f_s}l+\dfrac{\phi_2\pm \phi_1}{2\pi}-\dfrac{1}{2}\in Z\land \dfrac{f_2\mp f_1}{f_s}+\dfrac{f_2}{f_s}l+\dfrac{\phi_2\mp \phi_1}{2\pi}\in Z$
$\forall p \exists m (X_{\pm}(2p+1)=\dfrac{\pi}{2}+m\pi \land Y_{\pm}(2p)=m\pi)$ $\dfrac{f_2\mp f_1}{f_s}2\in Z\land \dfrac{f_2\pm f_1}{f_s}2\in Z \land \dfrac{f_2}{f_s}l+\dfrac{f_2\pm f_1}{f_s}+\dfrac {\phi_2\pm \phi_1}{2\pi}-\dfrac{1}{2}\in Z\land \dfrac{f_2}{f_s}l+\dfrac{\phi_2\mp \phi_1}{2\pi}\in Z$

以上のようになる。ここで、特に傾きの条件について、$f_1$の存在条件と共に考える。

$\exists l_1 \dfrac{f_2+ f_1}{f_s} \in Z \land 0 < f_1 < f_2$
から、$\dfrac{f_2+ f_1}{f_s}=q\in Z$として
$\exists q (0< f_s q-f_2< f_2 \land q \in Z)$
つまり
$\exists q ( \dfrac{f_s}{2} < f_2 < f_s q \land q \in Z)$したがって、この時$f_2$は少なくとも$\dfrac{f_s}{2}$より大きい範囲である必要がある。

$\exists l_1 \dfrac{f_2- f_1}{f_s}\in Z \land 0< f_1< f_2$
から、$\dfrac{f_2- f_1}{f_s}=q\in Z$として
$\exists q (0< -f_sq+f_2< f_2 \land q \in Z)$
つまり
$\exists q (0< f_sq< f_2 \land q \in Z)$したがって、この時$f_2$は少なくとも$f_s$より大きい範囲である必要がある。

$\exists l_1 \dfrac{f_2+ f_1}{f_s}2\in Z \land 0< f_1< f_2$
は$f_s$を$f_s/2$と入れ替えれば良い。したがって、この時$f_2$は少なくとも$\dfrac{f_s}{4}$より大きい範囲である必要がある。

$\exists l_1 \dfrac{f_2- f_1}{f_s}2\in Z \land 0< f_1< f_2$
は$f_s$を$f_s/2$と入れ替えれば良い。したがって、この時$f_2$は少なくとも$\dfrac{f_s}{2}$より大きい範囲である必要がある。

以上を考えると、
条件を満たすような$f_2$が存在するための必要条件として、
$$
f_2 > \dfrac{f_s}{2} \lor f_2> f_s \lor (f_2> \dfrac{f_s}{4} \land f_2>\dfrac{f_s}{2} ) \lor (f_2> \dfrac{f_s}{2} \land f_2> \dfrac{f_s}{4} )
$$
つまり、
$$
f_2> \dfrac{f_s}{2}
$$
である。したがって、逆に$f_2$を$\dfrac{f_s}{2}$以下にすれば同じ波として観測されることが間違いなくないことが保証される。
なお、$f_2=\dfrac{f_s}{2}+df(dfは微少量)$となるような場合は、$f_1=\dfrac{f_s}{2}-df(dfは微少量)$と被ってしまうことがあると、すぐに確認できる。

フィルターの原理

上で説明したように、離散的な観測では、異なる周波数の波長が重なって観測されてしまうので、重ならないような範囲で除去する必要がある。例えばサンプリング周波数が400Hzであるならば、200Hz以上の波がそれ以下の波の観測に影響を与えるので除去する必要がある。逆に言えば、300Hzの波を観測したいならば、600Hz以上のサンプリング周波数で観測する必要がある。この時除去するフィルターのことをローパスフィルターという。デジタルなフィーリエ変換がそもそもできないため使うフィルターであるので原理はアナログである。コンデンサやコイルのインピーダンスの特徴を使うことにより、目的以外の周波数をカットする。おそらくだが、高い周波数の波を観測したい時については、その両サイドの周波数帯をカットすることにより、理論的に観測できると思う(わからないけど)。細かいことは省略。

離散フーリエ変換

有限区間$0\leq t \leq T$における連続信号f(t)から周波数情報を得るには、次のフーリエ変換を行えばよかった。
$$f(t)=\sum _{n=-\infty}^{\infty}c_ne^{-inw_0t}$$
ただし、
$$
w_0=\dfrac{2\pi}{T},\quad c_n=\dfrac{1}{T}\int_0^{T}f(t)e^{-inw_0t}dt
$$

しかし、tが離散的である今は上の式は使うことができない。

そもそも、本来の波f(t)のうち観測によって知るのは一部分なので、計算できたとしても、f(t)に近い信号x(t)である。今までは観測により無限の点からf(t)を得ることができたため、$c_n$を無限に求めることができたが、今回は有限のf(t)から係数を考えるので、係数も有限にせざるを得ない。今回はm個の周期Dの離散信号を得られたとする。すると、連続信号f(t)の観測で得られたf(0)、f(D)、...、f((m - 1)D)から、f(t)に近い連続信号として
$$
x(t) = c_0 + c_1 e^{i w_0 t}+c_2 e^{2 i w_0 t}+c_3 e^{3 i w_0 t}+...+c_{m - 1} e^{ (m - 1) i w_0 t }
$$
を計算できる。
ただし、この推測した関数x(t)は観測時刻において正しい、つまり、$x(kD)=f(kD)(0\leq k \leq m - 1)$であるとする。また、$w_0=\dfrac{2\pi}{T}=\dfrac{2\pi}{mD}$にも注意する。

この時、条件から
$$
f(0)=x(0)=c_0+c_1e^{i\frac{2\pi}{mD}\times 0}+c_2e^{i\frac{2\pi}{mD}\times 0}+...+c_{m - 1}e^{i\frac{2\pi}{mD}\times 0}
$$
$$
f(D)=x(D)=c_0+c_1e^{i\frac{2\pi}{mD}\times D}+c_2e^{i\frac{2\pi}{mD}\times 2D}+...+c_{m - 1}e^{i\frac{2\pi}{mD}\times (m - 1)D}
$$
$\vdots$
$$
f(kD)=x(kD)=c_0+c_1e^{i\frac{2\pi}{mD}\times kD}+c_2e^{i\frac{2\pi}{mD}\times 2kD}+...+c_{m - 1}e^{i\frac{2\pi}{mD}\times (m - 1)kD}
$$
$\vdots$
$$
f((m - 1)D)=x((m - 1)D)=c_0+c_1e^{i\frac{2\pi}{mD}\times (m - 1)D}+c_2e^{i\frac{2\pi}{mD}\times 2(m - 1)D}+...+c_{m - 1}e^{i\frac{2\pi}{mD}\times (m - 1)(m - 1)D}
$$

となる。この条件から、$c_k$を求める。上式を整理して行列で表現すると以下のようになる。

$$
\left(
\begin{array}{c}
f(0)\\f(D)\\f(2D)\\ \vdots \\ f(kD) \\ \vdots \\ f((m - 1)D)
\end{array}
\right)
=
\left(
\begin{array}{c}
e^{i\frac{0}{m}2\pi}&e^{i\frac{0}{m}2\pi}&e^{i\frac{0}{m}2\pi}&\dots&e^{i\frac{0}{m}2\pi} &\dots&e^{i\frac{0}{m}2\pi}\\
e^{i\frac{0}{m}2\pi}&e^{i\frac{1}{m}2\pi}&e^{i\frac{2}{m}2\pi}&\dots&e^{i\frac{l}{m}2\pi} &\dots&e^{i\frac{m - 1}{m}2\pi}\\
e^{i\frac{0}{m}2\pi}&e^{i\frac{2}{m}2\pi}&e^{i\frac{4}{m}2\pi}&\dots&e^{i\frac{2l}{m}2\pi} &\dots&e^{i\frac{2(m - 1)}{m}2\pi}\\
&&&\vdots \\
e^{i\frac{0}{m}2\pi}&e^{i\frac{k}{m}2\pi}&e^{i\frac{2k}{m}2\pi}&\dots&e^{i\frac{lk}{m}2\pi} &\dots&e^{i\frac{(m - 1)k}{m}2\pi}\\
&&&\vdots \\
e^{i\frac{0}{m}2\pi}&e^{i\frac{m - 1}{m}2\pi}&e^{i\frac{2(m - 1)}{m}2\pi}&\dots&e^{i\frac{l(m - 1)}{m}2\pi} &\dots&e^{i\frac{(m - 1)(m - 1)}{m}2\pi}\\
\end{array}
\right)
\left(
\begin{array}{c}
c_0\\c_1\\c_2\\ \vdots \\ c_k \\ \vdots \\ c_{m - 1}
\end{array}
\right)
$$
これを$c_k$について解けば良いので、右辺の$m \times m $行列の転置行列を複素数で置き換えた随伴行列を左からかける。この時、
$$
\left(
\begin{array}{c}
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{0}{m}2\pi}&e^{-i\frac{0}{m}2\pi}&\dots&e^{-i\frac{0}{m}2\pi} &\dots&e^{-i\frac{0}{m}2\pi}\\
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{1}{m}2\pi}&e^{-i\frac{2}{m}2\pi}&\dots&e^{-i\frac{l}{m}2\pi} &\dots&e^{-i\frac{m - 1}{m}2\pi}\\
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{2}{m}2\pi}&e^{-i\frac{4}{m}2\pi}&\dots&e^{-i\frac{2l}{m}2\pi} &\dots&e^{-i\frac{2(m - 1)}{m}2\pi}\\
&&&\vdots \\
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{k}{m}2\pi}&e^{-i\frac{2k}{m}2\pi}&\dots&e^{-i\frac{lk}{m}2\pi} &\dots&e^{-i\frac{(m - 1)k}{m}2\pi}\\
&&&\vdots \\
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{m - 1}{m}2\pi}&e^{-i\frac{2(m - 1)}{m}2\pi}&\dots&e^{-i\frac{l(m - 1)}{m}2\pi} &\dots&e^{-i\frac{(m - 1)(m - 1)}{m}2\pi}\\
\end{array}
\right)
\left(
\begin{array}{c}
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{0}{m}2\pi}&e^{-i\frac{0}{m}2\pi}&\dots&e^{-i\frac{0}{m}2\pi} &\dots&e^{-i\frac{0}{m}2\pi}\\
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{1}{m}2\pi}&e^{-i\frac{2}{m}2\pi}&\dots&e^{-i\frac{l}{m}2\pi} &\dots&e^{-i\frac{m - 1}{m}2\pi}\\
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{2}{m}2\pi}&e^{-i\frac{4}{m}2\pi}&\dots&e^{-i\frac{2l}{m}2\pi} &\dots&e^{-i\frac{2(m - 1)}{m}2\pi}\\
&&&\vdots \\
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{k}{m}2\pi}&e^{-i\frac{2k}{m}2\pi}&\dots&e^{-i\frac{lk}{m}2\pi} &\dots&e^{-i\frac{(m - 1)k}{m}2\pi}\\
&&&\vdots \\
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{m - 1}{m}2\pi}&e^{-i\frac{2(m - 1)}{m}2\pi}&\dots&e^{-i\frac{l(m - 1)}{m}2\pi} &\dots&e^{-i\frac{(m - 1)(m - 1)}{m}2\pi}\\
\end{array}
\right)
=
\left(
\begin{array}{c}
m&0&0&\dots&0\\
0&m&0&\dots&0\\
0&0&m &\dots&0\\
&&&\vdots \\
0&0&0&\dots&m\\
\end{array}
\right)
$$
したがって、
$$
\left(
\begin{array}{c}
c_0\\c_1\\c_2\\ \vdots \\ c_k \\ \vdots \\ c_{m - 1}
\end{array}
\right)
=
\dfrac{1}{m}
\left(
\begin{array}{c}
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{0}{m}2\pi}&e^{-i\frac{0}{m}2\pi}&\dots&e^{-i\frac{0}{m}2\pi} &\dots&e^{-i\frac{0}{m}2\pi}\\
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{1}{m}2\pi}&e^{-i\frac{2}{m}2\pi}&\dots&e^{-i\frac{l}{m}2\pi} &\dots&e^{-i\frac{m - 1}{m}2\pi}\\
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{2}{m}2\pi}&e^{-i\frac{4}{m}2\pi}&\dots&e^{-i\frac{2l}{m}2\pi} &\dots&e^{-i\frac{2(m - 1)}{m}2\pi}\\
&&&\vdots \\
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{k}{m}2\pi}&e^{-i\frac{2k}{m}2\pi}&\dots&e^{-i\frac{lk}{m}2\pi} &\dots&e^{-i\frac{(m - 1)k}{m}2\pi}\\
&&&\vdots \\
e^{-i\frac{0}{m}2\pi}&e^{-i\frac{m - 1}{m}2\pi}&e^{-i\frac{2(m - 1)}{m}2\pi}&\dots&e^{-i\frac{l(m - 1)}{m}2\pi} &\dots&e^{-i\frac{(m - 1)(m - 1)}{m}2\pi}\\
\end{array}
\right)
\left(
\begin{array}{c}
f(0)\\f(D)\\f(2D)\\ \vdots \\ f(kD) \\ \vdots \\ f((m - 1)D)
\end{array}
\right)
$$
つまり、
$$
c_n=\dfrac{1}{m}\sum_{k=0}^{m - 1}f(k)e^{-in\frac{2\pi}{m}k}
$$
ともとまる。
また、逆離散フーリエ変換は、cからfを求めるので、
$$
\left(
\begin{array}{c}
f(0)\\f(D)\\f(2D)\\ \vdots \\ f(kD) \\ \vdots \\ f((m - 1)D)
\end{array}
\right)
=
\left(
\begin{array}{c}
e^{i\frac{0}{m}2\pi}&e^{i\frac{0}{m}2\pi}&e^{i\frac{0}{m}2\pi}&\dots&e^{i\frac{0}{m}2\pi} &\dots&e^{i\frac{0}{m}2\pi}\\
e^{i\frac{0}{m}2\pi}&e^{i\frac{1}{m}2\pi}&e^{i\frac{2}{m}2\pi}&\dots&e^{i\frac{l}{m}2\pi} &\dots&e^{i\frac{m - 1}{m}2\pi}\\
e^{i\frac{0}{m}2\pi}&e^{i\frac{2}{m}2\pi}&e^{i\frac{4}{m}2\pi}&\dots&e^{i\frac{2l}{m}2\pi} &\dots&e^{i\frac{2(m - 1)}{m}2\pi}\\
&&&\vdots \\
e^{i\frac{0}{m}2\pi}&e^{i\frac{k}{m}2\pi}&e^{i\frac{2k}{m}2\pi}&\dots&e^{i\frac{lk}{m}2\pi} &\dots&e^{i\frac{(m - 1)k}{m}2\pi}\\
&&&\vdots \\
e^{i\frac{0}{m}2\pi}&e^{i\frac{m - 1}{m}2\pi}&e^{i\frac{2(m - 1)}{m}2\pi}&\dots&e^{i\frac{l(m - 1)}{m}2\pi} &\dots&e^{i\frac{(m - 1)(m - 1)}{m}2\pi}\\
\end{array}
\right)
\left(
\begin{array}{c}
c_0\\c_1\\c_2\\ \vdots \\ c_k \\ \vdots \\ c_{m - 1}
\end{array}
\right)
$$
そのものである。
ただし、これらの変換は、文献によって定数倍変わることがある。

離散フーリエ変換はどれほど良い変換と言えるか

比較方法

比較するには、ある連続関数f(t)についての各周波数分布について、
比較したい部分の閉区間フーリエ変換とある周期での離散フーリエ変換を比較する。差はあるものの、同じ傾向を見て取れる。

周期が異なるために生じる困難

結局離散フーリエ変換は、定数倍の周期の波の足し合わせで表現しようという試みである。しかし、サンプリング周波数が偶然一致することはなかなか起こり得ない。通常は周期に対して非整数倍の周期である成分が存在する。
連続的な周期の積分でできていれば、その周波数においてのみ突出した値となるが、離散的であるために、横軸を周波数、縦軸を成分の大きさとしたグラフにおいて、整数周波数で表現しようとするため、本来の周波数を中心とした山のようになり、裾野が関係のない周波数のところまで伸びてしまう。この現象をゴースト(あるいはスカート)と呼ぶ。

区間の両端がつながらないために生じる困難

ある区間についてのフーリエ変換をする際、本来の波f(t)にその区間飲み1で他は0であるような方形窓関数をかけるわけだが、それを周期的拡張を行った時、両端が連続でないことから困難を生ずることがある。そのような事態を避けるため、方形窓関数でなく、より滑らかな関数をかけることにより、問題を回避する手法がある。それらの関数を窓関数という。窓関数により、本来とは異なる分析結果となるが、これはやむを得ないらしい。
この辺の理解はまだ曖昧であるので詳細は触れません。


参考文献

鏡 慎吾 http://www.ic.is.tohoku.ac.jp/~swk/lecture/yaruodsp/main.html

フーリエ解析の理論と自然現象のフィーリエ解析(1)


備忘録がてら書きましたが、誤りがあるかもしれません。
自分に都合が良いように書いたので飛ばし読みでお願いします。
また、このシリーズの更新を気まぐれで行うことがあります。


このシリーズでは、第一回で関数の三角関数による展開を簡単な事例から導入し、一般的な事例まで数学的な視点で確認する。第二回では実際に利用されることを想定した説明を試みる。デジタル的な分析においては標本化し、量子化するので、さらに応用して考える必要がある。


第一回では

で構成される。


フーリエ解析とは

あらゆる関数をベクトルとみなし、それらが基底ベクトル(関数)の線形結合で表現できないか、という試みの中で、特にその基底が三角関数に関するもの。
プリズムは光のフーリエ変換をしていると言える。

利用例

その基底が三角関数であることから、波の分析に利用される。

例えば、楽器は同じ音程でも音色の違いを生ずるが、それらは構成する倍音などの含み度合いが異なるために起こる現象である。また、目に見える波長や聞こえる音程以外の波長を省くことによる圧縮の技術や、雑音に相当する波長分布を削除することによるノイズキャンセルなど、身近なところで利用されている。

光について言えば、天文学の分野においてスペクトルの解析により、惑星などの構成元素の解明や、大きさ、運動に至るまでの分析が可能となる。
以下は太陽光のスペクトルであるが、フーリエ変換で行っていることは、与えられた波から以下のような分解することをしているだけである。

画像は
太陽光 - Wikipedia


関数のベクトルって?

集合$V$とその要素$\bm{a},\bm{b},\bm{c},...$の間に次の加法と数との乗法の二つが定義されている時、この集合Vをベクトル空間と言い、その要素をベクトルという。

一般的なベクトルの定義

加法

次の法則を満たす($\bm{a},\bm{b}\in V$)

1. $\bm{a}+\bm{b}=\bm{b}+\bm{a}$(交換法則)
2. $(\bm{a}+\bm{b})+c=\bm{a}+(\bm{b}+c)$(結合法則)
3. $V$の要素$0$がただ一つ存在し、$V$の任意の要素$\bm{a}$に対して、$0+\bm{a}=\bm{a}$
4. $V$の任意の要素$\bm{a}$に対して$V$の要素$\bm{a}'$がただ一つ存在して、$\bm{a}+\bm{a}'=0(逆ベクトルの存在)$

数との乗法

任意の数$k$と任意の$V$の要素$\bm{a}$に対して、これらの積と呼ばれる$V$の要素$k\bm{a}$が定まり、以下を満たす。
1. $1\bm{a}=\bm{a}$(単位法則)
2. $k(h\bm{a})=(kh)\bm{a}$(結合法則)
3. $k(\bm{a}+\bm{b})=k\bm{a}+k\bm{b}$(分配法則)
4. $(k+h)\bm{a}=k\bm{a}+h\bm{a}$(分配法則)

特に数が実数$R$にのみ属する時、実線形空間複素数$C$にのみ属する時、複素線形空間と言い、以下では$K$を$C$または$R$の意味で用いる。

  • 高校で習ったベクトルは確かに上をみたしている。
  • n次多項式の集合をVとして考え、加法と数の乗法を以下の様に定義するとn次多項式はベクトルとみなせる。
    • $A=\sum_{i=0}^na_ix^i,B=\sum_{i=0}^nb_ix^i \in V$として、
    • $A+B=\sum_{i=0}^n(a_i+b_i)x^i$
    • $kA=\sum_{i=0}^nka_ix^i$

線型独立

$\bm{a_i}\in V,c_i\in \bm{K}(i=0,1,...,k)$に対し、$\bm{a_1},\bm{a_2},...,\bm{a_k}$の線形結合を
$$c_1\bm{a_1}+c_2\bm{a_2}+...+c_k\bm{a_k}$$
と定義する。

ここで、ベクトル$\bm{a_1},\bm{a_2},...,\bm{a_k}$の関係
$$c_1\bm{a_1}+c_2\bm{a_2}+...+c_k\bm{a_k}=\bm{0}$$
を線形関係と言い、$c_i=0$としたものを自明な線形関係と呼ぶ。

$\bm{a_1},\bm{a_2},...,\bm{a_k}$に自明でない線形関係が存在する時、$\bm{a_1},\bm{a_2},...,\bm{a_k}$は線形従属であると言い、存在しない時、$\bm{a_1},\bm{a_2},...,\bm{a_k}$は線形独立であるという。

基底

線形空間$V$の有限個のベクトル(※注1)$\bm{e_1},\bm{e_2},...,\bm{e_n}$が次の条件を満たす時、$\bm{e_1},\bm{e_2},...,\bm{e_n}$は$V$の基底であるという。

  • $\bm{e_1},\bm{e_2},...,\bm{e_n}$は線型独立である
  • $V$の任意のベクトルは、$\bm{e_1},\bm{e_2},...,\bm{e_n}$の線形結合として表される。

内積

$K$上の線形空間$V$の元$\bm{a},\bm{a_1},\bm{a_2},\bm{b},\bm{b_1},\bm{b_2}$に対し、いかに定める$K$の元(内積)が定まる時、$V$を計量線形空間という。(内積の表記を$(\bm{a},\bm{b})$とする)
1. $(\bm{a},\bm{b_1}+\bm{b_2})=(\bm{a},\bm{b_1})+(\bm{a},\bm{b_2})$,$(\bm{a_1}+\bm{a_2},\bm{b})=(\bm{a_1},\bm{b})+(\bm{a}_2,\bm{b})$
2. $(c\bm{a},\bm{b})=c(\bm{a},\bm{b})$,$(\bm{a},c\bm{b})=c(\bm{a},\bm{b})$
3. $(\bm{a},\bm{b})=\overline{(\bm{b},\bm{a})}$
4. $(\bm{a},\bm{a})$は$0$または、正の実数であり、$(\bm{a},\bm{a})=0$となるのは、$\bm{a}=\bm{0}$に限る。

$(\bm{a},\bm{b})=0$の時、$\bm{a}$と$\bm{b}$は直交するという。
特に$K$が実数の時の(実)計量線形空間のことをユークリッド空間と言い、複素数の時の(複素)計量空間のことをユニタリ空間という。

  • 高校で習った内積は上の定義を満たす。
  • n次以下の実係数多項式空間の二つの多項式f,gについて、$\int_s^t f(x)\overline{g(x)}dx$は内積の定義を満たすので、この空間は計量空間という。
    • 高校で習ったベクトルは成分ごとの積の話だったのが、連続するxごとの和になっただけ。




基底のベクトルがお互いに垂直である時、直交規定と言い、さらに規定ベクトルの大きさが1である時、正規直交規定という。規定であるかによらず、単に$V$のベクトル$\bm{e_1},\bm{e_2},...,\bm{e_n}$が互いに直交する時それらを直交系、長さが1であればそれらを正規直交系という。

たとえば二次元座標上のベクトル空間において$(1,0)$,$(0,1)$は正規直行基底であり、$(2,0)$,$(1,1)$は正規直交規定でも直交規定でもないが、基底である。また、三次元ベクトル空間において、$(1,0,0)$,$(0,1,0)$は正規直交系であるが、正規直交基底ではない。(基底というには要素が足りない)

関数の基底ベクトル

テイラー展開

テイラー展開は、関数を点kを中心としたxの多項式で表そうとする試みであるが、関数系$x^n$はkを中心とする区間で定義された内積において、直交系であることが確認できる。

フーリエ級数展開

ここでは基底(に相当する部分)の確認を示す。以下のように展開される理由は後述。

有限区間の場合

また、0を中心とした有限区間$[-T/2,T/2]$で定義される関数f(t)について、nを自然数として、

$
f(t)=a_0+(a_1{\rm cos}\dfrac{2\pi t}{T}+b_1{\rm sin}\dfrac{2\pi t}{T})+(a_2{\rm cos}\dfrac{4\pi t}{T}+b_2{\rm sin}\dfrac{4\pi t}{T})+(a_3{\rm cos}\dfrac{6\pi t}{T}+b_3{\rm sin}\dfrac{6\pi t}{T})+...+(a_n{\rm cos}\dfrac{2n\pi t}{T}+b_n{\rm sin}\dfrac{2n\pi t}{T})+...
$

ただし、$a_0=\dfrac{1}{T}\int_{-\frac{T}{2}}^{\frac{T}{2}}f(t)dt$,$a_n=\dfrac{2}{T}\int_{-\frac{T}{2}}^{\frac{T}{2}}f(t){\rm cos}\dfrac{2n\pi t}{T}dt$,$b_n=\dfrac{2}{T}\int_{-\frac{T}{2}}^{\frac{T}{2}}f(t){\rm sin}\dfrac{2n\pi t}{T}dt$

の様にフーリエ級数展開される。この時$\{1,{\rm cos}\dfrac{2\pi t}{T},{\rm sin}\dfrac{2\pi t}{T},{\rm cos}\dfrac{4\pi t}{T},{\rm sin}\dfrac{4\pi t}{T},...,{\rm cos}\dfrac{2n\pi t}{T},{\rm sin}\dfrac{2n\pi t}{T},...\}$の一次結合によって任意の関数が表されるので、これらはf(t)から作られる関数空間の基底であることを意味する。さらに、それらの基底は$[-T/2,T/2]$おける内積で、直交することが確認できるので、正規直交基底となる。

実数全体を定義域にもつ関数f(t)について、連続的な周波数による分解に拡張した場合

展開系(逆フーリエ変換)は$f(t)=\dfrac{1}{2\pi}\int_{\infty}^{\infty}F(w)e^{iwt}dw$と表される。ここで、F(w)は角振動数wの波の大きさに対応する部分である。この時、$\int_{-\infty}^{\infty}e^{iw_1t}\overline{e^{iw_2t}}dt=2\pi\delta(w_1-w_2)$と表されるので、二つの異なる関数$e^{iw_1t}$、$e^{iw_2t}$は直交している。

フーリエ変換の理論

有限区間の場合

0を中心とした有限区間$[-T/2,T/2]$で定義される関数f(t)について、nを自然数として、

$
f(t)=a_0+(a_1{\rm cos}\dfrac{2\pi t}{T}+b_1{\rm sin}\dfrac{2\pi t}{T})+(a_2{\rm cos}\dfrac{4\pi t}{T}+b_2{\rm sin}\dfrac{4\pi t}{T})+(a_3{\rm cos}\dfrac{6\pi t}{T}+b_3{\rm sin}\dfrac{6\pi t}{T})+...\\+(a_n{\rm cos}\dfrac{2n\pi t}{T}+b_n{\rm sin}\dfrac{2n\pi t}{T})+...
$

のように展開できると、非常に嬉しい。なぜなら、このようにすれば、三角関数の合成により、角振動数$\dfrac{2n\pi}{T}$の大きさが$\sqrt{a_n^2+b_n^2}$とわかるからである。このように展開できるような組み$\{a_0,a_1,...,b_1,...\}$が存在するならば、それらはどのような値になるか求めたい。

係数の導出

ここで、これらの係数のかかる値は、直交基底であることを利用する。
表記を簡単にするため、$\dfrac{2\pi}{T}=w_0$とする。$f(t)$が上のように展開される時、$n>0$で
$\int_{-\frac{T}{2}}^{\frac{T}{2}}f(t){\rm cos}nw_0tdt$について考えると、f(t)を展開した時の${\rm cos}nw_0$以外の項との積の積分値は0となる。
つまり、$\int_{-\frac{T}{2}}^{\frac{T}{2}}f(t){\rm cos}nw_0tdt=a_n\times \dfrac{T}{2}$となる。ここから$a_n$はもとまる。同様にして$f(t)\times {\rm sin}nw_0$について考えることで$b_n$がもとまる。また、$f(t)\times 1$について考えることで$a_0$がもとまる。

区間が0中心でない時はtを定数分ずらす変換によりもとまる。つまり、有限区間[p,p+T]で定義されたf(t)のフーリエ級数展開
$f(t)=a_0+\sum (a_i {\rm cos}iw_0+b_i{\rm sin}iw_0)$については、
$a_0=\dfrac{1}{T}\int_{p}^{p+T}f(t)dt$,$a_n=\dfrac{2}{T}\int_{p}^{p+T}f(t){\rm cos}\dfrac{2n\pi t}{T}dt$,$b_n=\dfrac{2}{T}\int_{p}^{p+T}f(t){\rm sin}\dfrac{2n\pi t}{T}dt$である。

特徴

上で表されるフーリエ級数f(t)について、
$f(t+T)=f(t)$を満たす。これは、基底がtについて周期Tの関数であるからである。したがって、フーリエ級数変換では、有限の周期を持つ定義域が有限でない関数の表記も可能である。なお、不連続点がある場合の議論はここでは避け、以下で行う。

不連続点を持つ場合

上記で定めたルールによりフーリエ係数を求めたフーリエ級数展開は、不連続点を含む関数においてはどこまで展開しても、不連続点周辺において厳密には一致しない。このような現象をギッブス現象と呼ぶ。そのような点の周りではツノのようなものが生える。

例 以下で定める方形波の場合


展開すると$f(t)=\sum_k\dfrac{1}{2k-1}{\rm sin}t$となるが、kを125項まで展開したのが以下である。



出典:ギブズ現象 - Wikipedia



有限区間の場合(基底を複素数表示へ)

sin、cosが入っていたものを複素数を使うことにより、よりすっきりとした表示にすることを目指す。なお、この作業により、実数全体で定義された周期性のない関数への拡張の準備もできる。

オイラーの公式より$e^{inw_0t}={\rm cos}nw_0t+i{\rm sin}nw_0t$を利用して、sin、cosを複素数を用いて表すと、${\rm cos}nw_0t=\dfrac{e^{inw_0t}+e^{-inw_0t}}{2}$、${\rm sin}nw_0t=\dfrac{e^{inw_0t}-e^{-inw_0t}}{2}$である。ここから、a,bをsin,cosを用いないで表すことを試みる。表記を簡単にするため、
$$c_n=\dfrac{1}{T}\int_{\frac{T}
{2}}^{\frac{T}{2}}f(t)e^{-inw_0t}dt$$
とおく。

すると、$n>0$において、$a_n=c_{-n}+c_n$、$b_n=-i(c_{-n}-c_n)$、$a_0=c_0$とわかる。

以上から$f(t)=a_0+\sum_n (a_n {\rm cos} w_0t +b_n {\rm sin} w_0t)=c_0+\sum_{n=1}^{\infty}(c_{-n}e^{-inw_0t}+c_{n}e^{inw_0t})=\sum_{n=-\infty}^{\infty}c_ne^{inw_0t}$となる。結局、有限区間[-T/2,T/2]で定義された関数f(t)の複素フーリエ級数は、
$$
f(t)=\sum_{n=-\infty}^{\infty}c_ne^{inw_0t}
$$
である。
この時、$e^{inw_0t}$は区間[-T/2,T/2]で定義される内積を考えると確かに直交基底と言える。

無限区間の場合

有限区間のものとの対応が以下のようになる。

複素フーリエ係数$c_n=\dfrac{1}{T}\int_{\frac{T}
{2}}^{\frac{T}{2}}f(t)e^{-inw_0t}dt$に相当するものが、フーリエ変換
$$
F(w)=\int_{-\infty}^{\infty}f(t)e^{-iwt}dt
$$

複素フーリエ級数$f(t)=\sum_{n=-\infty}^{\infty}c_ne^{inw_0t}$に相当するのが逆フーリエ変換
$$
f(t)=\dfrac{1}{2\pi}\int_{-\infty}^{\infty}F(w)e^{iwt}dw
$$

ここで注目したいのは、離散的な波長nw_0について足し合わせていたのが、
連続的な波長wの積分に置き換わったことである。
したがって、今まではスペクトルは、横軸を波長、縦軸を強度とした時まばらな棒グラフになったが、今回は曲線になる。

係数に相当する部分の導出

連続的なスペクトルに分解したい時の目標は以下におけるG(w)が存在すればどのような値になるかである。存在しない時は以下のラプラス変換を参照のこと。
$$
f(t)=\int_{-\infty}^{\infty}G(w)e^{iwt}dw
$$

この時も先ほどa,bで係数を求めたのと同じように、関数が直交していることを利用する。すなわち、$f(t)$に$e^{-iw't}$をかけて、$-\infty$から$\infty$までtで積分する。

$$
\begin{array}{lll}
&\int_{-\infty}^{\infty}f(t)e^{-iw't}dt\\
=&\int_{-\infty}^{\infty}\{\int_{-\infty}^{\infty}G(w)e^{iwt}dw\}e^{-iw't}dt\\
=&\int_{-\infty}^{\infty}\int_{-\infty}^{\infty}G(w)e^{iwt}e^{-iw't}dwdt\\
=&\int_{-\infty}^{\infty}G(w)\int_{-\infty}^{\infty}e^{i(w-w')t}dtdw\\
=&2\pi\int_{-\infty}^{\infty}G(w)\delta(w-w')dw\\
=&2\pi G(w')
\end{array}
$$
これよりG(w)がもとまる。文献によるが、ここでは関数f(t)のフーリエ変換$F(w)$は$F(w)=2\pi G(w)$ とする。

ラプラス変換

無限区間でF(w)が存在した場合はフーリエ変換ができることが確認された。このF(w)の存在条件は、関数f(t)が絶対可積分であること、つまり、$\int_{-\infty}^{\infty}|f(t)|dt$が収束することである。なお、この時、$f(\pm\infty)=0$が成立している。

しかし、簡単である関数なのにフーリエ変換できない関数がある。例えば、0以上で1、0未満で0である関数f(t)はF(w)を求められない。

このような物でも分析するためのアイデアとして、以下のg(t)を元のf(t)にかけてからフーリエ変換を行う手法がある。cは適当な正の実数。
$$
g(t) =
\begin{cases}
e^{-ct}, & t \ge 0 \\
0, & t < 0
\end{cases}
$$
ここで$t<0$で0としたのは、f(t)において通常t=0でスイッチを入れるなどして、それ以降に興味があるためであるからである。また、$t\ge 0$において$e^{-ct}$としたのは、tが無限大になるにつれ、0に早く収束するためである。
g(t)をかけてフーリエ変換した時、
$$
\begin{array}{lll}
&\int_{-\infty}^{\infty}f(t)e^{-iwt}g(t)dt\\
=&\int_{-\infty}^{0}f(t)e^{-iwt}0dt+\int_{0}^{\infty}f(t)e^{-iwt}e^{-ct}dt\\
=&\int_{0}^{\infty}f(t)e^{-(c+iw)t}dt\\
=&\int_{0}^{\infty}f(t)e^{-st}dt \quad (s=c+iw)\\
=&F(s)
\end{array}
$$
すなわち

$$
F(s)=\int_{0}^{\infty}f(t)e^{-st}dt
$$
(ただしsは複素数)

と表され、これをf(t)の片側ラプラス変換という。理工学の分野ではラプラス変換は片側プラス変換を表すことが多い。

また、上のラプラス変換において、f(t)を原関数、t関数、表関数と呼び、それに対応してf(t)のラプラス変換F(s)を像関数、s関数、裏関数と呼ぶ。

ラプラス変換

フーリへ変換においては波長wに注目したF(w)から、逆フーリエ変換でwを積分することによりf(t)に戻った。ラプラス変換においてはwではなく、sに注目してF(s)を求めた。そのため、逆ラプラス変換でf(t)を求める際は積分をwではなくsについて実行したい。
この時、$f(t)g(t)$のフーリエ変換を$G(w)(=F(s))$とすると、逆フーリエ変換では、$f(t)g(t)=\dfrac{1}{2\pi}\int_{-\infty}^{\infty}G(w)e^{iwt}dw$となるが、$t\ge 0$で考えると
$f(t)e^{-ct}=\dfrac{1}{2\pi}\int_{-\infty}^{\infty}G(w)e^{iwt}dw$となる。両辺に$e^{ct}$をかけて、wでなくsの積分にするため、置換することで、
$$
f(t)=\dfrac{1}{2\pi i}\int_{c-i\infty}^{c+i\infty}F(s)e^{st}dw
\quad (t\geq 0)
$$
以上が逆ラプラス変換である。

ラプラス変換をささっと行うために

ラプラス変換の計算は一般に大変であるので、ラプラス変換の性質を把握した上で代表的な関数f(t)について予め計算しておこう。
ここで、関数fのラプラス変換をL(f,s)と置くことにする。

ラプラス変換の性質
  • $L(cf,s)=cL(f,s)\quad L(f\pm g,s)=L(f,s)\pm L(g,s)$ (線形性)
  • $f(t)\neq g(t) \Rightarrow L(f,s)\neq L(g,s)$ (ラプラス変換は 1:1対応)
  • $L(f'(t),s)=sF(s)-f(0)$ (ラプラス変換すると微分を掛け算と引き算で計算できる)
    • 証明は部分積分によりf(t)の積分にすることでできる。
    • ただし、前提として、$f(t)e^{-st}\to 0$ (f(t)に比べ、$e^{ct}$が十分大きい)。
  • より一般には$L(f^{(n)}(t),s)=s^nF(s)-\sum_{j=1}^{n}s^{n-j}f^{(j-1)}(0)$
  • $L(e^{-at}f(t),s)=L(f(t),s+a)=F(s+a)$(ラプラス変換の推移率)
    • 証明は簡単
  • f(t)が時間軸上で$t_0$だけ移動した関数$f(t-t_0)$について、以下で定めるユニット関数u(t)を用いると次の性質がある。(ラプラス変換の推移率)
    • $L(f(t-t_0)u(t-t_0),s)=e^{-st_0}L(f(t),s)=e^{-st_0}F(s)$
      • 証明は置換積分で行う。

$$
u(t) =
\begin{cases}
1, & t \ge 0 \\
0, & t < 0
\end{cases}
$$

  • $a>0$に対し、$L(f(at),s)=\dfrac{1}{a}F(\dfrac{s}{a})$(ラプラス変換の相似性)
    • 証明は置換積分で行う。
代表的なラプラス変換
f(t) F(s) 証明方法例($s=c+wi$における適当な値cの制限)
1(ユニット関数) $\dfrac{1}{s}$ ($c>0$)
$t^n$ $\dfrac{n!}{s^{n+1}}$ 部分積分と漸化式(c>0)
$\delta(t)$ 1 $\int_{-\infty}^{\infty}g(t)\delta (t)dt=g(0)$を利用
$e^{at}$ $\dfrac{1}{s-a}$ $(Re(s-a)>0)$
cos$wt$ $\dfrac{s}{s^2+w^2}$ cosを複素数で表す($c>0$)
sin$wt$ $\dfrac{w}{s^2+w^2}$ sinを複素数で表す($c>0$)

参考文献