フーリエ変換

どんな波形も、いろいろな周波数の正弦波の足し合わせとして表せることと、波形から周波数ごとの成分を取り出す計算(フーリエ変換)について説明します。

<注意>
このページでは、数式を表示するためにMathJaxを使用しています。ブラウザの設定でスクリプト実行をブロックしている場合、ページ内の数式が正しく表示されません。

波形は正弦波の足し合わせ

周期\(\ T\ \)で繰り返す波形は、周波数\(\ f_0 = 1/T\ \)の正弦波と、その整数倍の周波数の正弦波の足し合わせで表せます(フーリエ級数)。

\[ x(t) = a_0 + \sum_{k=1}^{\infty} A_k \cos(2\pi k f_0 t + \alpha_k) \]

周波数\(\ f_0\ \)の成分を基音、\(\ k f_0\ \)の成分を第\(\ k\ \)倍音と言います。
音の高さは基音の周波数で決まり(音程と周波数)、音色は倍音の大きさの割合(\(\ A_k\ \)の並び)で決まります。

たとえば、矩形波(振幅1)は、奇数番目の倍音だけでできています。

\[ \text{矩形波} = \frac{4}{\pi}\left( \sin\theta + \frac{\sin 3\theta}{3} + \frac{\sin 5\theta}{5} + \cdots \right) \]

矩形波を、倍音を足していって作る

倍音を足すほど矩形波に近づきますが、角のところには、どれだけ足しても飛び出しが残ります(跳びの大きさの約9%、ギブズの現象)。

スペクトル

倍音ごとの大きさを並べたものをスペクトルと言います。

正弦波・矩形波・のこぎり波と、そのスペクトル

波形含まれる倍音第\(\ k\ \)倍音の大きさ音色
正弦波基音だけ-澄んだ、丸い音
矩形波奇数番目だけ\(\ 1/k\ \)に比例中空な、木管楽器のような音
のこぎり波すべて\(\ 1/k\ \)に比例明るい、金管楽器や弦楽器のような音

角が鋭い波形ほど、高い倍音を多く含みます。
SNESでは、短い1周期分の波形をBRRのサンプルにしてループさせる音色がよく使われます(BRR)。
波形の形を変えることは、倍音の割合を変えることにあたります。

離散フーリエ変換(DFT)

コンピュータが扱う波形は、飛び飛びのサンプル\(\ x[0],\ x[1],\ \dots,\ x[N-1]\ \)です(サンプリングとデジタルフィルタ)。
この\(\ N\ \)個のサンプルから、周波数ごとの成分を求める計算を離散フーリエ変換と言います。

定義 (離散フーリエ変換)

\[ X[k] = \sum_{n=0}^{N-1} x[n]\, e^{-2\pi i k n / N} \qquad (k = 0,\ 1,\ \dots,\ N-1) \]

\(\ e^{-2\pi i kn/N}\ \)は、複素数の1の\(\ N\ \)乗根を\(\ k\ \)個おきにたどるもので、\(\ N\ \)サンプルの間にちょうど\(\ k\ \)回まわる正弦波を表しています。
\(\ X[k]\ \)は、波形とこの正弦波を掛けて足したもので、波形の中に「\(\ N\ \)サンプルに\(\ k\ \)周期の成分」がどれだけ含まれているかを表します。

  • \(\ |X[k]|\ \)が、その成分の大きさ(\(\ X[k]\ \)の偏角が位相)を表します。振幅に直すには\(\ 2/N\ \)倍します(\(\ k = 0\ \)は\(\ 1/N\ \)倍)。
  • \(\ X[k]\ \)の周波数は\(\ kF_s/N\ \)です(\(\ F_s\ \)はサンプリング周波数)。
  • サンプルが実数なら、\(\ X[N-k]\ \)は\(\ X[k]\ \)の共役複素数になるので、意味があるのは\(\ k = 0\ \)~\(\ N/2\ \)の半分だけです。\(\ k = N/2\ \)がナイキスト周波数にあたります。

逆に、\(\ X[k]\ \)から元のサンプルに戻す計算もあります(逆離散フーリエ変換)。

\[ x[n] = \frac{1}{N}\sum_{k=0}^{N-1} X[k]\, e^{2\pi i k n / N} \]

周波数の分解能

\(\ N\ \)個のサンプルからは、\(\ F_s/N\ \)おきの周波数しか分かりません。
32kHzのサンプルを1024個使えば、約31Hzおきです。
細かく調べるには、より長い時間のサンプルが必要です。

スペクトルの漏れ

\(\ N\ \)サンプルの中に、正弦波がちょうど整数回入っていないと、1つの周波数の成分が、周りの\(\ k\ \)にも漏れて見えます。

32サンプルに4周期と4.5周期の余弦波の、DFTの結果

4周期ちょうどなら\(\ k = 4\ \)だけに出ますが、4.5周期では\(\ k = 4\ \)と\(\ 5\ \)を中心に、すべての\(\ k\ \)に広がります。
これは、DFTが「\(\ N\ \)サンプルの波形が繰り返している」とみなして計算するため、端と端のつなぎ目の段差が、余分な成分として現れるからです。
実際の音を調べるときは、両端を0に近づける重み(窓関数)を掛けてから計算して、漏れを減らします。

ループするBRRのサンプルは、ループの長さがちょうど波形の整数周期になるように作ります。
ずれていると、つなぎ目で波形が段差になり、余分な成分(ノイズ)が聞こえます。

計算の量

定義どおりに計算すると、掛け算が\(\ N^2\ \)回必要です。
\(\ N\ \)が2のべき乗のとき、計算を半分ずつに分けていく方法(高速フーリエ変換、FFT)を使うと、約\(\ N\log_2 N\ \)回で済みます。
SNESの上でスペクトルを計算することはまずありませんが、パソコンで音のサンプルを調べたり作ったりするときに使います。

フィルタとスペクトル

定理 (畳み込み定理)
FIRフィルタの出力のスペクトルは、入力のスペクトルと、フィルタの係数のスペクトルの積になる。

サンプリングとデジタルフィルタの「FIRフィルタの周波数特性」の式は、フィルタの係数\(\ h_k\ \)のフーリエ変換です。
フィルタは、周波数ごとに、決まった倍率を掛けるはたらきをします。
係数の並びを見るより、そのスペクトルを見たほうが、どの高さの音を通してどの高さの音を弱めるかがすぐに分かります。

エイリアシングをスペクトルで見る

サンプリング周波数\(\ F_s\ \)で表せるのは、\(\ F_s/2\ \)までの周波数です。
\(\ F_s/2\ \)を超える成分は、\(\ F_s/2\ \)を境に折り返した周波数に重なって現れます(エイリアシング)。

ピッチを上げてサンプルを再生すると、スペクトル全体が高いほうへ伸びます。
高い倍音が16kHz(DSPのナイキスト周波数)を超えると、折り返して、元の音と関係のない周波数に現れます。
倍音の多い音色(矩形波やのこぎり波)ほど、高いピッチで鳴らしたときに折り返しの雑音が目立つのはこのためです。

参照

複素数
三角関数
音程と周波数
サンプリングとデジタルフィルタ
Z変換
BRR