FC2ブログ

デジタル転送過程でデータ改変は発生しているか

09/10/03初稿

 排他WASAPIで出力されたデジタルデータは本当に改変されずにDACのInputまで届いているのでしょうか?
 逆に、いわゆるカーネルミキサ(本稿ではオーディオエンジンのこともこれで仮称します)を介すると本当にデータが改変されているのでしょうか?

 CDプレーヤの出力をキャプチャして… というは藤本健氏の記事(*)で8年前に検証されてますが、PCのファイル再生に関する検証はweb上で確認できなかったので、自分で実験を試みました。
 念のためですが、特記しない限り「WASAPI」は排他モードを指します。

*:http://av.watch.impress.co.jp/docs/20010416/dal06.htm


■デジタル転送中にデータ改変は発生しているか

・デジタル出力をデジタル入力でキャプチャしてみる
 キャプチャ環境は稿末にまとめました。

 WAVファイルを≪uLilith≫で再生し、S/PDIF接続してデジタルダイレクトキャプチャ(録音?)し、できたファイルを再生ファイルとコンペアします。コンペアには従来と同じく≪WaveCompare≫を用います。
 出力側DDCやS/PDIFケーブルにはあえてフツーの機材を使っています。もともとの目的は排他WASAPIによるデータ改変なしを確認することですが、同時に「フツーの機材」でのデータ改変有無も確認しようという意図からです。
 なお、すべてのボリューム(バランス含む)は「MAX」、すべてのエフェクト系は「OFF」にするのが基本です。

 ポイントは「キャプチャする側でカーネルミキサ通したら意味がない」ということです。実際、Windows付属の≪サウンドレコーダ≫を使うとWAVコンペア一致しないファイルになります。

 そこで、キャプチャソフトとしては、排他WASAPIに対応してるという≪SONAR8 PRODUCER(体験版)≫を使います。
 しかし、排他WASAPIにしてキャプチャしてみましたが全然一致しません。
 初めていじくるDAWソフトで設定の勘どころもないので諦めようかと思いましたが、試しに「WDM/KS」モードにしてみたら…
 来ました来ましたWAVコンペア一致! 数回すべて一致しました。

 排他WASAPIでダメだった理由はよくわかりません。≪SONAR8≫のWASAPI実装の問題でしょうか? そう言えばインストール時にひとつエラーが出て無視しましたが(苦笑)。後で思いましたが、もしかしたら排他ではなく共有モードだったのかもしれません。

 一方、再生側の≪uLilith≫を「DirectSound(以下DS)」に設定して出力したデータをキャプチャすると、確かに「WAVコンペア一致しない」ファイルができあがります。ところどころじゃなくて全く(微妙に)一致しません。カーネルミキサを通る時に演算されちゃっているのでしょう。
 そうして出来たWAVファイルを排他WASAPIのビットパーフェクトで聴いてみると、確かに「一枚ヴェールがかかったような」音になります(笑)。DSで出力した時と同じカンジですね。


 ちなみにSE-U55SXは≪SONAR8≫上のWDM/KSモードで再生も出来ました。ASIOは動きません(とういか認識しない)。
 WDM/KSってASIOと違って汎用ドライバで使えるんですね。WDM/KS対応のPlayerとかあったらいい音出しそうです。ちょっと調べたところでは≪foobar2000≫にKSプラグインがあるみたいです。
 そのうち、≪uLilith with 排他WASAPI≫≪foobar2000 with 排他WASAPI≫≪foobar2000 with KS≫地上最大の決戦でもやってみたいと思います。

・ハードウェアOK・ソフトウェアNG
 う~む。ウワサは本当だったようです。排他WASAPIはWAVファイルの中身を正確にUSB出力しています。「ビットパーフェクト(Bit Perfect)」「ビットイグザクト(Bit Exact)」などと言えばいいのでしょうか。
 一方、WASAPI以前のAPIはやっぱり改変していました。

 これをハードウェア的な観点で見てみます。
 具体的にデータの流れで言うと、今回の実験では

  PC→USB→DDC→S/PDIF(光)→DDC→USB→PC

