離散フーリエ変換

音の64個のサンプルとその離散フーリエ変換です。音を整数の周期からずらすと、一本のきれいな棒がスペクトル全体に広がるにじみに変わります。ビンを選ぶと、64本の矢印が頭から尾へとつなぎ合わされていく様子を見ることができます。また、窓関数をオンにして、それによって何が得られ、何が失われるのかを確認してください。

インタラクティブシミュレーションを読み込んでいます...

レッスン

理論 — 離散フーリエ変換

N個のサンプルx0 … xN−1の離散フーリエ変換は、Xk = Σn xn e−2πikn/N というN個の数値です。これはビンkごとに一つあり、N個のサンプル内でk周期を完了する波が信号にどれだけ含まれているかをそれぞれ測定します。サンプルを繰り返す信号の1周期として扱うため、整数の周期を完了する音には正確ですが、それ以外の音はすべてのビンに広げてしまいます。これがスペクトル漏れです。つなぎ目を滑らかにするために、最初に窓関数wnをサンプルに掛け合わせます。

各記号の意味

A_k
ビンkが示す振幅、つまり棒が表すもの。0 < k < N/2 の場合は 2|Xk|/(N·G) であり、共有する鏡像ビンを持たない k = 0 および k = N/2 では |Xk|/(N·G) となります。ビンの上にある振幅1の音は1と表示されます
G
窓関数のコヒーレントゲイン、すなわちwnの平均。窓なしの場合は1、ハン窓の場合は ½
前提
各音はピークからコサイン波として始まります。遠くの裾野の数値は開始時の位相によって変動します。10.5周期の音のビン31は、最も高い棒に対してコサイン波では26.3 dB下、サイン波では31.2 dB下になりますが、最も近い二つのビンにある81%はほとんど動きません。ハン窓は周期的な形式 ½ − ½cos(2πn/N) であり、その変換は正確に三つのビンになります。

ビンから半分ずれると、純音はすべてのビンにこぼれ落ちる 🖖

ビンの上を押してください。正確に10周期を完了する音の64サンプルです。すべてのエネルギーはビン10に収まり、他の棒はすべてゼロになります。次にちょうど中間を押します。10.5周期を完了する点以外は同じ音であり、スペクトルはデシベルで表示されています。ビン10と11がエネルギーの81.10%を保持し、残りはあらゆる場所に散らばっています。20以上離れたビン31でさえ最高値からわずか26.3 dB下(高さにして約20分の1)であり、どこにもゼロの棒はありません。上のパネルのつなぎ目に注目してください。この変換は、64個のサンプルを永遠に繰り返されるループの一回りとして扱います。10.5周期はうまくつながらないため、ループはつなぎ目のたびに飛び跳ねます。このような飛び跳ねは少数の周波数だけでは作れず、すべての周波数を必要とします。それぞれのプリセットでループを再生を押すと、それが聞こえるはずです。ビンの上ではきれいな笛の音ですが、中間では125 Hz(つなぎ目が巡ってくる周期)の耳障りな音が鳴ります。

音を半ビンずらすと、最も高い棒は3分の1低く表示される 🖖

矢印が曲がるを押してください。各棒はサンプルごとの64本の矢印の合計です。矢印nはwnxnを時計回りに k·n/64 回転させたものであり、負のサンプルは逆を向きます。棒の高さは、このつながりが始点からどれだけ離れた場所で終わるかを示しています。コサイン波は、逆方向に回転する二つの半分の波からなります。音が正確にk周期を完了するとき、各矢印の半分は同じ方向を向くように回転して戻され、長さ32の一直線に並び、棒は100%を示します。ビンから半分ずれると、その直線は64サンプルにわたって半円を描くように曲がります。半円の両端は、その弧の長さの 2/π(63.7%)しか離れていません。これが、フレドリック・ハリスの1978年の窓関数の表にある 3.92 dBの「スキャロッピング損失」です。各矢印のもう半分は21.5回転してほぼ打ち消し合い、測定値を画面に表示されている64.61%へと押し上げます。音の大きさは変わっていませんが、最も高い棒は単にその周波数が落ちた位置のせいで、3分の1(−3.79 dB)低く表示されます。ビン一つ分ずらすと、列は曲がって完全な円になり閉じられ、速い方の半分も一緒に閉じられます。これが、ビンの上にある音が他のすべての棒を正確にゼロにする理由です。

両端をフェードアウトさせると、316倍小さな音が姿を現す 🖖

静かな隣の音を押してください。振幅が316倍小さく(50 dB下)、正確に20周期を完了する二つ目の音です。ビン20は最も高い棒から22.7 dB下を示しますが、これは最初の音の漏れであり、ビン20は隣のビン19よりも高く突き出ているわけでもありません。窓関数をハン窓に切り替えてください。これはサンプルをゼロからフェードイン・フェードアウトさせ、ループの飛び跳ねをなくします。漏れは崩壊し、ビン31はピークから26.3 dB下だったのが98.9 dB下になります。そしてビン20が独立したピークとして立ち上がり、音1の振幅の0.32%を示します。これが50 dB下という意味です。窓関数はその代償として幅を広げます。ビンの上の音は三つのビンを覆うようになり、正確にビン10にある音は自分自身のビンにエネルギーの66.67%しか保持しなくなります。ビンの上を押すと、結果の下の表で矩形窓の100%と並んでそれが表示されます。二つの音、ハン窓を押してください。二つのビンだけ離れた二つの等しい音で、その間にあるビン11はどちらの音と同じくらい高い100.00%を示します。窓関数がなければ、そのビンは空です。ハン窓は、三つのビンにまたがるピークと引き換えにきれいな裾野を得ます。これは、探しているものが微弱な場合には正しい取引ですが、近くにある場合には間違った取引となります。

全プロセスの詳細解説

  1. 測定値を補正し、その必要性をなくす 4 ステップ

    あるアナライザーは1秒間に8,000回サンプリングし、窓関数なしで一度に64個のサンプルを変換します。1,312.5 Hzのテスト音を入力すると、最も高い棒は0.32を示しました。この音の真の振幅はいくつですか?また、1ブロックあたりのサンプル数をいくつにすれば、この音は正確にビンの上に乗りますか? 矢印が曲がるを押してください。ページ上でその周波数の音が再生されます。

    この問題をツールで開く

    1. ビンの間隔は 8,000/64 なので、音は1ブロックあたり10.5周期を完了します。つまりビン10と11のちょうど中間です。

    2. 中間では、ページで最も高い棒は音の64.61%を示します。これで割ります:

    3. 1ブロックが整数の周期を保持するとき、音はビンの上に乗ります。128サンプルの場合、ビンの間隔は 62.5 Hz になります:

    4. アナライザーが64サンプルにハン窓を使用していた場合、最も高い棒は音の84.89%を示していたはずなので、同じ音は次のように表示されます:

    解答

    約0.495、そして1ブロックあたり128サンプルです。 1,312.5 Hzが整数の周期(21)を完了するには128サンプルが必要なので、128の倍数でも機能します。ページは64に固定されているため、128サンプルの場合は表示できる範囲を超えています。128であれば棒は完全な0.495を示し、振幅を読み取るために窓関数はもはや必要なく、強い音の裾野が微弱な音に影響を与えないようにするためだけに使われます。

学習の道すじ

フーリエ変換の実際

参考文献 (2)