デジタルオーディオあれこれ

半田ごての人。紙と鉛筆だけではちょっと。

フーリエ級数vsFFT(離散フーリエ変換)。畳み込みに丸め込まれないためには。

 一昔前の、つまりは昭和の頃のオーディオ関連の測定器と言えば、俗に言うOLDだった。Oはオシレーター、Lはレベルメーター、Dは歪測定器(ディストーションメーター)。テスターは勿論針式で入力抵抗も低くて、プレート電圧を測るような時には補正が必要だったりもした。遠い昔。オシロスコープもブラウン管だったしなかなかの高級品で、高校生ぐらいでは持っていなかった。

 

 更にその上にスペクトルアナライザーなるものがあって、これは信号の周波数スペクトルが分かるというシロモノで、はてさてどういう仕組みなんだろうかと、想像もつかなかった。値段も想像の範囲すら超えていた。それが何時の頃からか、テスターはデジタル式になって10MΩぐらいの入力抵抗になるし、オシロスコープも安くなって、終にはFFTアナライザーと言う形で周波数スペクトルも分かるようになった。デジタル化の勝利。

 


 発振器もPCがあれば簡単に作れるし、デジタルオーディオになってしまうともうアナログの発信器は必要ない。デジタルだけで可。今はもう、PCさえあれば昔のOLDからスペクトルアナライザーまでが、ほとんどタダで手に入るようになった。歪率測定にも、FFTを使うのが普通。ジッタ測定なんかにも使っているが、さてそれはかなり怪しい。おそらくほとんどの場合、測っているつもりでも窓関数の誤差に見たい所は埋もれている。FFTというのは見た目以上に複雑で奥が深いので。

 

 FFTは歴史的に考えて、フーリエ級数から始まった周波数解析の最終形でないかと思う。フーリエ級数は、周期性のあるものであれば方形波のような角張った波形でも、サインとコサインの無限級数に展開できるという理屈で、初めて聞いた時にはほんとかいなと思うけど、実際に次数を増やしていくと限りなく方形波に収束していくので、直感的に理解し易い。収束の様を目で見て確かめられるサイトもある。こことか。

フーリエ級数:正弦波による周期信号の合成

 

 でも現実の音声信号は周期的ではないので、このままでは周波数解析には使えない。そこで出てきたのがおそらくはフーリエ変換。これは周期のない単発の信号でも周波数解析が出来る、という話になっている。やっている事は単純。フーリエ級数では有限であった周期を無限にしてしまった。-T/2からT/2(Tが一周期)までだった範囲を、-∞から+∞にしてしまった。言うは易し、行うは難し。

 


 そうすると、無限大が一周期と言う話なので、数学的には辻褄が合うらしい。あるいは、合わせられると言うべきなのかも。具体的には、CD一枚の周波数解析をしたいのであれば、CDが60分であればその3600秒を一周期とすれば良し。3600秒は無限大ではないけれど、実質的には問題なし。

 


 そんなに長い計算は非現実的ではあるけれど、3600秒を一周期としてフーリエ級数に展開すると、1/3600Hzの分解能でスペクトルが出て来るので、フーリエ変換しましたと言っても嘘ではない。フーリエ変換フーリエ級数とは違って連続なスペクトルになるけれど、それは周期のTが無限大なので分解能は無限に小さくなる。フーリエ級数での1/3600Hz(0.00028Hz)の分解能であっても、連続的と言っても嘘でなし。実質的なフーリエ変換

 


 実際のフーリエ変換では、3600秒は長すぎるので一部分だけを取り出して、例えば一秒とかで代用してると思うけど。当然の話として、計算していない所にある周波数成分は分からない。1812年のような、終りの方で大砲がドンと鳴るような曲だと、前の方だけをフーリエ変換しても勿論大砲の解析は出来ない。それは当たり前なので直感的な理解は可能。難しいのは、一部分だけを取り出すために使う窓関数というヤツ

 


 3600秒は長すぎるので、初めの一秒だけを解析したい時は、ゼロ秒から一秒までが1で、残りはゼロと言う関数を元の信号に掛け算する。例えば矩形窓という窓関数。そうすると、ゼロ秒から一秒まで以外はゼロになってしまうので、そこはもう計算する必要が無くなる。勿論、そこにどんな周波数成分があったかは分からない。知りたければ、知りたい所だけにこの矩形窓を掛け算すれば良し、という話になっているのがフーリエ変換

 


 一応の辻褄は合っていそう。アナログの昭和の頃のスペクトルアナライザーは、その理屈でやっていたと思う。でもストレージばポラロイドにでも撮らないと出来ないから、周期信号でないと中々難しかったのでなかろうか。そして取り出してくる窓関数