のハードウェア(フツーの機材)においてデータの改変はないことが解ります。
 いわゆる「アイソクロナス転送における1ms単位のデータ欠損」も発生していないと言っていいのではないでしょうか。充分な検証になっているとは言えませんが、WAVコンペア一致したのですから。

 さて、普通の再生時は

  PC→USB→DDC→S/PDIF(光)→DAC

ですから、DACへ届いているデータに改変はないと言えるハズです。

・振動によってデータ改変は発生しているか
 さらに追加実験。
 キャプチャ中に光ケーブルをぶんぶん揺らします。振動によって「データの改変」が発生して音が悪くなるなら、記録されたファイルはWAVコンペア一致しないハズです。

 …結果は見事に一致。


 以上より、USBケーブルやDDCが超ピュア用じゃなくても、かつ、S/PDIFケーブルが同軸じゃなくて光だろうがましてや安物だろうがバリバリ振動してようが、排他WASAPIでは「PCからDACまでの転送中にデータ改変は発生していない」と言っていいと思います。


■排他WASAPIじゃないと何が起こっているのか

 本項13/01/24追記。

 以下、16bit/44.1kHzを1644、16bit/48kHzを1648、24bit/96kHzを2496と略称します。
 また、すべて、以下環境におけるデジタルダイレクト再生・キャプチャ(スペクトル表示)に関してです(アナログ(DAC/ADC)要素はありません)。

  再生&キャプチャPC:Windows7 HomePremium SP1 64bit 自作PC
  再生&キャプチャDDC:SoundBlaster DigitalMusic PremiumHD
  再生&キャプチャパス:S/PDIF外部ループバック

 もちろん各種エフェクトはDisableですしボリュームも100%、余計な入出力はカットしています。
 さらに、もちろんですがキャプチャ(スペクトル表示)側のAPIは常に排他WASAPIです。ので、このプロセスはビットパーフェクトです。

 14/06/14追記:SB-DM-PHDですが、Windows8.1 update 64bitのINBOXドライバだと96kHzでのS/PDIF出力できないようです。Creative製ドライバ入れたら動きました。

・オーディオエンジンの「データ改変」実態:音が大きいとき
 前述の通り、S/PDIFのデジタルOUTをデジタルINでキャプチャする実験において、「排他WASAPI」はビットパーフェクトですが「DirectSound(以下DS)」はそうではありませんでした。
 エフェクトをかけずミキシングもせずボリューム100%にしていても、「Windowsオーディオエンジン(XPまではカーネルミキサと呼ばれていた)」を通ることによって何らかのデータ改変が発生しているということです。
 改変されちゃうのですから、改変されたデータの改変内容を突き止めるのはまず無理であり、かつ「排他WASAPI使い」としては意味ないことなので放置していましたが、藤本健氏の記事(*)によって概要が解明されました。

*:http://av.watch.impress.co.jp/docs/series/dal/20121112_572414.html

 要約すると以下のようなことが起こっているようです。

 ピークリミッタに以下の問題がある。
  ・ノーエフェクトの単独音声再生の場合でも作動する(*)
  ・処理結果、無視できない波形改変を発生させている(ノイズと言っていいレベル)
  ・DSではなくMMEでボリューム99%以下に設定すると発生しない

*:加工やMixしてないので0dBを越えないハズ。


 ほとんどバグと言っていい“仕様”ですね(苦笑)。

 なお、ミキサにはピークリミッタは当然必要ですので、「ピークリミッタがあること」が問題なのではありません。「リミッタ動作がヘン」ということです。

 19/11/27追記:ただし、本来なら、音源ソースはTruePeakを考慮してヘッドルームをとる必要がありますから、ピークリミッタに引っかかるのはそもそも問題だとは言えるかも知れません。しかし、サイン波のようにTruePeakでピークが上昇しない場合もありますから、ヘッドルーム前提のリミッタはやはりマズイでしょう。
 そもそも、引っかかった場合の波形変形はノイズといっていいものになっていますし。

