第11回 FFT・窓関数・MP3(6月23日)


出席確認(10:15〜11:45)

・メールにて、課題1を行ったMathematicaファイルを送ること。

宛先:miwamoto[at] riko.shimane-u.ac.jp

件名:MMM1 0623



 音声などの波は、本来は連続的な波だがコンピュータで処理する場合には、その波を一定の刻み幅で分割し、離散的な波にするのであった。解析するときには、離散フーリエ変換を使って、周波数成分とその成分の比率を知ることができる。刻み幅が小さければより正確に元の波を再現できるが、その分、データ数(ファイルサイズ)は大きくなってしまい、また、離散フーリエ変換の計算量も多くなってしまう。今回は、離散フーリエ変換において、次のことを考える。

・計算量を減らす(高速化

・スペクトルをより鮮明に取り出す(最適化)

・ファイルサイズを減らす(圧縮)



計算量を減らしたい(高速化) → FFT (高速フーリエ変換)


 高速フーリエ変換(Fast Fourier Transform,  FFT)は、離散フーリエ変換の対称性に着目して、その計算量を減らすための手法で、1965年にJ.W. CooleyとJ.W. Tukeyにより発表された。実は、Mathematicaの"Fourier[ ]”コマンドはFFTである。実際にどのように計算量を減らしているのか見てみよう。

離散フーリエ変換の式


ここで、 は、データを読み込んだ秒数、 はデータの個数、  はデータの間隔なので、 という関係がある。ここで、簡単のため  (sec)としてみると、離散フーリエ変換の式は

 

となる。なお、 は何番目のデータか、 は基本周波数の何倍か、を表している。

さてここで、データの個数 を決めると、 の部分が決まるのがわかる。この部分を一般的にWで表し、回転子と呼ばれる。オイラーの公式から、この部分は三角関数で表される。

 

  も入れた式でかいておくと、

 

よって、

 

データの数 としてみる。

 のとき      

 のとき     

 のとき     

 のとき    

ここで、回転子 について計算してみると、

  

 

 

 

  

 

  

となり、複素平面上を4等分する座標であることがわかる。 について、 で書き直してみると、

   

  

   

 

さらに行列式で表すと、

 

となる。 この離散フーリエ変換をそのまま計算すると、複素数の乗算の回数だけで 回の演算が必要になる。 が大きくなると計算量が爆発的に増えてしまいコンピュータで計算するにしても大きな問題であった。そこで、離散フーリエ変換の周期性と対称性に着目した高速フーリエ変換が発見された。

回転子の行列の第2列と第3列を入れ替えると、同じ要素の小行列ができる。


さらに、右下の小行列も でくくると、


と変形することができる。さらに演算順序を変えずに小行列を展開すると高速フーリエ変換の式が得られる(あとは省略。自分でやってみると良いでしょう)。

この方法によって計算量は  は自然数のとき)まで減らすことができる。

 


スペクトルを鮮明に取り出したい(最適化) → 窓関数


 実際にスペクトル解析する場合の多くは、長い信号の一部を切り出してフーリエ変換を行うことになる。離散フーリエ変換では、データの周期性が仮定されているため、切り出した部分の右端と左端の値が大きくずれていると、仮想的に周期的に張り合わされた部分で急激にデータが変化しているように見え、離散フーリエ変換で得られるスペクトルに影響を与えてしまう。この問題を解消するために、取り出したデータに窓関数をかけることで、右端と左端のずれを少なくする方法が一般的である。


窓関数の種類 

 窓関数には様々な種類が提唱されている。以下に代表的な例を挙げる。

 Mathematicaを使って、-1 < x < 1の範囲をプロットして形を確かめてみよう。オプションでFilling -> Axisを指定すると自動的に半透明になって重ねて見える。

① ディリクレ窓(矩形窓)DirichletWindow[x]

② ガウス窓 GaussianWindow[x]

③ 余弦窓 CosineWindow[x]

④ ハン窓 HannWindow[x]

⑤ ハミング窓 HammingWindow[x] 


⑥ ブラックマン窓 BlackmanWindow[x]

⑦ カイザー窓 KaiserWindow[x]

⑧ テューキー窓 TukeyWindow[x]

⑨ バートレット窓 BartlettWindow[x]

⑩ ナットール窓 NuttallWindow[x]





❶ ブラックマン‐ハリス窓 BlackmanHarrisWindow[x]

❷ バートレット・ハン窓 BartlettHannWindow[x]

❸ パルザン窓 ParzenWindow[x]

❹ ランチョス窓 LanczosWindow[x]

❺ ハン・ポアソン窓 HannPoissonWindow[x]



窓関数の離散化


 窓関数は連続関数で定義されている。しかし、実際に窓関数を離散データにかける場合は、窓関数を離散化する必要がある。離散化にはArrayを使う。

入力例1

ListPlot[Array[HammingWindow, 15, {-0.5, 0.5}]]

入力例1は、ハミング窓を離散化したものである。15や0.5の値を変えてどんなことが起こるか見てみよう。44100のデータに窓関数をかける場合はどうすれば良いだろうか。

他の窓関数も離散化してプロットしてみよう。


窓をかける(窓関数をかける)


実際の離散データに窓をかけるとどうなるか見てみよう。

datalist

200個の離散データ




w=Array[HammingWindow, 200, {-0.5, 0.5}]

200個に離散化したハミング窓関数






datalist*w

200個の離散データのそれぞれの要素(青)に、200個のハミング窓関数のそれぞれの要素をかけたもの(オレンジ)。

