デジタルフィルタはサンプリング定理をいかほどに具現しているか

16/05/04初稿

 PCMオーディオはサンプリング定理に基づいて音楽データを製作・再生しています。
 定理上は“ある種の可逆圧縮”とも言える仕組みで、「PCMデータを製作(離散化して圧縮)」→「リコンストラクションフィルタで復元して再生」するワケですが、フィルタによる“リアルサンプル”への復元精度はどれほどなのでしょうか。

 よく「ハイレゾのメリットは20kHz以上の成分があることではなく20kHz以下の波形再現性を上げるもの」という説明がありますが、そもそも定理上は「ナイキストの2倍より高い周期でサンプリングすれば“完全に再現可能”=リコンストラクションで復元可能」なのですから、20kHz以下にリアルサンプルを増やす意味はないハズです。
 ですから、説明は“現実的には定理との乖離は大きく、「リコンストラクションでの復元サンプル」と「リアルサンプル」との誤差は音質上無視できないほど大きい=だからハイサンプリングに意味がある”と言ってることになります。

 本当かどうか確かめてみたくなりました。


 Over Sampling Digital FilterはOSDFと略します。


■準備

 ところで、“原音”はそもそもAD段階でLPFかかっていますし、CDなどでは製作最終段階でダウンサンプリング(ビット深度縮小)されているのが一般的でしょう。
 ですので、「製作段階でCDフォーマットにダウンしたデータから、ダウン前のデータを再生側処理でどこまで復元できるか」を見ることになります。

 製作時にどのような作業されているのかは一定ではないでしょうし特定もできませんので、「2496で作成され1644(CD)にダウンサンプリングされている」と仮定します。

 再生装置では、そのデータを24bitや32bitの精度でリコンストラクション(一般的にはDACチップ内蔵の8倍OSDF(*))するワケです。

*:正確にはOSDFはプリフィルタで、アナログのポストフィルタも含めて“リコンストラクションフィルタ”です。

 DACチップがOSDFしたデジタルデータを得る術はありませんし、DACチップに入れる前にPCでやることもできますから、今回はPCによる2倍アップサンプリングでシミュレーションとし、2496に戻したデータがダウン前の2496データにどこまで近づけるかを調べてみます。

 CDは44.1kHzですが、製作時は48kHz系でしょうから、今回は非整数倍サンプルレート変換の影響を排するためダウンした状態も48kHzで代用します。つまり、意識すべきナイキスト周波数は24kHzとなります。
 対象波形は「440Hz/-6dBのサイン波」としました。この単独波形の2496データが復元すべきデータとなりますが、LPF処理の影響を見るため、次の24kHz以上の成分を付加します。いつもの通り≪WaveGene 1.50≫にて生成。
 付加したのは「30kHz/-12dB,35kHz/-24dB,40kHz/-48dBのサイン波」です。これらは48kHz化した時にカットされるべき成分ということです。

 4つの周波数成分を含むデータはこんな波形になりました。
 “再現すべきターゲット波形”である440Hzをグレーにして重ねてあります。

440Hz 24964成分

 最大レベルは-1.76dBでしたのでフィルタ処理でサチることはないでしょう。

 スペクトルは次の通りです。

440Hz 2496 4成分:周波数

 この「24kHz以下1成分+24kHz以上3成分」のデータから、CD化を通して「24kHz以下1成分」だけをどれだけ忠実に復元できるか、を見ることになります。

 製作側ダウンサンプリングと再生側リコンストラクション=アップサンプリングは、≪foobar2000 1.3.8≫のResampler-V(SoX) 2.1をデフォルト設定で使います。

  ・PassBand:91.3%
  ・StopBand:100.0%
  ・Attenuation:-198dB
  ・Phase Response:Linear

 ファイルはConvert機能で得ています。


