構成は、Foober2000=>RME RayDAT=>DE0nano(FPGAボード)=>BuffaloII とDSD64と同じですが、 RME RayDAT=>DE0nano のADATラインを1本から2本に増やし、L/Rチャネル各1本ずつ使用する構成になっています。
再生ファイルは、AudioGateでDSD128に変換し、その後YUKI-SAN の DSD to PCM ConverterでMSB8bitのDSD Marker 0x06 and 0xF9のDoPファイルへ変換したものです。
DoPをADATでの DoP DSD128のチャネルマッピングと受信後のフォーマット変換 の図が間違っていたので差し替えましたが、LchとRch交互にマージ剃る必要があるため、ADATの場合、Lch 4sample Rch 4sampleという順で並んでいる場合、32bitにマージするには、4sample分保持しておく必要があります。回避するために、メモリへの書き込みをUpper側16bit(Lch)とLower側16bit(Rch)を個別に行うことにしました。
DoP DSD128のチャネルマッピングと受信後のフォーマット変換(改)
上図のようにADATの通常Lchに当たる部分は、アドレスをインクリメントしながらバッファメモリ32bit中Upper側には書き込み、その後Rchに当たる部分は、アドレスを4つ戻してバッファメモリ32bit中Lower側に書き込むようにしました。
DSD64時も同じような制御になるように変更しました。
ADAT DoP DSD128再生時のSignalTapII波形
上図、青○が、AES/SPDIF等DSD128の帯域を1本ではカバーできない伝送ライン時用のDoPのDSD Marker 0x06 and 0xF9でその下の緑枠および水色枠がDSDデータです。2本のADATのDSD Markerは同じパターンが現れています。
Upper側とLower側16bitに同じデータを用意し、byteenableでUpper側かLower側のどちらか片方のみ書くようにしています。図はUpper側書込が終わりLower側書込に移ったところになります。
一番下の3つがDSD出力で、BCLKがDSD64時よりも半分の変化点になり、LRCK(DSD Lch)とSDATA(DSD Rch)もそれに合わせて変化しているのが見て取れます。
Bunpeiです。
返信削除とても高度なことをやっておられますね。
この方法を拡張するとDSD256も可能ですか?
Bunpeiさん こんにちは。
返信削除DSD256もやろうと思えばできます。
しかしADATのラインを4本要します。クロック同期にリターン1本も使用しているので、都合5本必要になります。
また、DSDIFF=>DoP変換ツールが対応していないので、対応してもらう必要もありますので直近での対応は考えていません。
別になりますが中断中のSDカードプレイヤーでDSD再生も考えているので、こちらが軌道にのればDSD256も考えています。
しかしここまでするなら、ファイルサイズもかなり大きくなるので元ファイルがDSD64であるならFPGAでアップサンプリングしたほうが良いかもしれませんね。PCMなら簡単にできますが、DSDの場合のアップサンプリングアルゴリズム自体知らないですが...
Bunpeiです。
返信削除DSDのアップサンプリングのアルゴリズムは浮動小数点数演算を含むようでFPGAでは無理でDSPが必要だと思われます。KorgのMRシリーズにはBlackfinが使われてますね。
ところでES9018のDSD256を一度聴いてしまうと後戻り出来なくて困りものです。
そうですか。やはりPCMのようにはいかないようですね。
削除浮動小数点演算がFPGAで全く出来ないかというと、出来るようですし演算によってはDSPよりも性能を出せるはずですが、信号処理自体が専門外なのでとても歯がたちそうもありません。
FPGAの浮動小数点演算について検索して見つけた記事です。 http://ednjapan.com/edn/articles/1109/22/news111.html
Bunpeiです。
返信削除私も詳しいことはわからないのですが、おそらくDSD->PCM変換、補間演算、PCM->DSD変換が必要になると思われます。AudioGateでDSD 2.8MHz -> DSD 5.6MHz変換をやっているとき、PCM->DSD 5.6MHz変換よりも時間がかかるのでおそらくそうではないかと思います。
このサイトにDSD->PCM, PCM->DSDの簡単なC言語プログラムが公開されております。もし既にご覧でないならば、ご参考になさって下さい。
http://sites.google.com/site/koonaudioprojects/dsd-playback-system
補間演算のためには、元の波形イメージにしてからということになるようですね。精度をより高くするには、sampling rateは2.4MHzのまま、分解能も32bit以上なども考慮が必要そうでし、AudioGateで時間がかかるのも精度を保って処理しているのかもしれまんね。
削除ご紹介のサイトは知りませんでした。
私の場合光で考えているところが、USBであること(クロックも?)以外は、同じ事を目標としておられるようで、色々参考になりそうな情報がありそうです。DSDアンプというのも面白そうです。
DSD->PCM, PCM->DSDの簡単なC言語プログラムについては、簡単には追えそうもないですが、うまくFPGA化できるようなら、DSDについてもFPGAでチャネルデバイダが実現できることになるので、将来的には検討してみたいですね。
んと、どこでよんだっけな…
返信削除DSD 2.8MHz 1bit -> 2.8MHz 16bitとか24bitとか(欲しいビット数)に拡張 -> デシメーションフィルタでターゲットのサンプリング周波数に変換
ってやるとDSD->PCM変換がでけるようです。フィルタ演算だけなので、DSP処理は楽なはず。
PCM->DSD変換も同じで、2.8MHzのサンプリング周波数に一旦デシメーション変換かけてやって、後はビット数を1bitに落としこむ、とか。
#なので、PCMのまま強引にデータを流しこむと音質悪いが鳴る、って話になります。
結局はデシメーションフィルタをどうかけるか、後はその処理メモリ量がでかくなっていくと、実装ロジックによってはキャッシュに収まらなくなっていくので、IOで時間が伸びて行く、って話ではないかと思います。
44.1kHz系列はDSDとサンプリング周波数と親和性が高いので変換がしやすく、48kHz系は面倒だなぁ、と前に考えた時に思った記憶が…
DSDの信号処理で48kHz系のことは考えないで良いので比較的簡単そうですが、フィルタの設計自体の経験がないので.... まあ気長に取り組みます。
返信削除Bunpeiです。
返信削除AudioGateでPCMの48,96,192のソースから48kHz系のDSD64,DSD128,DSD256のソースを作ってexaU2Iに流したら問題なく再生出来ました。
うちのexaU2Iは壊れたみたいでPCから認識できなくなっています。多分USBボードが壊れているのだと思うのでそのうち交換しようと思いつつそのまま放置状態で...
削除DSDの信号処理で48kHz系のことは考えないで良いので比較的簡単そうですと書いたのは、DSD64/DSD128/DSD256間であれば44.1kHz系同士の周波数変換であるので変換時の誤差が出にくいのでという意味で書いています。
Bunpeiです。
返信削除ちょっと細かい点にこだわる話ですみません。
hiyohiyoさんの話の中のデシメーションフィルターについてですが、DSD->PCM変換に用いられるのは、ElectrArtさんの製品にもあるようにデシメーションフィルターという言葉で正しいと思います。しかし、PCM->DSD変換の処理の場合は、普通⊿∑モジュレータ(DSM)といい、デシメーションフィルタとはいわないのでは?デシメーションの言葉の意味はオーバーサンプリングの逆で、日本語でいうと「間引き」に相当するものですから。PCM->DSD変換の場合は64倍以上のオーバーサンプリングですね。
ところで⊿∑モジュレータの構成方法は一通りではなく、それぞれ特性を工夫したモジュレータによるPCM->DSD変換の結果は、一般に異なると思っていればよいのですね。
おっと、失礼いたしました。
削除どっかでDSD/PCM変換といっても結局はサンプリング周波数(とビット数)の変換だよ、という説明を読んでいたので
DSD->PCMでもPCM->DSDでもやってる事は似たようなもの、と考えていました。
で、サンプル周波数の変換をデシメーション変換と…、だがデシメーションは間引きだからダウンサンプルにしか使えないのですね。
変換系は色々工夫がかけられるので、それの実装次第で音が変る、で良いかと。
今一般公開されてて使えるのは、1つ(多分AudioGate)しかないねぇ、みたいな話がどっかに書いてありました。