日記
WM8805ソフトモードで44.1k~192kに対応する方法
2013年12月01日
最近久しぶりに自作界隈の記事をネットで調べてみたらWM8805がロージッタで地味に話題になっている記事を幾つか見ました。たしかにRAMバッファやリサンプルを使わない方法ではこれがベストのICだと思います。
■デジタルインターフェースICとジッターのJtest測定はこちら
(リンクが死んでいたので貼り直します)
http://innocent-key.com/data/yohine/dac/jitter_measurement.html
これをみるとDIX9211、CS8416等普通のデジタルレシーバではなかなかジッターが除去できていないのがわかると思います。
私はだいぶ前にWM8805について検証していたのですが、当時実験的に44.1kと192kにソフトモードで対応する方法も実装していたのでその方法を紹介したいと思います。コードは余り見せられるようなレベルではないですが、参考程度としてください。インデントが貼り付けると死んでしまうので自動インデントのソフトなどでインデントを再生成することをおすすめします。
WM8805はそのままでは192kと44.1kに同時に対応することは出来ないのですが、ここで行う方法とは、2つのモードを非ロック時に一度切り替えてロック試行をするだけです。たしかこれで44.1k<->192kの自動判別は動作していたと思います。
■サンプルソース抜粋(8741専用コードは消してください)
//WM8805write、WM8805readはI2C通信関数
void WM8805hifqset(unsigned char rate)
{
if (rate == 0x10)
{
//176.4k
WM8805write(0x03,0x21);
WM8805write(0x04,0xfd);
WM8805write(0x05,0x36);
WM8805write(0x06,0x07);
return;
}
if (rate == 0)
{
//default
WM8805write(0x03,0x21);
WM8805write(0x04,0xfd);
WM8805write(0x05,0x36);
WM8805write(0x06,0x07);
return;
}
//192k
WM8805write(0x03,0xba);
WM8805write(0x04,0x49);
WM8805write(0x05,0x0c);
WM8805write(0x06,0x08);
}
unsigned char DEEMPH, Lock = 0, Read = 255;
unsigned char Freq = 0, Freq2, tmp = 1;
I2Cinit();
WM8741volinit(); //Volを0に設定
WM8805write(0x1e,0b00000100); //R30 PWRDN 内部電源
WM8805write(0x1c,0b01001010); //R28 AIFRX フォーマット設定
WM8805write(0x08,0b00111000);
while(1)
{
tmp = WM8805read(0x0c); //各種情報取得
Lock = tmp & 0b01000011; //1以上の場合はアウトレンジ
if ( (Read != tmp) || (Lock > 0) ) //状態更新がない場合はパス
{
Read = tmp; //最新データ取得
if (Lock > 0)
//アンロック状態の動作
{
WM8741write(0x06,0b10000010); //MUTE ON & Filter reset
WM8741write(0x04,0b10011000); //IZD on mute
//192k設定を試行
WM8805hifqset(1); //192k
Wait_ms(15);
tmp = WM8805read(0x0c);//再取得
if ((tmp & 0b01000011) > 0)
{
//ロックされないならばデフォルトに戻す
WM8805hifqset(0); //defaultに戻る
}
Wait_ms(10);
}
else
//ロック状態の動作
{
WM8741write(0x04,0b00010000);
DEEMPH = tmp & 0b00001000; //エンファシスフラグ
Freq = (tmp & 0b00110000) >> 4; //周波数レート
Freq2 = WM8805read(0x10); //周波数レート補助
WM8741setfilter(Freq, WM8741FLTTYP); //フィルタ設定
}
//表示関係処理を以下に記述
}
}
■WM8805の問題点
不具合として192kのロック自体が若干不安定だったこと、切替時にDAC側のミュートを入れてもノイズが入ることがあります。また88.2kと176.4kはロックはしますがノイズ混じりでまともに鳴りませんでした。ロージッタを実現するかわりにこのような実用上の問題を抱えたICです。WM8805はロックの安定性も低めなのであまりオススメできません。
■ロージッター手法で一番のおすすめはSRCのジッター除去
個人的にはWM8805よりも水晶リサンプル方式のほうが低ジッタ化が容易でしかも音質も優れていると思います。(サンプルレートコンバート=SRC)
十分高精度なリサンプル処理に劣化はほぼないといっても良いのですが世間ではリサンプルという言葉で敬遠されているのが事実だと思います。そのような意見は今まで何度も見たことがありますが、正直それに根拠はなくて「思い込みによる音の差」がオーディオ的にすごく影響を与えているとしか思えません。
実際に、過去にリサンプルの副作用、音質差、劣化を実際に聴き比べることが可能なデータを用意してあります。リンクが死んでいたので貼り直しました。ちなみに私はこの2つの差は事前にわかっていて聴き比べても全然わかりません。
データの出展、リサンプル手順の説明の記事
https://community.phileweb.com/mypage/entry/1641/20120804/32137/
原音
http://innocent-key.com/data/yohine/src/OE_alexpfeffer__ginnungagap_v3.wav
SRC後 Linear phase
http://innocent-key.com/data/yohine/src/L44_L192_OE_alexpfeffer__ginnungagap_v3.wav
SRC前後で差分をとったもの(ファイルの差分が音になる)
http://innocent-key.com/data/yohine/src/L44_difference_OE_alexpfeffer__ginnungagap_v3.wav
この差分ファイルをFFTで見るとわかるのですが-170dBのノイズフロアと20kHz以上のわずかな成分しか残っていません。現在最高のDACが-160dBくらいのノイズフロアが限界ですからほとんど完璧といってもよい処理精度です。なので高精度リニアフェイズSRCによる音の差は、耳での聴き比べは出来ないレベルにあるといっていいと思います。
重要なのはSRCのアルゴリズム次第になると思います。世の中には耳で判別できるレベルの劣化を伴うSRCもありますので、そのようなSRCがリサンプル処理の評判を落としているのだと思います。
http://src.infinitewave.ca/
レス一覧
-
cricketさん、こんにちは。
コメントありがとうございます。古い記事でも紹介しているMinimum phaseフィルタは位相ズレによって音が変わるので、味付けや付加要素としても面白いと思っています。iZotopeはMinimumと同等のフィルタを選択可能なようですね。理屈ばかり書いていますが、その反面音が良ければいいよねってアプローチも私はありだと思っています。感性と理論の両立は非常に難しいですけれども、バランスを取れるようになったらいいなといつも思っています。
そしてご紹介いただいた話で興味深いと思ったのはこちらです。
>また、通常変換後バッファリング再生するものとリアルタイム変換ですと、後者がかなり不利になると感じています。
これは実際に前者と後者間で音質の変化があったという体験談でしょうか。実は私も自作での話として、SRCの最終動作サンプリング周波数でによって音質が変化するという事実を経験しています。上記のようにSRCそのものによるデジタルデータ上での変化は殆ど無いはずですが=実機での音質変化がない、とは簡単にいかないのが問題を難しくさせていると思います。
例えば、ビットパーフェクトのプレイヤー+デジタル伝送路を使っていても再生ソフト、使用ドライバ、デジタルケーブルによって音が変わるのは体験されていると思います(過去記事で記載されていたMacの機種ごとの違いも同じかもしれません)。もちろんDAC側が十分なジッター対策をしている場合でもです。測定上は変化はないのですが。これは非常に不思議な点です。
総合的に考えると、SRCそのものが音質の変化要因ではなくて、SRCの動作によって機器に電気的な影響があるということではないかと考えています。要するに音質に影響を与えるのは電圧やGND等、他の電気的要因だということではないかと。特にリアルタイム時にのみ音質が劣化するという話だとSRC動作によって電気を使う=電源に影響を与えているとも考えられそうです。
byyohine at2013-12-02 12:41
-
cricketさん、こんにちは。
やはりそうでしたか。体験談参考になります。私もFlacとWav等の音質差を感じたことはあります。ドライバによる差も結構大きいですね。しかしPCから光による伝送+ジッター対策したDACでもPC側の処理によって違いがでるのは電気的接続が完全に切り離されているので不思議に感じるところです。最後に残った接続ポイントである電源コンセント経由で影響があるのかな等と考えたりもしますが。これは余り根拠はないですね。
ちなみに電源コンセントはなかなか無理ですが、基板設計上で他の素子の電源ノイズの影響を受けにくいように設計することはいくつか手法がありますね。基板上で安易に電源を共有すると大きく影響をうけやすいはずですが、このあたりはメーカによって方法は様々かもしれません。例えばResonessence LabsのDACはガルバニックアイソレーションによって各部を絶縁している、とあります。これはパルストランス、フォトカプラ等を使ってデジタル信号を絶縁しつつ伝達しているということだと思います。
byyohine at2013-12-05 13:59
-
yohineさんこんにちは
たかじんさんのブログのコメントに触発されて
いままで知らないままにしていたJTESTについてAP社の資料を読んで勉強しました。
それをふまえてyohineさんの実験結果を見て気が付いたことがあります。
>調査によると目安として、11.025kHz信号を基準として-50dBで約100ns、-70dBで約10ns、-90dBで1ns、-110dBで100ps、-130dBで10psというような値らしいです
私もAP社のTN23の(8)(9)式と15ページの最後の例をまねして電卓で計算しましたが
片側側帯波が-50dBのとき64ns・・・となりました。
yohineさんは片側側帯波のレベルを読んだ値を両側に換算するのに+6dBしていませんか?
sqrt(a^2+b^2)なのでa=bなら+3dBです。
またWM8741はスイッチドキャパシタDACなので(8)(9)式はちょっと修正されて
(12ページjitter induced amplitude modulationの項より)
Rssb=20log10(J*(ωi±ωj)/4)というふうになると思うのですが
DIX9211とCS8416の実験結果はそれに合わないので不思議です。
あとWM8741のデータシートにあるTHDスペックは20kHzLPFを通しているので96k以上のときも帯域幅は同じです。
つまりTHDなのかTHD+Nなのかはわかりません。
byhen at2014-01-05 10:44
-
henさん、こんばんは。
こちらでも色々とご指摘ありがとうございます。探してみたのですが今はリンクしていたオーディオプレシジョンの資料の日本語版はなくなってしまったようで残念です。
本当は追加検証が必要な内容なので、ちゃんと検証してから改めてご回答したいところなのですが、今資料がないので正しいのかどうかわかりません。ジッターの数字は海外から引用したデータだったので、引用元がそもそも間違いだったのかもしれませんね。
測定のWM8741のデータシートはフィルタ込みでしたか。そうなるとどうなのかわからないですが、他に信頼できそうなデータだとStereophileのKlimaxの測定値です。これをみる限りWM8741がTHDの限界は高くないのは間違いないと思っています。
またお気づきの点がございましたらばよろしくお願いします。
byyohine at2014-01-07 23:26
レスを書く