■16bitソースの再現性

 さて、CDメディア(からリッピングしたデータ)は、メディア製作段階で周波数のダウンと同時に16bitにビット深度縮小されたものです。
 一方、再生側でのリコンストラクション処理精度は、PCでアップサンプリングする場合は

 「32bitFloatで処理」→「24bitまたは32bitFixedでDACチップへI/F」→「24bitまたは32bitFixed(以上)でDAC内部処理」

が一般的でしょう。
 ですので、シミュレーションとしては、2496→1648されたデータを“ビット深度拡張して処理”した場合を見るのが現実的と言えます。
 そこで、仮にリコンストラクションの精度は24bitとしてシミュレーションしてみます。

 ビット深度変更はConvert機能のビット深度設定で行いました。24→16bit時には“17bitめ”は四捨五入されるようです。
 なお、実際の24bit→16bit化ではディザ(ビットマッピング)処理などされていると思いますが、本稿の主旨とは無関係だと思いますので無視します。

・製作時ダウンサンプリング&ビット深度縮小:2496→1648
 まずはソース製作側のシミュレーションです。
 この時点での周波数成分は以下の通りです。1648ネイティブで生成した440Hz/-6dBでもニアリーになりますので、24kHz以上の成分をカットしたことによる明らかな影響(440Hz以外の周波数が出現するなど)は見られません。
 プロ用ツールがこれより劣ることはないでしょう。

440Hz 2496→1648

 波形は、スペクトルを見ても判る通り普通に440Hz/-6dBのサイン波になりましたので省略。
 再生側ではこの“24kHz以上をカットしたデータ”をリコンストラクションすることになります。

・再生時リコンストラクション:1648→2496
 まず周波数成分を見てみます。波形は普通に440Hz/-6dBのサイン波になりましたので省略。

440Hz 1648→2496

 元ナイキスト(24kHz)以下の状況はほぼ変わっていないと思います(周波数レンジはソースの2倍)。
 元ナイキスト以上のイメージングノイズ領域はキレイに消えてると言っていいでしょう。

 ということでいよいよ本題です。この「ダウンサンプリング&ビット深度縮小→リコンストラクションによって復元」された2496データの精度はどれくらいでしょうか。≪WaveGene 1.50≫で24kHz以上の3成分をOFFして生成した“ネイティブ440Hz/-6dB”ファイル(2496)と比較してみます。
 ふたつを反転ミックスして「復元誤差(製作時のダウン処理誤差も含む)」のファイルを作って見てみます。使い慣れた≪SoundEngine Free 5.02≫で処理。

 その波形は以下の通り。≪Wavosaur x64 1.1.0.0≫で最大拡大です。

440Hz 2496→1648→2496

 誤差成分の最大値は-93.04dBでした(冒頭末尾はLinearフィルタ参照サンプルが無くなることによる異常値になるのでカットしての値)。
 16bitの量子化精度は0は-∞、±1は-90dBですから、それ以上の精度で復元できていることになります。

 ちなみにこのファイルは聞こえませんでした。SB-DM-PHD経由HD700を≪foobar2000 1.3.8≫の排他WASAPI音量最大で鳴らして。

 なお、再2496化のAttenuationを最低の-96dBに設定すると-93.13dBになりました。逆に良くなってる?


■すべて24bitの場合の再現性

 製作過程でビット深度縮小しないなら、した場合より精度が上がるのは必然です。
 つまりハイビットハイレゾの効果はいかほどか見てみます。

 2496→2448→2496の反転ミックス結果をバイナリエディタで見ると±1(000001hとFFFFFEh)しか発生していませんでした。
 つまり、すべて24bitなら24bitの演算誤差レベルの精度でサンプルを復元していると言うことになります。

 なお、Attenuation性能を最低の-96dBしても誤差は±1です。16bitとは結果異なるようです。

 ちなみに、2496→1648→1696処理すると16bit演算誤差精度になります。


■ナイキスト近くではどうか

