Posts tagged ‘disproving the misunderstood article of the Sampling theorem’

(オーディオ関係が続いて飽き飽きだけど、これは計測・測定関連の話なのでヨシッ!

ってこともないw)

 

数日前の夜、オーディオ関係で「サンプリング周波数」+αだったかで検索していたら「サンプリング定理の誤解とCD規格の大罪」という すごい題のページ(以下、ページのサイト名を略して「HKページ」とする)が見つかり、驚くことが書いてあった。ちょっと見ると もっともらしくて「えっ?」と思うのだが、どうにも信じがたいので追試(というのか?)して、それが正しくないことを示す。

おそらく、既に多くの方が同様なことを されていると思うが、興味があったので自分なりに考え・確かめた。そして、HKページにはコメントが書けないので、ここに書く。メールは敷居が高いし、ここに書くほうが自分の再勉強のメモになるので。

それに、そのページには公開日がないが、ページ中のWindowsの画面中のデバイス名やPCの機種などを見る限り2010年頃と想像され、おそらく書いた本人も忘れているだろうからコメントする必要はなさそうだ。

あと、僕の他の同様の稿と同じく、分かっている方には「当たり前のこと」で読むまでもないし、噛み砕いたつもりだけど専門用語や必要な基礎知識は それなりにあるので、一般の方には「チンプンカンプン」で、どっちにしても余り意味がないが、まあ、自分の記録になるし、「謎」の調べ方の参考にはなるかと思う。

ただ、僕も もうサンプリング定理を正しく覚えていないし、(例によって)改めて調べ直すのも億劫なため、理論よりも実践的に検証したので、不完全なことはあるだろう。

HKページの主な主張は以下である。

  • 楽音をサンプリングした場合、波形は完全には復元できない。
    • 復元できるのは周波数成分情報のみ。
  • サンプリング定理は正弦波を復元する保証はしていない。
  • (そのため・その例として) ナイキスト周波数に近い正弦波をサンプリングして出力すると、AM変調が掛かったような音になってしまう。
    • 例: サンプリング周波数が4kHzの時に1990Hzの正弦波をサンプリングすると、低周波の包絡線が現れる。
      • それを出力すると、「ピロピロ」という音になってしまう。

全部間違いという訳ではないが、僕からすると、以下がおかしい。

  • 周波数成分情報しか復元できないというが、その「周波数成分情報」とは一体なんだろうか?
    • 例えば、振幅や位相は保存できないということ? じゃあ、デジタルデータには時間ごとの周波数とか角度しか記録されていない??: どこでそんな器用なことを?・・・
    • そもそも、「サンプリングした」デジタルデータというのは ある(一定)間隔で振幅(大きさ)を記録したものだから、少なくとも振幅は復元できるのではないか?
  • サンプリング定理は正弦波のことを述べているので、逆に正弦波しか保証していないんじゃなかったか? 上と同じく、正弦波でなく周波数だけを復元できるものは一体何?
    • 得体の知れない特殊な信号??
    • (余弦波(cos)とかいうオチはないよねw)

そして、HKページの、「サンプリングした波形」※に そのページの図のような低周波の包絡線が現れることと、出力すると「ピロピロ」という音になるのが、どうにも信じられなかった。

※Audacityで生成した正弦波をでSoundEngine Freeでリサンプルしたようだ。(どうして そんなことをしたのかは不明)

そもそも、すごく高い音が「ピロピロ」になるんだったらCDも何も聴けたものじゃないはずで、実際には そうなっていないのだから「論外も いいとこ」と思えるが、根拠・証拠なしに決めつけたり切り捨てたりするのは科学的でない。それこそ良く居る*マニアと同じことだ。

それで、HKページの主張する、正弦波が「ピロピロ」音(包絡線による音?)になる現象が起こるか実験して確かめたが、最初は起こらなかった。

(以下、「アップサンプリング」、「アップサンプル」はオーバーサンプリングと同じ。「リサンプル」はサンプリングレート変換、「リサンプラ」はサンプリングレート変換するもの、サンプリングレートコンバータ・SRCのこと。)

まず、HKページと同様の手順※を実行すると、確かに波形に包絡線ができた(→ データの波形: 一番上, 再生波形*)が、再生しても その包絡線に起因する(「ピロピロ」という)音は出なかった。スペクトラムにも包絡線(約1.4kHz)の山は見られなかった(あとで書くが、これには見落としがあった: 実は1.4kHz辺りと その高調波に小さい山があるが、微小なので取り込み時の雑音と思って無視した)。

※一般的なサンプリング周波数の44.1kHzと そのナイキスト周波数に近い正弦波(20.6kHz)を使った。

*書いたあとで波形を見たら なんか妙だ。: というのは、サンプルされた点はグラフ中の点だけなのに、なぜか正弦波の波形が表示されているのだ。想像だが、表示プログラム(REWのScope)が「うまくやっている」(少し前までの軌跡を残している?)のではないか?