というのが曲者で、矩形窓、ハン、ハニング、ブラックマンとか色々あって、被測定信号のスペクトルに合わせて適切なのを選びましょうね、と説明書には書いてある。だがしかし、被測定信号のスペクトルを知るためにスペクトルアナライザーを使うのであって、これは本質的に矛盾しているよね、まったく。

 

 少し考えると、被測定信号に窓関数を掛け算しているので、出てきたスペクトルは被測定信号だけではなくて、掛け算をした窓関数の影響を少しは受ける。なので、その影響が最小になるのを選んでね、だから窓関数はたくさん用意しています、というのがメーカーの本音。そのために色々な窓関数のスペクトルと言うのは公表されている。例えばこことか。ここではLが取り出す区間になっている。

窓関数の周波数特性 - Allisone

 

 でもまぁこれを見て、ああそうかとは普通ならない。10Hzの連続的な正弦波を1秒間だけ取り出すとしたら、Lが周期のTなのでこんな特性になるはず。一秒間だけ切りだす矩形の窓関数のスペクトルは青。それを10Hzの連続的な正弦波に掛け算すると、一秒間だけつまりは10サイクル分の正弦波が切り出されることになって、そのスペクトルは赤。マイナス側の-10Hzは一種の虚像なので、現実世界では無視する事になっている。

 

 これはでも、突っ込みどころがテンコモリ。最初の問題は、どうして10Hzの正弦波なのに10Hz以外の成分が沢山あるのか。マイナス側の無視は受け入れるとしても。これは単純に窓関数の問題。切り出した期間がたったの一秒なのでこうなってしまった。この場合はTが1秒なので、レベルがゼロになる間隔は1/1=1Hzになる。なので10Hz以外の整数ではゼロ。その間に何かしらがある状態。8.5Hzと11.5Hzあたりは最大で0.2ちょい。

 

 もしもTを1000秒にすると、レベルは変わらないけれどもこれらは10±0.0015Hzとなるので、10Hzだけとしても誤差は小さい。つまり、切り出す時間を長くすれば、誤差は減る。正弦波と言う時、暗黙の了解として無限に続いているよという仮定が含まれているので、それを考慮するならばこれはこれで正しいと言える。現実として1000秒でも長すぎるので、矩形の窓関数では中々正確なスペクトルは測れない。ハンであれば、10秒ぐらいでもそこそこだと思う。でも計算が面倒なので省略。

 

 それからレベルが1になっている所をメインローブ、その両脇の部分をサイドローブと言って、メインローブが急峻でありサイドローブがとても小さい窓関数が最も誤差が少ない、となっている。つまりはインパルスみたいなのが良い。でもそんなものはない。フーリエ変換に拘る限り、不透明さと隔靴掻痒の糞詰まり感は解消しない。窓関数とそのスペクトルとの関係が、直感として全く理解できない。幸いな事に、今はデジタルのFFTが主流なので、アナログのフーリエ変換は忘れるのが賢いと思う。

 

 デジタルの世界にも、フーリエ級数フーリエ変換に相当するだろう物はある。この表で、フーリエ級数のデジタル版が離散フーリエ変換で所謂FFTフーリエ変換のデジタル版が離散時間フーリエ変換。これは解釈の問題なので、違うと言う人もいると思う。但しそういう分け方をするならば、数学的な厳密性はないとしても現実世界で戸惑う事は無くて、窓関数の意味合いが地に足のついたものになって、FFTの使い方を間違える事もなく使いこなせるようになる。だから実用的にはそうした方が良いという話。

 デジタルと言っているのは、データが離散的な数字になっているという事。大雑把には、アナログのレコードなのかデジタルのCDなのか。フーリエ変換はあんまり直感的ではないので、そのデジタル版の離散時間フーリエ変換も考えずに忘れる。離散フーリエ変換は、計算の簡単さで実質的にFFT(Fast Fourie Transfer)しかない。これは離散を意味するDiscreteを前につけると思っていたけど、離散にきまっているからつけないみたい。この辺りの用語は、時々少し違った表現があるので、ただでさえややこしいのが上塗りになる。ひとまずFFTと言っていれば間違いはなさそう。

 

 FFTで大事なのは、フーリエ級数なので周期。無限大と言う概念はないので、フーリエ変換の様に信号の一部分を切り出すという操作はない。窓関数は必須だけど、一部分を切り出すためではない、と言い切る。FFTでの窓関数は、周期性の確保のためにのみ存在する。何故ならば、デジタルの世界での周期性は、アナログとは違って些か厳密性が高いので。

 

 それ故に、測定信号が既に周期性を持っているならば、窓関数は必須ではない。使っても良いけれど、誤差に漬かってしまうだけなので、避けられるのであれば漬物にしない方が正確になる。使わないというのは、矩形の窓関数を使うという意味になる。矩形の窓関数は、全てが1。全てのデータに1を掛けるので、結果は同じで変化なし。フーリエ変換では切り出す部分のみが1で残りはゼロなので、勿論結果は違って来る。FFTでは変わらない。測定信号に周期性があるならば、先に出てきたメインローブだけが1でサイドローブがゼロという理想形になる。

 

 多くの場合、FFTは離散時間フーリエ変換から説明されるので、矩形が他の窓関数とは別物であることは書いてないと思うし、測定信号に周期性を持たせろなんて話にもならない。これは実際の測定上の工夫と言うような次元の話だから。でも大事なのはこっちの方であって、数学的な厳密性ではない。

 

 FFTでの周期性がフーリエ級数よりも厳密になるのは、デジタル化されているので。下の図は4096Hzのサンプリング周波数で32Hzをデジタル化して、4096長のFFTで解析する場合。この時のbinは、4096Hz/4096=1Hz。binとはFFTの解像度であって、データを取り込んでいる時間の逆数。4096Hzのサンプリング周波数は時間として1/4096。4096長のFFTは4096のサンプリング点があるので、全体の時間としては(1/4096)*4096=1秒。FFT側からは、この1秒で周期性を持つと仮定されている。

 


 1秒とは1Hzなので、フーリエ級数と同じく1Hzの整数倍の2Hz、3Hz・・・2047Hzまでが構成要素。デジタルなので、フーリエ級数のように無限に続く事は無い。ナイキスト間隔の制限で2048Hzは超えない。FFTを通すと、出て来るのは2047Hzまで。この場合は取り込んでいる時間が1秒なので、binはその逆数の1Hz。もしも測定信号がbinの整数倍であると、初めから周期性は確保されているので窓関数は不要。32Hzであれば1秒の中に32サイクルぴったり収まるし、34Hzであれば34サイクル。

 

 なのでこの場合は、矩形窓(rectangular)で構わない。その時は青の元のままの信号に対してFFTがかかる。不要だけれどもハンを使うと、緑の様になる。青と緑は見た目ではかなり違うけど、スペクトル的にはそんなに変わらない。何故かと言えば、この時のハンは1Hzのコサインに直流オフセットを付けて、始まりと終わりがゼロになるようにしているだけ。なので掛け算すると始まりと終わりは必ずゼロとなり、無理矢理だけども周期性は確保される。32Hzは1秒の時間では周期的なので必要はないけれど。そして1Hzを32Hzに掛け算したので、結果としては32±1Hzと直流分からの32Hzとが出て来るだろうと直感的に分かる。結果はこれ。

 矩形窓で何も変えていない青は、そのまま32Hzのみ。ハンにした緑は、予想の通り31Hz、32Hz、33Hzの3つが出る。 教科書的には、ハンのスペクトルを32Hzの所に移して、尚且つ直流分があるのでそれは32Hzの所に持ってきて、更には離散時間フーリエ変換の連続スペクトルをbinの1Hzの整数倍の所でサンプリングすると、上の図のようになるはず。それは中々に手間でしんどい。ハンでの誤差がどのぐらいかの推測は難しい。

 

 32Hzのような、4096Hzサンプリングで4096長のFFTで周期的になる信号ならば、基本的に窓関数は不要。もしも 2048長にするとbinは2Hzになるので、32Hzは良いけれど33Hzはダメとなって窓関数は必須。基本的にFFTは長いと有利だけど、64kを超えると別の問題が出て来るので、過ぎたるはなお及ばざるが如し。同じ理屈で、ハニングも掛けているのはコサインのみなので、元の周波数の両脇に1Hzだけ離れたのが誤差として出る。本来は存在しない。ブラックマンは、binの2倍のコサインもあるので、32±1Hzと32±2Hzがゴーストとして出る。それを窓関数のスペクトルから推測するのは難しい。時間軸での掛け算からならば、直感的にすぐ分かる。

 

 一般的には、測定信号は周期的ではない。binが2Hzの時の33Hzのように。例えば、4096/120=34.133Hzだとこうなる。整数倍ではない周波数なので、終りはゼロではなくなって、周期的にはならない。それでもハンを掛けてやると、始まりと終わりはゼロになるので、緑のような周期的な波形になる。無理矢理合わせているけれど、多分何もしない青よりも誤差は少ない筈。  

 こんな具合。何もしない青では全体としてかなりの誤差がある。ハンの緑では、34±1Hzでは青よりも悪いけれど、全体としての誤差はずっと少ない実際は64kぐらいの長さのFFTを使うので、その場合のbinは1/16Hz。なので34±1Hzあたりでは、誤差は-100dBぐらいとなる(目盛の18と54の辺りに相当)。窓関数なしの青では、FFT長さを上げてもあんまり効果はない。

 

 

 現実的には、窓関数のスペクトルとの畳み込みを考える必要はなくて、FFTのアプリを使えばスペクトルは分かる。けれども、窓関数を使う限りは誤差と言うのか、本来は存在しないスペクトルが周期性の確保のために出てきてしまう。それが窓関数によってどんな出方なのかは、理論としては畳み込みだけど直感としては無理。窓関数でどんな具合に元の信号が変化するのかは、FFTフーリエ級数のデジタル版と捉えれば想像に難くない。

 

 実用面で正確なスペクトルを知りたいのであれば窓関数を省く必要があって、現実の測定であればADCからテスト信号を出して、DAC側のクロックはADC側のクロックに同期させる。IISであれば、信号は来ているのでDAC側のPLLの問題。最近の市販品は大抵IISがあるので、そういう仕様のADCを自作すれば解決。

 

 そうすれば、クロックジッタの影響などもFFTからある程度は判断できる。窓関数経由では無理。元信号の両隣りに本来は存在しないスペクトルが出て来るので、微小なジッタなどは到底測れない。時間軸で実際に窓関数を掛け算してみれば、自明な話。窓関数の畳み込みと言う抽象的な理屈からは想像できないので、DAC側をロックさせている例はほとんどないと思う。結局、見ているのは窓関数の誤差だけでしょう。