第9回 フーリエ変換と離散フーリエ変換(6月9日)


フーリエ級数展開


入力例1

f[x_] :=自分で入力;

FourierTrigSeries[f[x], x, 5] 

フーリエ級数展開は、複雑な周期関数を正弦波と余弦波の和で近似するものであった。

FourierTrigSeriesは、関数 を三角関数( と )の和に展開したものである。

入力例2

FourierSeries[f[x], x, 5]

オイラーの公式   

を用いると、

  ,  

のように、三角関数は複素数の指数関数で表すことができる。指数関数にして議論する方が微分積分が容易であるため、一般的には指数関数の形で使われることが多い。実部が (偶関数)、虚部が (奇関数)を表す。入力例1(三角関数による表示)のフーリエ級数展開と入力例2(指数関数による表示)を比べてみよう。

fourier4


入力例3

g[x_, n_] := FourierTrigSeries[f[x], x, n]

Manipulate[Plot[Evaluate[g2[x, n]], {x, -2 Pi, 2 Pi}, PlotRange -> All], {n,1, 50, 1}]

不連続点のまわりは、nを増やしていってもギザギザが残る。これはギブズ現象 (Gibbs phenomenon) とよばれる。

入力例3でnを大きくしていったときに関数f(x)に収束していく様子を観察しよう。




これまでは、周期 の関数をフーリエ級数展開したが、一般的に周期が のときのフーリエ級数展開は、角振動数 なので、次のようになる。


fourier5



非周期関数の複素フーリエ級数→フーリエ変換


フーリエ級数展開では、周期を持つ関数(持たない場合も繰り返して周期関数と考えて)を考えました。では、周期を持たない一般的な関数(非周期関数)をフーリエ級数展開するためにはどうすれば良いだろうか。

この場合は、非周期関数 を区間 で考えて、この を限りなく大きくする、ということを考える( )。このとき、展開は無限級数の形ではなく積分の形で表現される。

複素数と指数関数によるフーリエ級数展開の式

 

                                      

において、 とおくと、 のとき なので、

 

      

区分求積法より のとき、 と置き換えられるので、

 

        

ここで、

 

とおくと、もとの非周期関数 は、

 

と表すことができる。

 の式をフーリエ変換、 の式は のフーリエ積分(逆フーリエ変換)という。


フーリエ変換ができる条件

非周期関数については、いつでもフーリエ変換できるわけではない。

定理「非周期関数 が の区間で区分的に滑らかで、かつ、絶対可積分ならば、そのフーリエ変換が存在する。」

ここで、 が絶対可積分であるとは、

 

となる が存在する(積分が有限値をとる)ことを意味する。 


音とフーリエ変換


これまでのフーリエ級数展開とフーリエ変換において、 や は角振動数であり、角振動数を から まで変えた波の足しあわせ(フーリエ変換では積分)を考えた。フーリエ変換で、波を時間 (秒)の関数 で表し、 を角振動数 (rad/秒)で書き直すと、

 

ここで、音の性質を考えるために、角振動数ではなく周波数を用いてフーリエ変換を考える。角振動数 (rad/秒)は、周波数 (Hz)を使って、

 

変数変換( )して、

 

よって、フーリエ変換

 

を得る。さらに、フーリエ積分

 

を得る。

この2つの式によって、時間領域 と周波数領域 を自由に行き来することが可能になる。特に、フーリエ変換では、波 を構成する三角関数とその周波数・振幅・初期位相などを知ることができるため、波の特徴を明確に捉えることができる。


離散フーリエ変換


これまでは、連続関数に対するフーリエ変換およびフーリエ積分(逆フーリエ変換)について考えてきた。実際、音声や音楽などは、連続的な波として出力される。しかし、コンピュータは離散値でしか扱えないため、Analog-Didital (AD) 変換器を使って、一定間隔でサンプリングし、コンピュータが直接扱える離散的な波に変換される。


入力例4

data=Import["Desktop/kajika_flog2.mp3"]

音のmp3ファイル(workフォルダに1つ例が置いてある)をMathematicaにインポートして、そのデータをdataとする。


入力例5

datalist = Part[data, 1, 1, 1]


Length[datalist]

dataの中にはいくつかの種類のデータが入っているため、音のデータ部分を取り出し(Part[])、離散のデータが並んでいることを確認する。

Lengthで、datalistの中に、何個のデータが入っているか知ることができる。

入力例6

ListPlot[datalist, PlotRange -> All]


横軸がデータ番号、縦軸がそのデータの値である。


入力例7

ListPlay[datalist, SampleRate -> 44100]

SampleRateは、1秒間あたりのサンプリング数である。SampleRateの値を変えてみると何が起きるか確かめてみよう。



連続的な波と離散的な波の関係


フーリエ変換は、連続的な波を三角関数を重ね合わせることで表そうとするものであった。例えば、下図のように、8個の周期関数を重ね合わせたものが実際の音であったとする。

次に、AD変換によって、1秒間に4個のサンプリング数(4等分)で連続的な波が離散化されたとする(黒丸)。よく見てみると、 の離散の4点は の離散の4点と全く同じである。実は と についても同様である。
つまり、離散化された波においては、高周波数の波は低周波数の波に吸収されてしまう。今の場合は、重ね合わせられた複雑な波が、
の三角関数のみで表せるということになってしまう。
しかし、容易に予想できるように、サンプリング数を増やすと、この問題は解消する。下図は、サンプリング数を8個にした場合である。、
の離散の4点と の離散の4点と異なる値をとるため、別の波として認識される。


離散フーリエ変換を用いた音などの解析や加工には、サンプリングは非常に重要な要素であり、扱う波についてある程度特徴や性質を知っている必要がある。例えば、人間が聞くことができる音の周波数は、20 Hzから20 kHzと言われている(一般的には15 kHzくらいまで)ので、人間が聞くことができるすべての周波数をカバーしようとすると、サンプリング数は1秒間あたり、20000(Hz)×2=40000 回必要となる。Mathematicaでは音源をインポートすると44100回となっているので、人間が聞こえる音を十分カバーできているのがわかる。


入力例8
fの値を変えてみよ。

f = 20;
Play[Sin[2*Pi*f*t], {t, 0, 3}, SampleRate -> 44100]

f = 20 (Hz) 聞こえない
f = 27.5 (Hz) ピアノの一番低い鍵盤
f = 4096 (Hz) 
ピアノの一番高い鍵盤
f = 440 (Hz) 時報のピ
f = 880 (Hz) 時報のポーン
f = 1000 (Hz)  男性の声の主成分
f = 2000 (Hz) 女性の声の主成分