こういうことは ちゃんとプログラムの資料を調べれば分かるだろうが、テキトーに使っている。良くないことだ。

次に、HKページにアップロードされている、音がおかしいというファイルをダウンロードしてAudacityで見ると、確かに包絡線が出た(→ データの波形: 下側)が、再生しても「ピロピロ」という音は出なかった。(→ 再生波形) スペクトラムにも包絡線らしき山は見当たらなかったが、実は包絡線の周波数の計算を誤って見落としていた。: 包絡線の周波数は10Hzで、山はあった。(→ 超低域のスペクトラム: 10Hzに山: これも最初はHKページでの取り込み時の雑音だと思い込んだ。) ただ、その音が出ても「ピロピロ」とは聞こえないはずだ。

更に、サウンドドライバ(サンプリング周波数: 96kHz)でのアップサンプリングの影響を避けるため、HKページの条件に近い45kHzの正弦波でも試したが、包絡線の成分は出なかった。アナログを経由しないと出ないかと思って試したが、それでも出なかった。

それで、念のためにブラウザ(Vivaldi)で音がおかしいファイルのリンクをクリックして再生したら、確かに「ピロピロ」という音が出た※(ただし、僕には「ピピピ」に聞こえる)。 それから、ダウンロードしたファイルを別のプレーヤーアプリ(例: Audacious)で再生したら、最初の一瞬だけ音が出て あとは無音だった。

※ブラウザによって動作が異なり、Chromeでは音がせず、Firefoxは再生せずにダウンロードダイアログが出る。

挙動の違いの原因を推測すると、そのファイルのサンプリングレートが4kHzと(現代のPC環境には)異常に低いためだろう。: ブラウザが内部でリサンプル(例: 4kHz → 44.1kHz)処理をしているとしたら、それがうまく働かないためではないか。

→ 僕の環境で性能の悪そうなリサンプラを探して試したら※、ようやく「ピロピロ」が再現した。残念なことに、再生波形をキャプチャしたデータはなく、スペクトラムだけしかない。

スペクトラムを見ると、音を「ピロピロ」にしているのは、基本波より50dB以上小さい(1/316以下)400Hzの高調波4本に思えるが、どうにも信じられない。高調波の数が多い分、効くのか。他に2kHz以上のエイリアシング成分も効いているのか。

※Audaciousで出力をJACKに、プラグインSample rate converterのリサンプル処理を"Skip/repeat samples"にし、HKページの問題のデータ(サンプリング周波数: 4kHz)を再生した。

一方、ダウンロードしたものをプレーヤーアプリで再生した場合は、サウンドドライバ(僕の環境ではPulseAudio)や再生するアプリのリサンプラが使われるのだが、信号の周波数(1.99kHz)がリサンプラのLPFのカットオフ周波数(2kHzの少し下)より高いために ほとんど全部カットされるのではないか。

ただ、リサンプラがアップサンプル前にLPFを掛けるのか、ちょっと自信がない。 → アップサンプル後にLPFを掛けるのかも知れない。いずれにしても、実際のリサンプル処理は良く分からない。

そして、最初にダウンロードしたファイルを正常に再生できたのは、Audacityに取り込んだ時に「うまく」アップサンプルされてしまったためと想像する。再度試したら、どうも、Audacityのプロジェクトのサンプリングレートが4kHzなら小さい音※で再生できる(ただし、「ピロピロ」でなく普通の音)が、それ以外(例: 44.1kHz)では音が出なかった。

※音が小さくなるのは、Audacityは上記同様にアップサンプル前にLPFを掛けているが、そのカットオフ周波数が高目なために「少し」通ったためだと推測している。

つまり、「ピロピロ」という音は実際にはないのだ。それは再生時のリサンプル処理が良くなくて発生したのではないか。つまり、実験(手順・方法)の誤りだ。よって、最初から問題はなかった。

はい論破。

 

では終われないw

というのは、不思議なことがあるのだ。: 確かに、その主張どおりに波形に包絡線が現れて いかにも変調されているように見えるのに、スペクトラムには包絡線の周波数に山が出ず(上述のように、実際には小さく出ていた)、再生した音も正常だったことだ。それで、どうしてそうなるのかを考えた。

この時点で、僕はHKページの作者と同様な誤解をしていた。それは、最初に書いたように、サンプリング定理を正しく覚えていないためだった・・・

この問題は、確か 学生の頃にも、取り込んだ波形を見て不思議に思い いろいろ調べたり実験して納得した気がするが、すっかり忘れてしまった・・・

