ラズベリーパイのI2S出力にMCKを加えてみよう

shapeimage_1-43

Raspberry pi3でミュージックプレーヤー4

前回までの作業で、ラズベリーパイの周波数補正停止クロックと外部クロックの比較が可能にはなりましたが、残念なのがMCKです。
ラズパイから出力されるI2SにはMCKがないので、 比較するにはどちらもES9023のASRC(非同期MCK)経由になってしまいます。
つまり、ある程度性能差が詰まっていると、クロックの外部/内部の違いより、DACのASRCの性能が支配的になっている可能性があります。
ということで、今回はMCKを作って同期MCKでの再生にチャレンジしてみます。

MCKを作る方法としては、ラズパイの空いているシステムクロックからソフトウエア的に作って空いているGPIOポートから出力するか、BCK、LRCKを外部でハードウエア的に逓倍して作るかになりますが、個人的にソフト対応は無理ですのでハードウエアで行きます。
(ソフト的に作られている方もいらっしゃいます。)
ある意味力ずくですので「無理やりMCK」とでも呼びましょうか。。(笑)

使うのは周波数マルチプライヤIC(周波数逓倍器)、IDTのICS570Bです。
このICはハードウエア制御で、ピン2つの電圧で倍率を指定できるため、倍率固定なら余計な制御ロジックも要りません。
同じようなハード制御のマルチプライヤICで、オンセミのNB3N2302も使えそうでしたが、ICS570の方がカタログスペックのサイクルtoサイクルジッターが小さかったので今回はこちらを選択しました。

MCKは128fs〜768fs(サンプリング周波数の128〜768倍)が必要です。
ラズパイから出力されるBCKが64fsですので、これを2〜12倍してあげればよいですね。
(実は後になってから、16bitのファイルだと32fsになっちゃって解決まで時間がかかる話が出てきます。)
ICS570Bの動作最低〜最高周波数範囲とサンプリング周波数の範囲、MCKで使える周波数の範囲すべての組み合わせで考えると、4倍か6倍で44.1〜192kHzサンプリングまで固定倍率でカバーできそうです。

ラズパイのGPIO脇に基板を重ねる感じで配置して最短ラインで配線してみました。
倍率はショートピンで変えられるようにしておきます。
shapeimage_2-21

ついでにMCKの差替えが楽なようにHiFiBerryのMCKを中継するピンも立てておきます。

配線が終わって動作確認してみたところ、4倍(256fs)だとなぜか44.1kHサンプリング時に出力が安定しません。(入力下限周波数に近いとは言え限界突破してるわけではないのですが。。)
また、8倍(512fs)だと192HzでICの限界越えのはずですが、ノイズが出ながらも動作しているという謎な状況だったりします。
試験用信号以外の192kHzソースは持ち合わせていないので8倍でもいいのですが、6倍動作なら44.1〜192kHzまでちゃんと動作していますので今回は6倍(384fs)でつかうことにしました。

「無理やりMCK」でES9023同期MCK動作による、LightMPDとラズパイ補正停止クロック、LightMPDとラズパイスレーブ(外部クロック)、Volumio2とラズパイスレーブ(外部クロック)の比較が可能になりましたので、早速確認してみます。

機能(性能)的にはラズパイスレーブ動作においてLightMPDとVolumio2で差はないはずで、外部クロックと補正停止クロックの違いの方が大きく出るかと思いきや、聞いた限りではLightMPDとVolumioの違いの方が大きく感じ、LightMPD&補正停止クロックとLightMPD&ラズパイスレーブ(外部クロック)の違いは大きく感じません。
なお、あくまでも感覚的に相対比較した場合の話であり、トータルでいえばどちらも違いは極めて小さいものです。
同期MCKと言っても信号として同期しているだけで、ES9023の動作には謎が多く、ASRCを明示的に止められないことから、この組み合わせでI2S出力品質の確認ははここら辺で頭打ちでしょうか。

また、これ以上に信号品質を上げるとなるとジッタークリーナーとかの出番になってきますが、そこまで行くとラズパイのI2S出力(本来のお題)とは関係ないところの話になってきますので、I2S周りについてはここまでにしたいと思います。

なお、ここまでの組合せはこんな感じです。
ss2016-08-25_1

ここから対象外の組み合わせを除外しても
ss2016-08-25_2

結構いっぱいありますね。。

続いてアナログ出力について考えていきます。