・オーディオエンジンの「データ改変」実態:音が小さいとき
 さて、そんなこんなでいろいろいじくっている中で≪WaveSpectra 1.50≫でスペクトルを眺めていた時、オモシロイ現象に遭遇しました。
 Windows7(Vista)のオーディオエンジンでは、出力デバイスの仕様に基づいて出力サンプルレート(ビット深度も添えて)を選択できます。

サンプルレート選択


 ある目的で「すべて0000hのWAVファイル(1644)」つまり“無音データ”のスペクトルを見ていたのですが、DSやMMEの場合、プレーヤソフトでPlayすると-120dBくらいのホワイトノイズが発生します。Stopすると“測定限界以下”に消えます(iTunesではStopしても数秒間保持します。オーディオエンジンに対して再生状態を継続しているのでしょうか)。

1644のDSスペクトル


 キャプチャしてバイナリエディタでみてみると、0000hと0001hとFFFFhがランダムに出現していました。つまり、何らかの演算が入っておりその演算誤差で元は0なのに1や-1にバケてしまっているのでしょう。
 これではどんなファイルもデータ改変されて出力されるワケです。「サイン波:440Hz:-10dB」や普通の楽曲(最大音量-0.75dB)ファイルでも±1の差違が発生していました。
 もちろん排他WASAPI再生では当ノイズは発生しません(実際キャプチャしてファイル化してみても中身はオール0000h)。

 これによって、「ピークリミッタ」問題だけでなく、「常に余計なプロセスが入っていて、そこで演算誤差が発生する」問題もあることが解りました。
 影響度はさておき、「Windowsオーディオエンジンで音質劣化」と言っていいでしょう。

・2496だと異なる事情
 しかし、ふと2496モードに設定してみたところ、DSでもMMEでもノイズ波形が出現しません。ゼロがゼロのままということです。この場合、オーディオエンジン内で1644→2496リサンプリングが発生しているにも関わらずです(オールゼロなのでリサンプルしてもでオールゼロなのは筋が通ってますけど)。
 そこで思いついたことがありました。

「2496モードなら、オーディオエンジンを通してもビットパーフェクトが可能なのではないか?」

 これは試してみるっきゃない。

 この時気をつけなければならないのが上記「ピークリミッタ問題」です。これを発生させないようにするため、波形生成ソフト≪WaveGene 1.40≫で2496「440Hzサイン波:-10dB」のWAVファイルを生成してこれを用いました。
 このファイルをDSとMMEで再生、排他WASAPIキャプチャしてみたところ、見事にWAVコンペア一致するではないですか。

 続けて出力サンプルレート設定だけ1644や1648に変更して対応するフォーマットのファイルを再生・キャプチャしてみたところ、やっぱり一致しません。

・ピークリミッタはどうか
 引き続き、2496モードにおける「ピークリミッタ問題」の有無も確認。
 2496「440Hzサイン波:0dB」を生成して再生・キャプチャしてみたところ、一致しませんでした。
 キャプチャしたファイルを波形編集ソフト≪SoundEngine≫の「解析」で見てみると、最大音量が-0.28dBになっていました。再生したファイルはもちろん0dBと解析されます。
 つまり、「単独再生でもピークリミッタが効いて波形改変されてしまう」問題は健在(苦笑)なようです。
 ちなみに、上記を受けて「440Hzサイン波:-0.28dB」ファイルを生成して再生したところ、ビットパーフェクトを確認しました。

 19/11/27追記:その後の藤本氏の記事(*)によると、ピークリミッタは-0.13dB越えで発動するのでしょうか。
 試しに、≪foobar2000≫のボリュームを-0.23dB(スライダ最小ステップ)絞り、上記サイン波をDSと排他WASAPIでデジタルキャプチャしてみたところ、最大音量は両方とも-023dBと解析されました。
 プレーヤソフトで若干ボリューム下げて24bitで使えば一応問題回避できそうですね。
 「プレーヤで音量下げ再生」は別稿に記す通り「TruePeak」対策にもいいかもしれませんし、「ビット落ち」は気にしなくていいと思いますし。

