スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ビット深度について深く考える

13/03/23初稿 (草稿記載開始は12/12/29)

 出力ビット深度を設定できるプレーヤソフトがあります。それらでは「設定と再生ファイルのフォーマットの関係」はどうなっているのでしょう? 例えば、24bitに設定して16bitのファイルを再生したら、DACには何ビットで入力されることになるのでしょうか?

 以下、WAVファイルを「uLilith Core2 x64 12/03/07版」および「foobar2000 1.1.15」で排他WASAPI再生する場合を考えてみました。特記なき場合は「プレーヤソフト」とは上記2種を指します。


■設定とフォーマット

・プレーヤ設定
 foobar2000を排他WASAPIで使うと、Output設定で8,16,24,32bitを選べるようになります。
 uLilithでは、「プラグインへの出力ビット深度」という設定があり、Integerの8,16,24,32bit、FloatingPointの32,64bitが選択できます。他に、排他WASAPIの「デバイスの詳細設定」でデバイスが対応しているビット深度を選ぶ設定もあります。

 以下uLilithの画面です。

uLilith:サウンド設定

uLilith:デバイスの詳細設定

・データフォーマット
 一方、データの方はどうかと言うと、WAVファイルのヘッダにはちゃんとビット深度情報が入っています。

 ですから、プレーヤは再生しようとしているファイルのビット深度は確定的に判っているハズであり、例えば「判んないから16bitでも24bitでも24bitで出力しちゃう」といったことにはならないハズです。

 とすると、ビット深度に関する「プレーヤの設定」と「ファイルに含まれる情報」が異なった場合、プレーヤはどう動いているのでしょうか。

 例えば、44.1kHz/16bitのデータを、24bitに設定したプレーヤソフトで再生するとどうなるのでしょう?
 逆に、96kHz/24bitのデータを16bit設定で再生すると?

 現実的運用上の問題として、(32bitはさておき)16bit音源と24bit音源を再生する時には、それぞれ設定を変える必要があるのでしょうか?
 それともフォーマットに応じて自動的に最適な出力してくれるのでしょうか?
 それとも(上位の)24bitに設定しておけば16bitは16bit分の出力にしてくれるのでしょうか?

 知らずに24bitデータなのに16bitでD/Aした音を聴いていたらイヤですし、同じ16bitデータでも16bit受けと24bit受けではDACの処理は異なると思いますので、どう設定すべきなのかちゃんと知っておきたいところです。

・確認方法
 しかし、確かな情報がなかなか得られません。受信データのサンプリング周波数を表示できるDACやDDCは存在しますが、ビット深度が確認できるものを見かけたことがありません(DSP-Z7では何故かビット深度が表示されない場合が多い)。
 そこで、ビットパーフェクト検証のためにS/PDIFを録音する手法で、出力された有効ビット深度を確認する方法を考えました。

 今回の環境は以下の通りです。

 再生:メインPC→SoundBlaster DigitalMusic PremiumHD→S/PDIF出力
 録音:S/PDIF入力→SE-U55SX→FMV-MG70W

 16/44.1、24/96ファイルにて調べてみます。32bit音源については現時点では関心がない(持ってもいない)のでここでは対象としませんが、たぶん理屈は同じでしょう。

 録音ソフトには、排他WASAPIで録音できる「RecPcmWin 1.04 64bit」を用います。当バージョンでは24bit録音もできます。
 排他WASAPI設定と実際のS/PDIF入力のサンプリング周波数が異なる場合、録音はできますが無音ファイルになります(サンプリングレート変換は行っていないため。当たり前ですが)。
 ビット深度の方は、排他WASAPI設定した仕様でWAVファイル化されます。実際やってみた結果、

A.16bit音源:設定が24bitなら24bitのWAVファイルになる(下位8bitに単純ゼロ詰め)
B.24bit音源:同16bit設定なら16bitファイルになる(下位8bitは単純カット)

でした。

 前述した通りWAVファイルにはビット深度情報含まれていますし、後述する通りS/PDIF規格にも含まれています。
 また、USB転送にも当該データのビット深度情報は当然存在するでしょう(でないとDDCからS/PDIF出力できませんから)。
 つまり、RecPcmWinは当然受信しているであろう「データストリームに含まれるビット深度情報より、自身の排他WASAPI設定を優先する」ようです。

 Aの下位8bitの00hはどこからも出力されていないハズですから、RecPcmWinで付け足したデータと考えられます。
 ただし、S/PDIF規格では「1サンプルのブロック内にある音声データビット数」は24bit固定であり、16bitの場合は8bit分無効データとして転送されていますので、もしかしたらその8bitは実質的にゼロであり、それを単純に録音しているのかも知れません。

16bitを24bitで録音


