新規会員登録の際、X(旧Twitter)のフォローやメッセージをご確認頂けず、登録保留の方もいらっしゃいますので、Xへログイン頂きご確認をお願いします。

WM8805ソフトモードで44.1k~192kに対応する方法

日記・雑記
Sponsored Link

最近久しぶりに自作界隈の記事をネットで調べてみたら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/

コメント ※編集/削除は管理者のみ

タイトルとURLをコピーしました