*:https://av.watch.impress.co.jp/docs/series/dal/752552.html

・オーディオエンジンを通ってもビットパーフェクト
 以上より、DSやMMEによるオーディオエンジン経由でも、2496モードかつピークリミッタ問題が発生しないファイル(プレーヤ側で音量絞る場合も含む)なら、ビットパーフェクトが可能であることが判明しました。

 1644や1648と2496で事情が異なる理由は解りませんが、XPの「カーネルミキサ」は48kHz固定だったという情報から、Vista以降の「オーディオエンジン」内の2496処理は新設されたものであり、1644や1648とはプログラムの出自が違うためかもしれません。
 …もしかしてVista以降は「すべての音源は2496にしてから内部処理」になってる可能性も?
 13/01/25追記:↑と最初書きましたが、そうではないようです。
 演算誤差は、44.1kHzでも24bit(2444モード)だと発生しませんが、逆に96kHzでも16bit(1696モード)だと発生します。
 つまり、おそらくサンプルレートには関係なく24bitの場合は発生しないのですね。
 オーディオエンジンを経由する場合、可能なら24bit設定で使った方がよさそうです。

 なお、≪WaveGene≫で「ホワイトノイズ:0dB」2444ファイルを生成してマーカを付けて再生・キャプチャ、マーカに位置合わせして反転ミックスしたところ、残念ながら「最大-30dB程度のノイズ」が発生していることを確認しました。24bitでも「ピークリミッタがノイズを発生させる問題」は厳然と存在するようです。
 藤本氏の指摘通り、ノイズデータは実際に再生すると「チリチリ」とハッキリ聴こえます。
 ダメぢゃん。

・24bitならWAE経由でもビットパーフェクトにできるプレーヤ
 上記24bit時のビットパーフェクトは以下で確認しました。

 ・≪foobar2000 1.1.15≫のDSモード
 ・≪uLilith(Core2 x64 12/03/07版)≫のDSモード
 ・≪WaveSpectra 1.50≫のMMEモード

 ≪WMP(12.0.7601.175149)≫では何故かキャプチャしたファイルの「最後の16サンプル」だけ000000hになっちゃいました。なんだかバッファ制御関連のお茶目なバグっぽいですね。これを音質的に聴き分けられる人間はいないと思いますので、まあ、大きくみれば「ほぼビットパーフェクト」と言っていいでしょう。

 問題は≪iTunes≫。10.0.0も11.0.1もビットパーフェクトできません(全面的に異なるデータになる)。≪QuickTime≫(DSでもWASAPI共有でも)も同様です。これについては≪iTunes≫は何をしてるのかを考察した記事に引き継ぎとしたいと思います。


 なお、もちろん本項は上記環境における確認結果であり、環境が異なれば異なる可能性も否定はできません(といってDDCが影響するとも思えませんが)。

 さらに… 本項書いてから3日後、≪PlayPcmWin≫の作者であるyamamoto2002さんがすでに半年前「24bitなら改変なし」に関連する検証(*)されてらっしゃったのを発見したことを記録しておきます。

*:http://community.phileweb.com/mypage/entry/2721/20120826/32495/


■ディザってる?

 16bit時の差違は「ディザ処理」という話もあるようです。
 が、ERIとしては以下の理由で“MSの意図せぬ結果(演算誤差)”と考えた方がいいのではと思っています。

・多重ディザ処理は御法度らしい。
 プレーヤ側でかけることもあり得るのに、オーディオエンジン側で常にかけているとは考えがたい。

・ディザ処理は聴感上の音質向上を図るものである。
 ディザは「24bit→16bitなどの低ビット深度への変換時、まるめ誤差によるシグナルと相関性のあるノイズ感を隠蔽するため敢えてランダムノイズを付加すること」である。
 ピークリミッタ問題を見逃す(放置する)程度に“音質に拘りのない”MSが、わざわざそんな「音質のためのプラスα」な機能を盛り込むとは思えない(爆)。