右端と左端のずれが軽減されている。


課題1 前回の離散フーリエ解析で、窓関数をかけて、スペクトルを最適化してみよう。



ファイルサイズを減らしたい → 圧縮



 音声の連続的なデータを離散的なデータに変換することをエンコード(符号化)、元に戻す変換をデコード(復号)といい、その双方向の処理を可能にする装置やソフトウェア、アルゴリズムをコーデックという。音楽CDやDVDなどは、エンコードする際、圧縮しない(非圧縮)ため、音質がとても良い反面、データのサイズが大きい。WindowsのWAVファイルも非圧縮形式である。

 パソコンや持ち歩きを重視するような音楽プレーヤーの場合、データサイズが大きいのは致命的であった。そこで、データを圧縮することでファイルサイズを減らす方法が考えられた。圧縮方法には大きく分けて可逆圧縮非可逆圧縮がある。

 Apple Loseless (ALAC, iTunesなどで使われている)などは、可逆圧縮であり、デコードしたときに元の波形を再現できる。ALACは音質を劣化させずにファイルサイズを1/2程度まで減らすことができる。一方、MP3などは、非可逆圧縮であり、デコードしたときに元の波形を再現できないが、ファイルサイズを1/10程度まで減らすことができる。MP3は広く普及している形式で様々なオーディオプレイヤーで再生することができる。現在は、iTunes StoreがMP3の後継規格であるAdvanced Audio Coding (AAC, 非可逆形式)を採用したため、AACの利用も増えてきている。



MP3とは


 MP3とは、MPEG-1 (またはMPEG-2) Audio Layer-IIIの略である。Layer-IやLayer-IIと比べて圧縮率が最も高い。MP3のような音声圧縮では、音響心理学(人間の聴覚に関する学問)を用いて、人間の耳に聞こえない音を省いてデータの数を減らしている。実際にどのような音を省いているのか見てみよう。


人間の感度


 音の大きさ (ラウドネス, Loudness)は、人間の聴覚が感じる音の強さであり心理的な量である。人間は、同じ周波数の音であれば、音圧が大きくなるほど大きな音に聞こえるが、同じ音圧で異なる周波数の場合、感じる音の大きさは異なる。この特性を表した曲線を等ラウドネス曲線(左図、産総研のページよりという。等ラウドネス曲線では、感じる音の大きさが一定となるように音圧と周波数の値を結んでいる。人間は低周波数の音は聴きづらく、高周波数すぎても聴きづらい。中間の周波数が最も聴きやすいという特性がある。他人のヘッドフォンからドラムのシャカシャカとした音ばかり漏れ聞こえるのも、最も聴きやすい周波数だからである。

 この中で、最小可聴値(absolute threshold of hearing、ATHと描かれた曲線より小さい音圧は、人間には聴こえない。そこで、聴こえないほど小さい音は消してしまおう、というのが1つ目の圧縮(データ量を減らす)アルゴリズムである。ATHは周波数に対応して一意に定まる。最初に実験データであるラウドネス曲線があり、その後解析的に定式化された。


マスキング効果


 スポーツスタジアムなどの応援の声が大きいと、隣の人との会話もよく聴こえないということがある。このように、ある周波数で非常に大きな音が発生した場合、人間の耳は、その大きな音に近い周波数帯の小さな音が聴こえづらくなるという特性(マスキング効果)を持っている。聴こえづらいならば消してしまおう、というのが2つ目のデータ圧縮のアルゴリズムである。

 左図のようにAの周波数が大きい音がなると、特定領域(critical band)と呼ばれる領域内に入り込んでしまったCの周波数の音は聞こえなくなる。Bの音は聞くことができる。critical bandは、人間の耳の認識周波数単位であるBark(バーク)尺度の単位で25個あり、低周波ほど狭く、高周波ほど広くなっている。

 マスキング効果は周波数方向だけでなく、時間方向にも効果を表す。つまり、非常に大きな音がする前後の音はかき消されてしまうのである。直後だけでなく直前の音まで聞こえなくなるのは不思議である。

左図の場合は、直前のCは聴こえないが、直後のBは聞くことができる。実際の時間マスキングのcritical bandはもう少しいびつな形をしている。


可聴範囲


 さらに、人間には、可聴範囲があり 20 Hz 〜20000 Hz(実際は16000 Hz程度)の範囲に入っていない音は消してしまっても影響はない。これが3つ目の圧縮アルゴリズムである。


Descrete Cosine Transform (DCT) 離散コサイン変換


 このように、3つのアルゴリズムを使って、周波数領域で高周波成分や耳の鈍感な部分に割り当てる情報量を減らしことで、大幅にデータ数を減らすこと(圧縮)ができる。実はこの3つは、MP3だけでなくMP1 (MPEG-1 Audio Layer-I)やMP2 (MPEG-1 Audio Layer-II)でも使われている圧縮アルゴリズムである。

 さらにMP3では、MDCT (Modified Descrete Cosine Transform)を使っている。MP3では、音をブロック単位で窓関数をかけて周波数変換を行う。窓関数を使うのは、周波数成分の分析能力をあげるためである。しかし、窓関数をかけると、ブロックの両端が0 (もしくはほぼ0)になってしまうため、元の音声が復元できなくなってしまう。そこで、ブロックを半分ずつ重複させて変換させることでその問題を解消しているが、その場合、重複した分だけ、周波数変換後のデータが多くなってしまい、データ量が二倍となる。それを解決するために、半分の周波数成分で完全再構成が保障されるMDCTを用いる。