・19kHz
 440Hzでは甘いのかも知れません。もっとナイキストに近い19kHz/-6dBではどうでしょう? 上記の440Hzを19kHzに差し替えて同じことをやってみました。
 途中16bitに落とした場合の反転ミックス波形を示します。

2496→1648→2496 19kHz

 誤差は-96dB以下のレベルに収まっています。このファイルは聞こえませんでした。

 ずっと24bit処理だと±1の誤差しか発生しませんでした。もちろん聞こえません。
 つまり、24bitならナイキストに近くても復元誤差は変わらないということですね。

 Attenuationを-96dB設定すると、16bitを挟むと-96.47dBが-96.61dB。ずっと24bitなら-138.47dBが-116.89dBに。ナイキスト近くになると24bitでも精度悪化するようです。16bitを復元する場合はAttenuationは欲張らない方がいいのかも知れませんね。
 CDリッピングファイルの場合は性能を下げ、24bit以上の場合は欲張った方がいいというちょっとメンドクサイ結果に。まあ、良くなるのは何か演算の相性のようなものかも知れませんけれど、「どうせソースが16bit精度なんだから-198dBとかにしても無駄」と言われればそうかも知れません。

・20kHz
 さらに、試しに20kHzでもやってみました。

2496→1648→2496 20kHz

 やはり-96dB以下の誤差しか発生していません。
 が、このファイルはヘッドホンを耳に押し当てるようにすると微かに聞こえてしまいます。ただ、楽曲はマトモに聴けない大音量ですし、そもそも20kHzは倍音領域ですから-6dBなんて成分は普通はないでしょうけれど。
 ずっと24bitなら±1誤差でした。

 「ナイキストに近いとどうなるか」を見ようと思ったのですが、440kHzと19kHzや20kHzで誤差成分の大きさや聞こえ方が異なる理由は、周波数の違いとは言い切れません。「カットすべきナイキスト以上の高域周波数成分」との“相性”の可能性もあるような気がします。例えば20,30,35,40kHzとキレイに揃っている場合、誤差分に可聴域の疑似周波数が出現してしまうのかも知れません。

 いずれにしても、24bitなら誤差は±1でしたから差はありません。つまり、誤差分が可聴域に入ってくる場合があるのは、「サンプリングレートが48kHzだから」ではなく「ビット深度が16bitだから」ということになります。

 結構オモシロイ結果になった気がします。


■デジタルフィルタの性能

 途中を16bitに落とした場合、再生時にビット深度拡張して処理すれば16bit以上の精度でリコンストラクションできるようです。

 24bitのままの場合、再現誤差は24bitの演算精度レベルに収まるようです。

 つまり、「製作時のダウンサンプリング&ビット深度縮小」も「再生時のリコンストラクション」も、量子化誤差精度でできるようです。
 しかもコンスーマレベル(ていうかフリーソフト)でも、です(笑)。実のところ、ここまで復元できるとは思ってませんでした。

 ということで、ハイサンプリングについては、20kHz以下の領域のリコンストラクションによるサンプル再現性はかなり高い(*)ので、「リアルサンプルである効果はあまりないのでは」「少なくとも「ハイレゾフォーマットの効果」として喧伝するレベルではないのでは」と思えます。

*:パッケージ化するときに16bitに落としても16bit以上、ずっと24bitなら24bit精度

 一方、24bit精度はリコンストラクション処理にもそのまま活かされるようですので、ハイビットには意味があると言えそうです(実際に聴いて差があるかは別として)。


 以上は「Resampler-Vでのシミュレーション結果として」です。DACチップ内蔵OSDFの当該精度は判りません。手がかりがあるとしたらデジタルフィルタのAttenuationスペックくらいでしょうか(PCM1795は-98dB、PCM1792Aは-130dB、AK4490は-100dB)。

 ですが、PCでのアップサンプリングも充分現実的ですので、その結果の評価も意味あるでしょう。
 その復元サンプルの精度は「わりとイケてる」と思うことにしました。単純なサイン波での結果ですのであくまでも“ざっくりした感触として”ですけれど。
 具体的には、