・上図の通り当差異のスペクトルは非常に低レベルのホワイトノイズとなる。
 ≪foobar2000≫のディザ処理による差違はもっと大きく、ディザ有無の差分抽出したファイルは最大音量-60dBに達し(≪SoundEngine≫の「解析」による)、スペクトルはフラットではなく特に高域に盛り上がりを持つ(≪foobar2000≫のディザを確認した記事参照)。
 実際、専門書を見ても1bit程度のノイズ付加ではディザの意味はなさそう。

・ディザ処理はそれなりにCPU能力を使うという。
 E-350環境を400MHzにアンダークロックし、≪foobar2000≫の1644ファイル再生(オーディオエンジンはもちろん1644モード)でタスクマネージャCPU負荷率を比べると、

 ・DS = 11%
 ・WASAPI(event)Dither Off = 13%
 ・WASAPI(event)Dither On = 17%

程度となる。アルゴリズムは異なるだろうが、オーディオエンジンでディザ処理しているとすると負荷が小さすぎるのではないか。


■おまけ:S/PDIFでExcelデータを転送する

 本項13/02/08追記。

 排他WASAPIなどのデータ改変しないAPIと≪foobar2000≫などのデータ改変しないプレーヤで送出された音声データは、USBやS/PDIFを経由しても改変はありません(エラーしたら別ですが前述の検証通り普通はエラーしません)。
 つまり、音声データ転送も、再送機能こそありませんがれっきとしたデータ転送システムなのであり、であれば音声データでなくてもパーフェクトに送れるハズです。
 また、WAVフォーマットにおいてはヘッダ後の音声データ部分は純粋に0と1としてのみ扱われますので(例えば特定のパターンをエラーと見なすといった規定はない)、例えばExcelデータを埋め込んだWAVファイルでもビットは音声と見なされて改変なく転送されるということです。
 それはもちろんマトモな音にはなりませんが、S/PDIF経由でデジタル再生・キャプチャする分にはDACやスピーカを壊すこともありません。

 そこで、以下の実験を試みました。

・無音WAVデータファイルを準備(音声データ部分はオールゼロ)

・それより容量の小さなExcelファイルを準備(データの最後のパターンが判りやすいファイルがよい)

・バイナリエディタでExcelデータをすべてコピー、無音WAVファイルの音声データ先頭アドレスである2Ch以降に上書き貼り付け(サンプル単位に合わせた方がキモチはいいです。2Ch以降16bitステレオなら4Byte単位で先頭が来ます)

WAVフォーマットについては解説記事を書いていますのでよろしければどうぞ。

・ビットパーフェクト環境で再生・キャプチャ

・キャプチャファイルをバイナリエディタで開き、元Excelファイルの先頭と末尾に相当する部分を見つけ出し、前後をカットして保存
 Excelデータが音声として表示されたヘンテコ波形の前後を波形編集ソフトでギリギリまでカットしてからの方が、Excel部分は見つけ易いでしょう(ただし波形編集ソフトによってはカット以外の処理をかけてしまいますので注意が必要です)

・ファイル拡張子を「.xls」に変更

 …見事にExcelファイルとして開けました。

 特に意味はありませんが、「ああ、確かにS/PDIF転送も普通はビットパーフェクトなんだなぁ」という実感はできますよ(笑)。


■キャプチャ環境

・初稿時
・出力側環境
  ・PC・・・FUJITSU FMV MG70W Vista HomePremiumSP2 32bit
  ・Player・・・≪uLilith β3≫
  ・DDC・・・ONKYO UD-5(オーディオ用というよりPCからの5.1ch出力用(*))
  ・USBケーブル・・・UD-5一体型

・接続
  ・光デジタルケーブル・・・SONY POC-20A(2.0mで\2,000弱の一般品)

