高音質ラズパイ用DACの設計と製作
概要
ラズパイ用の高音質DAC(msBerryDAC)を開発しました。対応機種は次のとおりです。
- Raspberry Piシリーズ
- Raspberry Pi Zeroでの動作報告もあります。
購入は取扱店からお願いします。
ラズパイ用の高音質DAC(msBerryDAC)を開発しました。対応機種は次のとおりです。
購入は取扱店からお願いします。
Twitterで以下のように発言をしたら、案の定、あまり理解されなかったので頑張って説明してみます。
サンプリング定理は「信号の最大周波数」の2倍より早い速度でサンプリングすれば元信号の情報は完全に再現できる(一意に決まる)、とは言ってるけども、サンプリングしたデータをそのまま再生したとき元波形が再現できるとは一言も言ってない。
https://twitter.com/nabe_abk/status/777874934424940544
なおこの記事では、フーリエ変換が存在する連続信号(関数)のみを考えることにします。
同じテーマで以前書いた記事もありますが、新たに書きなおしです。
ジッターとは、クロックのタイミングの「ゆらぎ」のことです。
例えばいわゆるノイズは信号に対する信号以外の信号のことを表しますが、ジッターはクロックが本来持つべき時間精度に対する「ゆらぎ」(時間軸のノイズ)として捉えることができます。ジッターとはクロックとクロックの間の時間ゆらぎ(位相雑音)のことです。
上のグラフはどちらも同じ5Hzのクロックですが、ジッター(量)がまったく異なります。
音をデジタル化してパソコンやCDなどで扱ったり再生するためには、DACやADCといった処理が必要になります。これらの処理では「アナログの信号を一定時間ごとにデータ変換」することで実現しています。この「一定時間ごとに」というのがとても重要で、これが狂ってしまうと再生する波形が歪んでしまいます。すなわち、なるべくジッターのないクロックを使用しないと波形が歪んでしまうことになります。
DAC/ADCにおいてクロックの精度が音質に影響することはよく知られていますが、発振周波数安定度(ppm)が良ければ音が良いという風潮がかなり強くあります。
それはクロックを「TCXOに載せ変えて音が良くなった!」という記事が多数あったり、市販製品でもクロックの安定度(ppm)の低さをセールス要素として語っているものが多くあるためでしょう。
クロックは「発振器」などで生成されますが、通常は水晶が使われます*1。通常の水晶発振器をXOといい、温度補償付水晶発振器をTCXOと言います。前者の周波数安定度は50ppm程度なのに対し、後者は2.5ppm程度*2と10倍ぐらい高精度になっています。
そのような状況でTCXOは好んで使われているのですが、理屈上はジッター低減のためにTCXOを使うのはあまり意味のない行為です。なぜなら、周波数安定度(ppm)は「ある期間(例えば1秒間)のクロックの個数を補償している」だけでジッターとは何の関係もありません。最初の図で見たとおり、ある期間のクロックの個数が一定でもジッターの量はいくらでも変化します。
しかしながら、全く無意味というわけでもないようで、TCXOが周波数(クロック数)を補償するための仕組みや回路が、結果としてジッターを低減している可能性が大いにあるようです。
ちょうど手元にPCM2704 DACが2台あるので、同じPCに同時に接続して試聴してみました。手前のDACがクロックを載せ替えている方で、奥が標準の回路になります。*3
以前比較したHC53は消費電流が多すぎて比較にならなかったので、消費電流が数mAの(FOX924Bと大して変わらないもの)を選びました。また電源を差し替えたりすると音が安定しないので、交換後しばらく鳴らしてから音質を比較しました。
標準のクロックです。非常に綺麗な音がします。以下、これを基準とします。
低ジッタでNZ2520SDより評判も良い京セラKC7050Kのサイズ違いです。
標準のFOX924Bに肉薄する音質です。ただし、FOX924Bに比べるとわずかに音の広がりが弱く、そしてやや音が濁る印象があります。
KCxxxxBというシリーズもありますが、こちらはジッタ性能が落ちます。試しに乗せて比較してみましたが、FOX924Bに比べると音がザワ付きます。*4
FOX924Bと同じ±2.5ppmのTCXOです。FOX924Bと異なりジッタノイズが規定されていますが、KC3225Kと比べるとだいぶ劣る数値になっています。
音質はFOX924Bと同じ。違うと思って聞けば違う音のような気もしますが、もはやプラシーボの域を出ない印象で、同じと言って差し支え無いと思います。
水晶ではなくMEMSと呼ばれる半導体発振器です。MEMS素子といえば加速度などのセンサーで使われていたのですが、最近はMEMSの発振器というものが登場し、安価でありながら±10ppmと水晶を上回る性能を発揮しています。
期待の音質です。FOX924Bよりも空間表現に優れますが、音の綺麗さは少し劣ります。2.5ppm精度のTCXOはただ高いわけではない(苦笑)
しかし、手ハンダするには一般的な発振器の何倍も難しい構造(パッド)になっています(汗)
安価ながら20ppm/3.2psのXOです。ちょっと大きかったのですが無理やりつけてみました。
音質ですが、FOX924BどころかKC3225Kより劣ります。平面的な音の鳴り方で、よくある水晶発振器(回路)によるクロックという印象でした。
PCM2704がPLLと呼ばれる回路を内蔵し外部クロックを基準としてDAC再生クロックを内部生成しているためか、ジッタ性能の影響は少なく周波数安定度のほうが影響が大きいという結果になりました。*5
ただ20ppmでも音の悪い水晶発振器とか、2.5ppmのTCXOよりMEMS素子の10ppmが優れた音質を示したのは一見すると矛盾です。
そんなわけで「TCXOは標準の水晶発振器に、逆特性の温度補償回路を付けたもの」であるので「内蔵されている素子単体の性能としてはMEMS素子のほうか優れるのではないか」という仮説を立ててみました。
温度補償回路は、-30度から+85度という大きな温度領域でのずれを補償するためのもので、通常クロックを使用するほとんど温度変化がない状況においては補償回路よりも素子性能がものを言うのではないかという考察です。同様に、そのようなほぼ一定温度条件下での「クロックのずれの少なさ」は、素子性能が大きくものを言うんじゃないかと考えています。
以上、戯言みたいな仮説だと思っておいてください。
追加検証をするとしたら、PLLを内蔵しない単体DACに24.576MHzなどのクロックを直接与えて検証してみたいところです。その際は、0.28ppm精度のTCXOも含めて。
PLLを内蔵しないPCM5122に直接クロックを与えて試験してみました。使用クロックはすべて24.576MHzです。ASDMBは上に述べた、ASEMBの単なるサイズ違いです。
結果は「ASTX > ASDMB > KC2520K」。KCxxxxKはPLL内蔵DACの時も感じましたが、音が少し荒っぽいです。中域が少しカサ付く感じがします。ASDMBは安定して綺麗で、ASTXは空間再現などが一枚上という印象でした。
しかしPLL内蔵DACと比べると、クロックによる音質差は少なく感じます。もしかすると、PLLって百害あって一理なしなんじゃ(苦笑)
やはりMEMSのほうが良かったです。KC2520Kは音が平面的で少しカサつきますね。
同じ25ppmのSIT8008ACとASDMBを比較すると、ジッターの影響なのかASDMBのほうが音が綺麗に感じました。僅差というよりは、ちゃんと分かる差がありました。
PLL内蔵DAC(もしくはPLL付きDAC回路)において。
PLLなしDAC(PLLなしDAC回路)において。
いくつも試聴したわけではないのでなんとなくの印象でしかありませんが、(同シリーズのクロックならば)ppmの精度が上がると音が綺麗になり、ジッタの性能が良くなると空間表現が広がる感じがしました。
繰り返しになりますが、周波数安定度(ppm表記)が優れているものが音質が優れているわけではありません。
低ジッター、短時間(1秒以下)におけるクロックのゆらぎが少ないものが音質が優れています。
長時間でのクロックの周波数安定度を元に音質を議論しているものが稀に見られますが、あれは論外です。ご注意下さい。
同一型番(同一シリーズ)を比較する場合においては、周波数安定度が高い(ppmの数値が低い)クロックの音質が良い(ジッターが少ない?)ことが経験上知られていますが、本来は何も関係はありません。
上記サイトはとてもよく分析された優れた記事ですので、ぜひ参考にしてください。NZ2520SDは入手が面倒なので試してませんが、このサイトやネット上の評判を読む限りKC2520K(=KC7050K)よりも劣るようですので、まあ良いかなと。
※この記事で扱っているVolumio(Ver1)は古いものです。音質云々以外の、設定情報などすべて古い情報になります。
Raspberry Pi用I2S DACを買ってみました。
外部クロック動作のオリジナル設計ラズパイ用DAC頒布中です。音質に拘った設計になっています。HiFiBerry DAC+ PROよりよっぽども音質良いです。
I2SとはDACチップを動作させるための通信規格でラズパイにはI2Sを直接出力する機能が存在します。ラズパイ用のI2S DACは色々発売されいて、国内でも既にいくつかでていますが、そのほとんどが水晶クロックを搭載していません。
というのも「ラズパイのI2S出力」はシステムクロック(SCLK)と呼ばれる「22.5792MHz」や「24.576MHz」のクロックを出力する機能がありません。ほとんどのラズパイ用DACは、BCLKと呼ばれる1bitごとのデータ出力クロックからシステムクロックを生成しています。
PCM51xxのような特殊なDACチップを使用したボードは存在するのに、PCM179xといったよく使われるDACチップを使用したボードが存在しないのはそのためです。
またこのBCLKについても、クロックタイミングが一定ではないことが知られています。再生速度が狂う代わりに、このクロックタイミングを一定にするというパッチも同じサイトで公開されていますが、それはそれで(音が高くなったり低くなったりする)問題があります。
あまり知られていないことですが、ラズパイのI2Sには外部クロックに同期してデータを出力するモードが存在します。説明すると大変なので詳しくはSND_SOC_DAIFMT_CBM_CFMでググってもらうとして、要するに「ラズパイにSCLKを与えるのではなく、ラズパイにBCLKやLRCLKを与えそれに同期してデータを出力してもらう」ことで、完全に正しいクロックでI2Sデータを出力することができます。
そのような機能を持つ製品として「HiFiberry DAC+ PRO」というものが存在します。
公式サイトからカートに入れて、日本国内の住所を普通に(ローマ字で)入力するだけで手に入れることができます。送料も「たった$8」ですので、6000円ぐらいで購入できました。
注文から1週間ぐらいで届きました。
このDACはラズパイのモデルB用です。手持ちのRaspberry Pi2 BにVolumio 1.55をインストールして早速使用してみました。
「HiFiBerry +」を選択して早速音を再生。
……
…………
……………………なにこれ、超気持ち悪い!
音質がどうのとかそういうの以前に、揺らいでるのか、歪んでるのか、とにかく気持ち悪くてしょうがない。これはおそらくラズパイの歪んだI2Sクロックが原因です。実はHiFiberry DAC+ PROを「Volumio Ver1.55」などで使用した場合、外部クロックは有効にならないのです(参照)。*1
2016年2月時点でラズパイ用DACで外部クロックを使用しているものなんてほぼ流通してませんから、今現在ネットにあがってるラズパイ用DACの感想は、ほとんどがこの狂ったI2Sによる再生によるもので……。
よくこんなのありがたく聞けますね!(笑)
やー、ほんと、音が狂ってるせいでリアルに吐き気してきました……。こんなん聞くならPCM2704で音質のいいDACのほうが100倍も良いです。
※注意:Volumio2等の最近のディストリビューションははじめから対応しています。この項目の情報は古くなっています。
VolumioというかHiFiBerry DAC+のドライバを更新すると、HiFiBerry DAC+ PRO対応になり、外部クロック再生ができるようになります。
Volumioが起動中のラズパイにsshで接続します。
ID: root
Pass: volumio
この後コンソールでカーネルのアップデートを実行します。
# rpi-update
なお、RaspbianやRaspbianベースの他のイメージでも、rootからrpi-updateで対応ドライバをインストールできるかと思います。
この項は直接関係ないので、あとで別記事に移す予定。
Volumioを転送した状態では、SDカードの空き容量が無駄になっていますので、この部分を使えるようにします。
# raspi-config
コマンドを実行して「1 Expand Filesystem」を選択すれば、勝手に拡張してくれる……はずなのですが
Your partition layout is not currently supported by this tool. You are probably using NOOBS, in which case your root filesystem is already expanded anyway.
と怒られてしまいます。Volumioのパーティションの切り方をRasbianと変更してあるらしく、うまく行きません。
/usr/bin/raspi-config を編集します。
if [ "$PART_NUM" -ne 2 ]; then whiptail --msgbox "Your partition layout is not (略)" 20 60 2 return 0 fi
「-ne 2」の部分を「-ne 3」に書き換えてから「raspi-config」を実行してください。うまく行きます。
まず、sources.listのdeb-srcが狂ってるので修正します。修正しなくてもあまり問題はないのですが気持ち悪いので。
# vi /etc/apt/sources.list deb http://mirrordirector.raspbian.org/raspbian/ jessie main deb-src http://mirrordirector.raspbian.org/raspbian/ jessie main
そのままシステムをアップグレードします。20分ぐらいかかります。
apt-get update apt-get upgrade apt-get dist-upgrade
config.txtに以下を設定。
hdmi_drive=1
/boot/cmdline.txt に以下を設定。
consoleblank=0
apt-get upgradeしないなら /etc/kbd/config も修正。確認は以下。
cat /sys/module/kernel/parameters/consoleblank
apt-get install rng-tools
mkdir /lib/firmware/brcm/ cd /lib/firmware/brcm/ wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.bin wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.txt reboot ifconfig wlan0
APモードで動作させる場合、チャンネルを6に設定しないと安定しないようです。
hoatapd.conf
interface=wlan0 driver=nl80211 hw_mode=g ssid=SSID # for Realtek 8192 (USB/rtl8192cu) #channel=1 # for Raspberry Pi 3 WiFi (BCM43430) channel=6
Linux 4.4.15-v7+現在、ドライバが未成熟なのか不安定。しっかりとした電源を用意しないと安定しない模様。
「rpi-update」後に再起動してもう一度再生してみます。今度はきちんと外部クロックを使用した再生ができました。
さっきまでの音が嘘のように、とても綺麗な音です。
基板上の役割は以下のようになっています。
主要部分の回路接続は以下のとおりです。
HiFiBerry DAC+には、通常の「HiFiBerry DAC+」と「HiFiBerry DAC+ PRO」が存在しますが、その判別は次の方法で行っています。
この3つの条件をすべて満たしたとき、HiFiBerry DAC+ PROボードとみなし、外部クロックを使用するようになります。