■プレーヤ設定を16bitにすると24bit音源はどうなるか

 この場合、「プレーヤ設定(16bit)の方が音源フォーマット(24bit)より優先される」なら16bitデータを24bit録音することになり、下位8bitビットはRecPcmWinが付け加えた00hになるハズです。
 そうではなく、「プレーヤは自身の設定(16bit)より音源フォーマット(24bit)を優先して動作する」なら下位8bitも有効データになるハズです。
 当然プレーヤのマスターボリュームは100%にて。録音ファイルをバイナリエディタで覗いて確認した結果を以下に記します。

・uLilithでは
 「プラグインへの出力ビット深度」と「WASAPIデバイスの詳細設定」について、

 ・両方を24bitに設定・・・24bit有効
 ・いずれかを16bit設定・・・下位8bitは00h

という結果になりました。
 つまり、ふたつの設定ともに24bitにしておかないと、24bitデータをプレーヤ内部で16bitデータに改変して出力している(たぶん下位8bitをカットしただけだと思いますが)ということです。24bit音源を24bit有効なデータとして出力するためには、両方とも24bitに設定する必要があるようです。

 ちなみに、uLilithでは排他WASAPI出力機能はプラグインの位置づけです。
 ので、プレーヤ内部動作としては「プラグインへの出力ビット深度」を絞った時点で16bitになっていると推察します。“プラグインへのInput”といっていいでしょう。
 「デバイスの詳細設定」は、“プラグインからのOutput”に当たります(*)。プラグインの入口と出口、両方24bit設定する必要があるのは当然といえば当然でしょう。
 逆に、少なくとも排他WASAPIにおいては、明示されない“ビット深度の自動制御”は行われていないと言えそうです。

*:出力デバイスとして「出力プラグイン」の中から排他WASAPIを選択すると設定可能になる項目であることから。

・foobar2000では
 「Output format」を16bitにすると下位00hとなりました。24bitなら当然24bit有効データとして録音されます。


■プレーヤ設定を24bitにすると16bit音源はどうなるか

 一方、16bit音源を24bit設定で出力するとどうなるでしょう。もし、プレーヤ側で24bitに拡張されて出力されるとしても、“ビットパーフェクト設定下では”、下位ビットは「ヘンな演算されずに00hが付いただけ」になると推定されます。
 ですので、24bit深度に設定して録音したデータの下位8bitが00hだったとしても、その00hはプレーヤ側で出力時に付加したもの(24bit出力)かRecPcmWinが録音時に付けたもの(16bit出力)かは判断できません。
 そこで、プレーヤ内でデータに何らかの演算処理をさせることで敢えてビットパーフェクトを崩してみます。
 演算処理は、24bit設定なら24bitで行われ、16bit音源でも下位ビットは00h以外(というか演算結果の有効データ)になって出力されるハズという仮定しました。
 逆に、プレーヤ設定に依らず16bit音源はあくまでも16bit出力するなら、たとえ演算されても下位8bitは出力されず、録音側で付加される00hになるハズです。

 演算は「プレーヤのボリュームを100%未満にする」をチョイス。代表的かつシンプルだと思いましたので。

・ulilithでは
 ・両設定ともに24bit・・・24bit有効
 ・両設定ともに16bit・・・下位8bitはさすがに00h
 ・「プラグインへの出力ビット深度」だけ16bit・・・24bit有効
 ・WASAPI「デバイスの詳細設定」の方だけ16bit・・・下位8bitは00h

 つまり、出力ビット深度は「WASAPIのデバイス設定モードで決まる(プラグインからのOutput設定で決まり、プラグインへのInput設定は効いていない)」ということです。ボリューム演算はプラグインに渡った後実行されているんですね。

・foobar2000では
 「Output format」を24bitにすると下位8bitも有効データとなり、16bitなら00hとなりました。


■まとめ

 以上より、プレーヤソフトからの出力ビット深度は、

「音源のフォーマットで決定しておらず、プレーヤ設定に基づくビット深度で内部処理が行われ、出力ビット深度も設定によって決定している」

と言えそうです。

 24bit設定で16bit音源を再生すると、Audioデバイスへは24bitデータとして出力されてしまうようです。
 16bit設定で24bit音源を再生すると、16bitになってしまうようです。

 ですので、24bit音源を24bitでビットパーフェクト出力するためにはプレーヤ設定を明示的に24bitにしないとダメそうですね。16bit音源の場合も、24bit設定だと24bitデータとしてD/Aされちゃうようです(*)。