・キャプチャ側環境
  ・PC・・・HDC-1L Win7RC 64bit
  ・Recorder・・≪SONAR8 PRODUCER 64 Trial≫
  ・DDC・・・SE-U55SX UD-5のOutputを光Inputに入力
  ・USBケーブル・・・ULTRAVIOLET5-2

*:http://www.jp.onkyo.com/support/manual/manualpdf/ud-5_j.pdf

・追加確認1
 10/11/06追記:以下環境でもピットパーフェクト転送を確認しました。今回は、レコーダソフトとして≪RecPcmWin≫というフリーソフトを使わせていただきました。
 これによって、Play/Recとも排他WASAPIで行えるようになりました。

・出力側環境
  ・PC・・・ONKYO HCD-1L Windows7 HomePremium 64bit
  ・Player・・・≪uLilith β3≫
  ・DDC・・・REX-Link2EX

・接続
  ・光デジタルケーブル・・・SONY POC-20A

・キャプチャ側環境
  ・PC・・・FUJITSU FMV MG70W Windows7 HomePremium 64bit
  ・Recorder・・≪RecPcmWin 1.01 64bit≫
   (13/01/14追記:1.04から24bitキャプチャも可能に)
  ・DDC・・・SE-U55SX REX-Link2EXのOutputを光Inputに入力
  ・USBケーブル・・・ULTRAVIOLET5-2

・追加確認2
 11/02/20追記:Creative製「Sound Blaster Digital Music PremiumHD」でも、SE-U55SXと同じく光S/PDIF入力で排他WASAPIキャプチャできることを確認しました。


Creative USB Sound Blaster Digital Music Premium HD r2 ハイレゾ対応 USBオーディオインターフェース アナログ録音 再生リダイレクト SB-DM-PHDR2
(Amazonアソシエイト:記事機種の後継機)

 上記構成のSE-U55SX部分を置き換えた環境です。光S/PDIFケーブルとUSBケーブルはめんどくさかったのとmini端子であることから違うものを使ってますが、もはや問題ではないでしょう。超高級品にしたワケでもありませんし。
 もちろんビットパーフェクトでした。

 ≪RecPcmWin≫の録音デバイスとして「SPDIF入力(USB Sound Blaster HD)」を選択します。やや気むずかしいようで、環境によってはこれが出てこないこともあるようです。また、このデバイスは「DAC/ADC」としては44.1kHz系をサポートしません(48/96のみ)が、「DDC(USB←→S/PDIF双方向とも)」としては対応しています(44.1/48/96)。DACのクロックを48kHz系しか持っていないということでしょうか。音質へのこだわりから?
 一方、この環境で改めて、≪uLilith≫をDSに設定・ボリュームはすべて100%・共有モードの音質は44.1kHz/16bitであることを確認の上キャプチャしてみましたが、やっぱり一致しませんでした。

 12/12/24追記:Digital Audio Labolatoryさんの記事(*)によると、当機のDACはAKM製AK4396VF。24.576MHz(48kHzの512倍)のクロック発振器を搭載してるようですので、PLLかけずにマスタークロックにしてるっぽいですね(アナログでは44.1kHz非対応なことからも)。

*:http://av.watch.impress.co.jp/docs/series/dal/20100705_378787.html

 12/12/30追記:このデバイス、自分のS/PDIF出力を自分の入力でキャプチャできるようです(内部ループバックではなく)。ひとつの環境でいろいろ実験できそうです。便利かも(笑)。
 13/01/20追記:自分のアナログ出力も自分でキャプチャできます(内部ループバックではなく)。

 13/01/14追記:≪WaveSpectra 1.50≫でも排他WASAPIキャプチャができます。上記SoundBlasterのループバックでWAVコンペア一致を確認しました。


メインメニューへ

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

最新記事
ERIへようこそ

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

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

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

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

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

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

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

・Amazonアソシエイトに参加しています(アフィリエイトはAmazonのみです)

カテゴリ
検索フォーム
FC2カウンター