それで、試しに包絡線のあるデータ(20kHzの正弦波(サンプリング周波数: 44.1kHz) → グラフ: 上)を一旦アナログにし※、高いサンプリングレート(約4倍, 96kHz)で取り込んだら包絡線が少なくなって「まあまあ まとも」な波形になった(→ グラフ: 下)ので、サンプリング定理では「そういうもの」で、デジタルデータがおかしく見えても、アナログに変換すれば ちゃんとした波形になると理解した。(が、あとで気付いたが、実際には、スペクトラムには小さいものの、おそらく包絡線の成分が4kHzに出ている。詳しくは後述する。)

※試しては いないが、アナログにしなくても、高い周波数にアップサンプルすれば同じ結果になりそうだ。

そして、その後の検討と試行により、包絡線の問題は(おそらく)解決した。 (以下、理論派の方には耐えられないだろうが、フーリエ変換とDFTを同様のものとして扱っている。)

  • デジタルデータに包絡線が現れるのは問題ない。: そういうものなのだ。(単なる「見た目」の問題?? が、上を見るとそうでもなく、「仕方ないことで、実用上は問題ない」という辺りか。)
  • アナログ信号として出力する時にsinc関数(現実にはLPF)を適用すれば、本来の周波数の「ちゃんとした正弦波」になる。
    • sinc関数(LPF)は複雑なので、いくつかのサンプルの移動平均と考えても大きな間違いではない(LPFの多くは係数付きの移動平均だ)。
    • (今は簡単に実験できないが、)そのまま出したら きっと駄目だろう(それが「ピロピロ」?)。
  • 包絡線を持つ信号(デジタルデータ)のスペクトラム(振幅)を見ても、包絡線の周波数に成分がないのは錯覚で、出ている。が、どうしてか予想外に小さい。 (← sinc関数(現実にはLPF)を適用しているため?)
    • だから、包絡線の音は聞こえないのだろう。
  • 更に調べたところでは、AM変調(この場合は過変調に相当すると考えた)やDSBのように、スペクトラムでは基本波の両脇に包絡線の帯域幅の広がりが出るはずだが、実データを見ると ほとんど出ないのが謎。
    • AMなどのアナログ信号処理とデジタル信号処理の違い? そんなことない?
    • 最初は、以下のように誤った理解をしたが、そうではない。: フーリエ変換して振幅を求める時に絶対値または自乗されるので、同じ周波数成分の正負の信号は打ち消し合わない。
      • すごく大雑把に言うと、重畳されている包絡線の信号は正負で同じ振幅なので、フーリエ変換して振幅を求めると打ち消し合って なくなる。
        • 現実には、ナイキスト周波数付近では正負の成分は1サンプルずれているが、振幅は概ね同じなので、概ね打ち消し合う。
      • 普通のスペクトラムでなく、実部と虚部を出せば包絡線の周波数に山ができるのだと想像する。
    • ※変調関係で参考にした資料: 資料1, 資料2, 資料3, 資料4, 資料5, 資料6
      • 余談だが、学生時代にサボっていたせいか、こんなに難しいことを学んだ記憶がない・・・

 

それから、HKページの主張にも正しいことがある。: サンプリング定理(実際にはフーリエ変換だったか)は正弦波のことしか言っていないので、元のアナログ信号と全く同じ波形は再現できないことだ。それは、アナログで元の信号の高周波成分ををLPFでカットするのと同様なことで、デジタルではサンプリング周波数で決まる上限の周波数(ナイキスト周波数)までしか表せないから、仕方ない。

また、更に うろ覚えだが、信号のタイミング(位相)も完全には再現できないのではないか。というのは、ナイキスト周波数に近い領域では たった2つ+αのサンプル(点)で信号の1周期を表すことになり、1周期未満の微妙な時間のズレは表現できないからだ。 ← これは正しくない。位相も保存できる。というのは、フーリエ変換すると実部と虚部ができ、そこから振幅と位相が求められるが、ナイキスト周波数近くの位相は正しくないという話は聞いたことがないからだ。

直感的な理解は、ナイキスト周波数近くの正弦波で、頂点がサンプリング時刻から少しずれている場合には、隣り合った2つのサンプル(点)で表され(→ 参考: 波形※)、それでズレ・位相が表現できることだ。もし、頂点がサンプリング時刻ぴったりなら、1サンプルで表され、位相は0か180°だ。

※画面を見ていると、この点が波形上で動くのが おもしろかった。そして、それがHKページの問題が再現しないことに関係しているのかと思った。

だから、HKページの主張の「波形は完全には復元できない」は正しく、正弦波の集まりでしか復元できない。

例えば、ナイキスト周波数近くの矩形波や三角波の形は崩れる(未確認)。