「ハイビットは意味ありそう(16bitの誤差は無視しきれないかも)」
「ハイビットであればデジタルフィルタによる20kHz以下の再現性は高いので、ハイサンプリングによるメリットはやっぱり20kHz以上の成分があることしかない(けど、聴きわけられない気がする)」
ってカンジです。

 じわじわ「ハイビットファン」になってる自分がいます(笑)。

 以上、もちろん「個人的には」ということで。


■おまけ

 本項16/12/31追記。

 「オーバーサンプリングデジタルフィルタ(リコンストラクションフィルタ)による復元では、プリエコーやポストエコーによる悪影響がある(波形が変形している?)」という問題提起をよく見かけます。本当でしょうか?
 ということで、上記より多くの周波数を含む場合のリコンストラクション精度を確かめてみました。

1.ソース生成:すべての周波数を含むソースということで、≪WaveGene 1.50≫で
        「ホワイトノイズ -6dB 16bit44.1kHz(以下1644)」を生成

2.無音挿入:普通のtrackでは曲間無音があるので、≪SoundEngine Free 5.02.≫で前後に1secの
        無音(0000H)を挿入

3.帯域制限:上記に対し、≪Wavosaur x64 1.1.0.0≫のHigh Performance LPFを19600.00kHzカットに
        設定して周波数成分をCD規格に合わせて20kHz以下に制限
         ちなみに≪WaveSpectra 1.50≫で成分が20kHz以下になるように調整した結果が19600.00kHz

4.88.1kHz化:≪foobar2000 1.3.8≫のResampler-V(SoX) 2.1の以下設定でx2
         PB90.6%~SB109.2%(DACシミュレート) -198dB Linear
         フィルタの遮断特性としてPBは約20kHz以上になります
         3で帯域制限していますので、PB以上に有効成分はありません(CD規格の通り)

 こうしてできた1688ファイルから単純に1個おきにサンプルを削除し、それが復元できるかをみてみます。

5.サンプル間引き:単純間引きする≪WAVEフォーマット変換プラス 1.02≫で44.1kHz化

6.リコンストラクション:1644ファイルを上記と同じ設定でx2

7.6の1688を波形反転して4の1688とmix

 結果、±1bit(90dB)しか残りませんでした。16bitの最低精度で復元できたということです。
 ホワイトノイズでこうなったのですから、フィルタ演算で再生成するサンプルにはヘンテコなエコー成分などはほぼ含まれていないということではないかと。
 実際のシステムでは24bit以上の精度で演算しますしね。アナログフィルタだと変形しないってワケでもありませんし。

 なお、上記のやり方だと3のLPFでエコー成分が付加(千分の数秒ほど付いてる模様)されていますので、無音からの立ち上がり・無音への立ち下がり部分についてはエコー込みでの結果となります。
 ちなみに、「インパルス応答」はフィルタ特性のパラメータであってインパルスは自然音としてはあり得ませんし、インパルス“的な”エコーもほぼ気にしなくていいと思っています。


メインメニューへ

テーマ : オーディオ
ジャンル : 趣味・実用

ERIへようこそ

Author:らかせ
 「最新記事」または「メインメニュー」からどうぞ

・ファイルへの直接リンク以外はリンクフリー(連絡不要)です
・一応、拍手にコメント(非公開)付けられるようにしてあります
・DB的に利用しており、過去記事もガシガシ書き換えています。特に「最新記事」は初稿から一週間くらいは直してることが多く、大幅に変わっちゃうことも。ご了承ください
・ということもありますし、記すまでもないですが無断転載(ファイル含む)はご遠慮ください
・引用の考え方については「007:諸事」をご参照ください
・アフィリエイトはAmazonのみです
・ハイパーリンクは当Blog記事のみです(054:節電記事のみ例外)

最新記事
カテゴリ
検索フォーム
FC2カウンター