*:データの“レゾリューション”としては16bitと下位8bitがゼロの24bitでは同じと言っていいと思いますが、DAC動作モードは異なっているハズです(たぶん)。
 15/01/27追記:トランジスタ技術2013年12月号P.125に「24bitデータの24bit精度を保つため内部で上位・下位ビットを拡張して28~32bitデータとして各種演算処理を行う」とあります。DACチップの入力部から出た時点で、16bitも24bitもDACチップの内部バス幅のデータに変換されてるような。ということは、bit数違いによるDAC動作の違いは、あるとしても最初の処理だけなのかも知れません。

 プレーヤソフトは、「WAVファイルヘッダにあるビット深度情報やAudioデバイスの仕様をチェックして自動的に出力ビット深度を調整」といったことはしていないんですね(そもそもuLilithのWASAPI「デバイスの詳細設定」ではデバイスのスペック以外は選択できませんが)。
 私などは自動調整してくれてもいいような気がしてしまいますが、そう感じてしまう理由は、

プレーヤソフトは決して“ビットパーフェクトだけを前提にしているワケではない。演算もするんだよ”ということを忘れた“ビットパーフェクトフェチ”ゆえ、

かも知れませんね(苦笑)。プレーヤとしては各種演算も出力もなるべく深いビット深度の方がいいですもんね。
 そういう認識を持ってプレーヤ設計コンセプトを理解する必要があるんだなぁと(今更)思いました。

 uLilithでは、「プラグインへの出力ビット深度」は内部処理(プラグイン処理)には効きますが、デバイスへの最終出力は排他WASAPI「デバイスの詳細設定」で決定していると思われます。
 ですので、「プレーヤ内部処理は行わないビットパフェークト運用の場合」なら、16bit音源再生時には「デバイスの詳細設定(プラグインからのOutput)」さえ16bitにしておけば、「プラグイン深度」の方は24bitのままでもビットパーフェクトになるようです。64bitFloatingPointなどに設定しても大丈夫です(*)。

*:これだけはFMVのuLilithからUD-5出力をメインPCのSoundBlasterで受けてRecPcmWin録音して確認しました。

 なお、本稿で確認したのはuLilithとfoobarの当該バージョンだけですので、プレーヤソフトによって挙動が異なる可能性は十分あります。


■おまけ

・foobarからのメッセージ
 「Output format」の設定画面に以下の注記があります。

Refer to your hardware specifications for preferred output bit depth; using bit depth above your hardware capabilities will only result in degraded performance.

 「ハードウェアのスペック以上のビット深度に設定しても無駄だよ」ってなカンジでしょうか。

・ちなみにPlayPcmWinでは
 ↓のように設定可能になっています。「排他WASAPIにオプティマイズした演算処理なしのプレーヤ」ゆえでしょうか、自動選択モードもありますね。「演算しないので演算のためのビット深度選択は不要、ゆえにフォーマットに自動対応可能」ということでしょう。
 各モードではどのように処理されるまでプルダウンに記載されていて解りやすいです。

PlayPcmWinのビット深度設定
 x64版4.0.46.0にて

・ちなみにJRiverMediaCenter20では
 本項15/02/28追記:「自動設定」があるソフトをひとつ。フリーではありませんけれど。

JRMC20のビット深度設定

 しかし、どうもこの「自動設定」はフォーマット通りという意味ではないようです。「オーディオデータ経路」を見ると16bitソースでも32bit出力になってました。「最高音質」とは、デバイス側対応フォーマット上最高という意味っぽいです。
 ソフトによってもいろいろってことですね。

・S/PDIFのビット深度情報はフォーマット内のどこにあるか(*)
 この項だけなぜか「である調」にて。
 S/PDIFは192フレーム(フレームは同時に鳴らすチャンネルをまとめた概念としての1サンプルに相当)でワンセット=ブロックとなっており、フレームには32bitのサブフレームが複数入っている。ステレオならサブフレームは2個。ビット深度情報が含まれるCビットは各サブフレームに1bitしかないが、ブロックにするとチャンネルあたり192bitの情報となる(C-bitの集合体=Channel Status Dataは、名前の通りチャンネルことに形成されると理解。独立したステイタスとなる)。
 つまり、これによってS/PDIF転送でもビット深度は定義されており受信側でも認識できるので、「なんでもDACの最大能力でD/A変換している」といったことはないハズだが…192フレーム受信しないとステイタスは解らない点について、実動作がどうなっているかは調べ切れていない。

*:http://blog.venetor-sound.com/?eid=14


メインメニューへ
スポンサーサイト

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

最新記事
ERIへようこそ

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

・ファイルへの直接リンク以外はリンクフリー(連絡不要)です

・一応、拍手にコメント(非公開)付けられるようにしてあります

・DB的に利用しており、過去記事もガシガシ書き換えています。特に「最新記事」は初稿から一週間くらいは直してることが多く、大幅に変わっちゃうことも。ご了承ください

・ということもありますし、記すまでもないですが無断転載(ファイル含む)はご遠慮ください

・引用の考え方については「007:諸事」をご参照ください

・アフィリエイトはAmazonのみです

・ハイパーリンクは当Blog記事のみです(054:節電記事のみ例外)

カテゴリ
検索フォーム
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。