あと、これと関連した良く見る誤解は、通常とハイレゾオーディオのグラフの波形を比較して、サンプリング周波数や分解能(ビット数)が低い・粗い(少ない)とギザギザになってしまうという主張・宣伝だ。上と同様に、デジタルで見るからギザギザな訳で、アナログにする時にsinc関数(LPF)を掛ければ滑らかになる(滑らかさは そのフィルタがどのくらい良いかに掛かっている)。ただ、値のないところは繋げているだけなので、周波数も分解能も高い・細かいほうが元の信号を忠実に再現できる(可能性が高い)ことは確かだ。

だからと言って、細ければ音がいいとは限らない! 細かい区切りが変動したり、それらに いい加減な値を入れたら いい音どころはないし、前の稿に書いたように、勝手に作った隙間や細かくして折角できた広い空間にゴミを詰め込む会社がある。

そして、「ギザギザだから変な音・悪い音」とは限らない。実際、上に出した、包絡線が出ている、いかにも変な音がしそうな外見のデータの音は全く変じゃない。

例: 変な見た目(上) → 実際の波形

 

理解し切れていない・調べ切れていない点があって若干消化不良だが、とりあえずは(当然のことながら)サンプリング定理に大きな問題は ないことが分かり、HKページの主張の大半は正しくないことが分かった。

茶化すのは良くないが、HKページの中身は題の「サンプリング定理の誤解」だったから、その点は間違っていなかった。

 

そして、僕の喉に引っ掛かった小骨的なものをクリアできた。

 

PS. HKのページの下のほうを見ると いろいろな計測器が出て来るが、そういう ちゃんとしたものを使われていた方が、デジタル信号処理の基本を理解されていないのは随分妙だ。ただ、他にもそういう方を結構見るので、アナログの経験が長い方はそうなのだろうか? もしかして、アナログとデジタルは似たようなものと考えている? そう決め付けることはしないが、そんな傾向があるのかも知れないと思った。

(12/23 10:56) 勝手なイメージだが(「そんなことないわボケ!」と言われても仕方ない)、アナログの方は時間軸・波形で考えることが多そうだし、オシロのような時間軸の測定器(しかもコンピュータベースでない)を好んで使っていそうだ。

他には、長い経験に自分の勝手な思い込みが根拠なく裏打ちされてしまって、考えが誤っている可能性に思い至らないことがあるのかも知れない。

HKページで その例を一つ挙げれば、直線補間が最良のように思われていることだ。各自の好みは良いけど、そういうところから本文に書いた間違いが始まっているようだ。実際、HKページの一番上のグラフの赤線は直線補間だろう。

やっぱり、技術者だったら、常に疑う・確認する、証拠に基づく態度を忘れてはいけないな。

 


以下は、HKページのリサンプラが不充分なことに気付く前に書いたものだが、メモとして残す。

[下書き1: 注: ページの筆者は一旦アナログにして取り込んだ訳でなく、単にリサンプルしただけのようだ。]

どうしてなのかを推測したら、HKページの実験方法が誤っているからのように思えた。というのは、いくつか妙なことがあるのだ。

  • サンプリング周波数44.1kHzで作った正弦波(1.99kHz)をサンプリング周波数4kHzで取り込んでいる。
    • 再生は44.1kHzなのか、4kHzなのか? → 44.1kHzと考える。
    • 僕なら、サンプリング周波数44.1kHzで21kHzくらいの正弦波を作って再生し、同じサンプリング周波数で取り込む(実際、そうして実験して再現できなかった)。
  • それを4kHzで取り込むとして、そんな低いサンプリング周波数が可能なデバイスはあるのか?
    • HKページの画像中の"YAMAHA AC-XG"から、デバイスはYMF753(AC'97)らしきことが分かり、ドライバ(AC-XG WDM)のデータシートには可能なサンプリング周波数は8k-48kHzとあるので、4kHzでのサンプリングは無理そうだ。

だから、実際には どういうサンプリング周波数で取り込まれたかは分からないが、正しくない周波数で取り込んだために音がおかしくなったのではないか。また、その変な周波数がリサンプルされて更に音がおかしくなったことも推測される。

HKページの著者は音がおかしいファイルを再生すると、「ピロピロ」という音が出ると書いているので、再生系がおかしいのだろうか。サポートされないサンプリング周波数4kHzのファイルを無理に再生しているために音がおかしいのか。

ちなみに、僕の環境では、必ず再生系が対応するサンプリング周波数にリサンプルされるために問題ないのだろう。

[下書き2: 注: この文章には大きな問題はないが、「ピロピロ」音が ないことが分かる前に書いたものなので、使わずに残った。]

いろいろ試した結果、HKページの測定方法が誤っていたために誤解し、それに基づいて書いたのが大きいだろうという結論になった。

が、あとで分かるが、それ以上に、デジタルデータを出力する時にsinc関数(現実にはLPF)を適用することを考慮していないのが大きかった。

 

(12/23 5:12 わずかに加筆・修正)

  •  1
  •  1
Keys: