2010年12月31日金曜日

当面の予定

 目標としては、今年中には完成させるつもりでしたが、実際は大晦日になっても半分も実現できていない状況となっています。当初案より大分変わってしまっているのもありますが、FPGAの論理設計とデバッグ、基盤の部品選定、調達作業には、やはり結構時間がかかりそれが大きいかなと思います。

 今後の当面の予定として、下記を早期に実現させたいと思います。

 ・SDRAMバッファモードの組み込み
    現在、回路作成、コーディング中 1/9あたりには動かしたい。

 ・TOS 192kで接続
    SCD-XE600は192kでしか出力してくれないので早めになんとかしたいので

 ・DSD受信回路/送信回路
    受信回路自体はできたので、SDRAMバッファモードでBuffaloIIにつなぎこんで鳴らしてみたい。
    エレアトさんのブログを見て"ベートーヴェン/交響曲第6番ヘ長調
    作品69 「田園」・「エグモント」序曲作品84 [SACD Hybrid + DVD-ROM]"も発注したので、
    5.6448MHzもできれば。

 ・I2S-LVDS-HDMI入手

    IO基盤の作成はまだまだかかりそうなので、Fidelix I2S-LVDS-HDMIをCaprice-I2Sとの接続用に入手

 ・mbed I2C制御とPC通信手段   
    BuffaloIIとFPGAの制御の制御ができるように

 ・FPGAのI2C受信回路
    そろそろスイッチだけでは、制御しきれなくなってきたので



  MR-1
 直接は関係ないですが、Korgの1bitモバイルレコーダーMR-1が結構安売りしているので、ポチってしまいました。

  FLAC
 それからPCMについては、基本waveファイルで保存していましたが、管理が面倒になってきたのでFLACに移行させようかと考え中。(システム構成図を修正)

 それでは、良いお年を...

2010年12月29日水曜日

DSD Phase Modulation Mode 受信回路

 DSD Phase Modulation ModeのデータをBCKを使用せずに、DSDdataのエッジを利用して受信しSignalTapIIにキャプチャする回路の回路図とSystemVerilogのコードです。片チャネル分。
 この回路をベースにI2S、ADAT、S/PDIF受信回路にDSD受信機能として統合する予定。片チャネル分のため、2回路化、L/Rの多重処理が追加で必要になります。現在サンプリングクロックとして98.3040MHzを使用していますが、90.3168MHzに変更します。

     DSD Phase Modulation Mode 受信回路構成


DSD Phase Modulation Mode 受信回路 SystemVerilogコード
   

`timescale 1ns/1ns
module DSD_capture(

  input  wire          m_clk,                 //sampling clock 98MHz
  input  wire          resetN,        
 
  input  logic         dsd_in,                //DSD_L or DSD_R input
 
  output logic         dsd_out,               //DSD monitor out
  output logic         dsd_alt_out,           //DSD monitor out alt
 
  output logic         cap_clk,               //SignalTapII capture sampling clock
  output logic         dsd_cmp,               //DSD and DSD alt inv compare
  output logic         dsd_5apat              //5A5A5A5A pattern match
);

 logic [3:0]  sdata_input_shift;
 logic     edge_detect;

 logic [5:0]   dsd_inc_word_time = 6'h0;
 logic     fw_window_clr;
 logic     fw_window;
 logic     hw_window;
 logic     fw_edge_det_flg;
 logic     fw_edge_det;
 logic     fw_edge_nodet;
 logic     hw_edge_det_flg;
 logic     hw_edge_nodet;

 logic    bit_clk;
 logic    bit_clk_mask;
 logic    alt_bit_clk;
 logic    alt_bit_clk_mask;

 logic    cmp_ini_flag;

 logic [31:0] dsd_data;
 logic [31:0] dsd_data_alt;

 logic [4:0]    capture_counter;

 
 enum {synclos=0,presync1 =1,presync2 =2,presync3 =3,presync4 =4, sync =5, fwprtect =6 } State, NextState;
 

//// dsd input section ////  
//shift_adat_input :
   always_ff @(posedge m_clk)
      sdata_input_shift <= {sdata_input_shift[2:0] , dsd_in};

// detect_adat_sync :
   always_ff @(posedge m_clk)begin
      if ((sdata_input_shift[2:1]==2'b01) || (sdata_input_shift[2:1]==2'b10))
         edge_detect <= 1'b1;
      else
         edge_detect <= 1'b0;
   end

   always_ff @(posedge m_clk)begin
      if (edge_detect==1'b1 && State == synclos)   dsd_inc_word_time <= '0;
      else if(edge_detect==1'b1 && fw_window == 1) dsd_inc_word_time <= '0;
      else                                         dsd_inc_word_time <= dsd_inc_word_time + 1;
   end

// edge detect window
   assign fw_window_clr = (dsd_inc_word_time==6'd02)  || (dsd_inc_word_time==6'd37) ;
   always_ff @(posedge m_clk)begin
      if (dsd_inc_word_time==6'd32)      fw_window <= '1;
      else if(fw_window_clr)             fw_window <= '0;
   end

   always_ff @(posedge m_clk)begin
      if (dsd_inc_word_time==6'd15)      hw_window <= '1;
      else if(dsd_inc_word_time==6'd20)  hw_window <= '0;
   end

// fw_edge_det & hw_edge_det
   always_ff @(posedge m_clk)begin
      if (fw_window && edge_detect)      fw_edge_det_flg <= '1;
      else if(fw_window_clr)             fw_edge_det_flg <= '0;
   end

   always_ff @(posedge m_clk)begin
      if (fw_edge_det_flg && fw_window_clr)   fw_edge_det <= '1;
      else                                    fw_edge_det <= '0;
   end
 
   always_ff @(posedge m_clk)begin
      if (! fw_edge_det_flg && fw_window_clr) fw_edge_nodet <= '1;
      else                                    fw_edge_nodet <= '0;
   end
 
 
   always_ff @(posedge m_clk)begin
      if (hw_window && edge_detect)      hw_edge_det_flg  <= '1;
      else if(dsd_inc_word_time==6'd20)  hw_edge_det_flg  <= '0;
   end

   always_ff @(posedge m_clk)begin
      if (! hw_edge_det_flg && dsd_inc_word_time==6'd20) hw_edge_nodet <= '1;
      else                                               hw_edge_nodet <= '0;
   end

// Sync State Control
   always_ff @(posedge m_clk, negedge resetN )begin
         if(!resetN)                                            State <= synclos;
         else if(m_clk=='1)                                     State <= NextState;
      end           

   always_comb begin
      case (State)
         synclos:begin
                if(hw_edge_nodet)                               NextState = presync1;
                else                                            NextState = synclos;
            end
         presync1:begin
                if(fw_edge_det)                                 NextState = presync2;
                else if(fw_edge_nodet)                          NextState = synclos;
                else                                            NextState = presync1;
            end
         presync2:begin
                if(fw_edge_det)                                 NextState = presync3;
                else if(fw_edge_nodet)                          NextState = synclos;
                else                                            NextState = presync2;
            end
         presync3:begin
                if(fw_edge_det)                                 NextState = presync4;
                else if(fw_edge_nodet)                          NextState = synclos;
                else                                            NextState = presync3;
            end
         presync4:begin
                if(fw_edge_det)                                 NextState = sync;
                else if(fw_edge_nodet)                          NextState = synclos;
                else                                            NextState = presync4;
            end
         sync:begin
                if(fw_edge_nodet)                               NextState = fwprtect;
                else                                            NextState = sync;
            end
         fwprtect:begin
                if(fw_edge_nodet)                               NextState = synclos;
                else if(fw_edge_det)                            NextState = sync;
                else                                            NextState = fwprtect;
            end
      endcase
   end


//bit_clk gen :
   always_ff @(posedge m_clk)begin
      if (dsd_inc_word_time==6'd26 && bit_clk == 1'b0 && bit_clk_mask == 1'b0)
               bit_clk  <=  1'b1;
            else
               bit_clk  <=  1'b0;
   end

   always_ff @(posedge m_clk)begin
      bit_clk_mask  <= bit_clk;
   end

   always_ff @(posedge m_clk)begin
      if (dsd_inc_word_time==6'd09 && alt_bit_clk == 1'b0 && alt_bit_clk_mask == 1'b0)
               alt_bit_clk  <=  1'b1;
            else
               alt_bit_clk  <=  1'b0;
   end

   always_ff @(posedge m_clk)begin
      alt_bit_clk_mask  <= alt_bit_clk;
   end


//dsd data s/p
   always_ff @(posedge m_clk)begin
      if(bit_clk)  dsd_data <= {dsd_data[30:0],sdata_input_shift[2]};
   end

   assign dsd_out = dsd_data[31] ;
  
   always_ff @(posedge m_clk)begin
      if(alt_bit_clk)  dsd_data_alt <= {dsd_data_alt[30:0], !sdata_input_shift[2]};
   end

   assign dsd_alt_out = dsd_data_alt[31] ;
  
//clk_counter
   always_ff @(posedge m_clk)begin
      if(dsd_data == 32'h5a5a5a5a && cmp_ini_flag) capture_counter <= 5'h0;
      else if (bit_clk)                            capture_counter <= capture_counter + 1;
   end

   always_ff @(posedge m_clk)begin
      if(State == presync4)                             cmp_ini_flag <= 1'b1;
      else if (dsd_data == 32'h5a5a5a5a && cmp_ini_flag)cmp_ini_flag <= 1'b0;
   end

//signaltap clk gen
   always_ff @(posedge m_clk)begin
      if(capture_counter == 5'd00 && hw_window) cap_clk <= 1'b1;
      else                                      cap_clk <= 1'b0;
   end

//compare dsd & alt_dad data
   always_ff @(posedge m_clk)begin
      if(capture_counter == 5'd00 && hw_window)begin
         if(dsd_data == dsd_data_alt) dsd_cmp <= 1'b1;
         else                         dsd_cmp <= 1'b0;
      end
   end

//detect dsd data 5a5a5a5a pattern

   always_ff @(posedge m_clk)begin
      if(capture_counter == 5'd00 && hw_window)begin
         if(dsd_data == 32'h5a5a5a5a) dsd_5apat <= 1'b1;
         else                         dsd_5apat <= 1'b0;
      end
   end


endmodule

DSDデータのキャプチャ2

 DSDデータの32bit中のHigh('1')の数を計数する機能を追加してSignalTapIIでキャプチャしてみました。
 
前回、まだ無音区間と考えた32bit中のHの数は、15,16,17bitのいずれかで占めている区間ですが、もしかするとすでに曲が始まっている部分にあたるかもしれません。
 というのは、どうも曲中でも、小音量部では、15,16,17bitが大勢を占めている可能性がありそうだからです。

 初めて”5A5A5A5A"パターン以外が出現したポイント(ほぼ中央の点線部)
(******set_bitnumが32bit中のH bitの数)


Hの個数がはじめて17個が出現したポイント
(左半分はすべて16個(10h))

 上のタイムチャートとしたのタイムチャートは別々に採取したものですが、前回の結果からすると多分上の右半分と下の左半分は、一部は重複している部分になるはずです。
 下のタイムチャートの右半分は、16bitが多数を占めた状態で15,16,17bitのみで構成されています。

32bit中の"H"の個数ですが、どうも演奏中になっても14~18個のパターンしかほとんど出てこない区間のあるソースもあるようです。意外と振れ幅が小さいようで、確認した中では最小は8個、最大は21個ですが、14~18個ぐらいが大部分を占めているように見えます。

32bit中、Hのbit数が9個のキャプチャパターン(点線部)

 無音区間の判別はなかなか難しいのかもしれません。移動平均フィルタをかければ見えてくるのかな?

2010年12月26日日曜日

DSDデータのキャプチャ

 DSDデータの受信回路を作成し、SignalTapIIでキャプチャしてみました。




上から
  1. State:5=同期確立中
  2. DSD受信データ(サンプリングクロックのほうが荒い為意味なし)
  3. ポジ側データを32bitパラレル化
  4. ネガ側データの反転を32bitパラレル化
  5. H:ポジ側とネガ側が一致 L:不一致
  6. H:"5A5A5A5A"パターン L:"5A5A5A5A"パターン以外
     DSDデータキャプチャ波形("5A5A5A5A"パターン以外初出部分)


 大体のところは、すでに某サイトで確認されていますので、追加情報的なところをあげてみます。

 実施手順
 ・同じディスクを①停止=>再生と②ポーズ=>再生の各々2セットをキャプチャ(片チャネルのみ)
 ・トリガ条件"5A5A5A5A"パターンか否かを常時監視し、"5A5A5A5A"のパターン出現でキャプチャ開始
 ・トリガ前512×32bit トリガ後3584×32bitのデータをキャプチャ
 ・cvsファイルにexportし、Excel上で編集・解析

 結果からわかること
 ・DSD Phase Modulation Modeのポジ側(前側)データとネガ側(後側)データの反転したものを比較し不一致がないかを検出する回路をつけたが、すべて一致した。
 これより、適当なジャンパーではあるが、伝送エラーは発生していないとほぼ断定できる。
 
 ・大体5A5A5A5A"以外初出から2500word(4byte)ぐらいのところで4つのキャプチャデータパターンが一致。なぜか32bit整列で比較しているのにすべて一致するという結果に、プレイヤー内では32bitあるいはそれ以上のbit処理であるためと推測する。

 ・5A5A5A5A"以外初出から4つのデータが一致するまでのword数には24word位のばらつきがみられた。もしかするとスタートボタンを押したときとピックアップの位置などが影響しているのかも?
 
 ・キャプチャした4096wordすべてのwordで32bit中の1の数は、15,16,17のいずれか。
  内訳は、15個:314、16個:3463 17個:320 
  ローパスをかければ直流。つまりキャプチャした部分はすべてまだ無音区間。


 曲間の区切りを検出するには、32bit中の1の個数を移動平均フィルタをかけ、閾値以上が検出される前n wordとかがよさそうです。

    キャプチャデータ 5A5A5A5Aパターン以外初出部

2010年12月25日土曜日

1万円を切るロジアナ ZEROPLUS LAP-C(16032)

 こんなに安いロジアナがあるんですねえ。
 秋月では¥9800 ZEROPLUS LAP-C16032 16chロジックアナライザ(100MHz,32k)




 こちらの情報だと、64kbit/chのひとつ上位機種と中身は同じで、何だかxxしてます。

 標準で、UART, I2C、SPI、7SegLEDのプロトコルをサポートし、2つほどいくつかあるプロトコルから無料で選択できるそうで、[ Digital Audio ]としては、AC97, HD Audio, I2S, PCM, S/PDIF, STBus が選択可能です。ちょっとそそられます。

 32kbit/chしかメモリがなく、SignalTap IIと どっこいどっこいともいえる点が微妙です。
 高い機種になると、メモリ容量が大きくなっていき、チャネル数が増えたり、サンプリング周波数も高速になったりしていきますが、値段が跳ね上がります。

 
 SignalTap IIをロジアナ代わりに使うとなると、準備に色々めんどくさいこともありますが、手間をかければ複雑なトリガ条件も論理で組めます。
 
 今まで知りませんでしたが、キャプチャしたデータをcvsファイルへExportもできます。

 また、現在確認しようとしてる、DSD Phase Modulation Modeをシリアルではなく、8bitや32bitパラレルで見ようとなると、サポートプロトコル外のためLAP-Cでは、難しいのではないかと思われます。今回については、シリアルでデータを観測しても何が何だか状態なので、とりあえずSignalTapIIでキャプチャでいきます。そのうち買っちゃいそうですけど... 

2010年12月23日木曜日

DSD BCK/DSD_L(R)波形 2

 一昨日にアップした波形、あまりに鈍りすぎでしたが、プローブのInput Capacitanceの影響が大きかったようです。×10にして再測定したのが、下記の波形です。
 やはり結構鈍っていますが、大分ましです。エレアトさんのブログでは、ダンピングに470Ωと以上に大きい値の抵抗値が入っているようで、これを47Ωに替えれば、かなり急峻になるようです。集合チップ抵抗で交換するのはちょっと大変そうなのでできれば手を出したくありませんが....



 BCK(上)とDSD_L(R)(下)(infinite persistence mode)


 
 再生停止時のBCK(上)とDSD_L(R)(下)

2010年12月22日水曜日

DSD Phase Modulation Mode

 DSD Phase Modulation Modeですが、データの周波数が倍になるためタイミングは厳しくなります。といってもたかだか2.8Mbit/s程度なのでクロック波形がきれいであれば問題ではないはずですが...

 見方を変えると、必ずエッジが存在するため、BCKなしでもデータが再生できることに気がつきます。S/PDIFやADAT等と同様にBCKなしでも受信可能です。


 しかも、BCLKネガエッジ側のDSD_L(R)データは、ポジエッジ側の反転データであるため、ポジ側とネガ側の反転データが一致するかどうかで、誤り検出として使用できるかもしれません。
 
 誤り検出として使えるかは、コードバイオレーションがないことが前提となります。たとえばS/PDIFの場合は、PreambleのX/Y/Zcode時は、"1"は"10"または"01"に0は"11"または"00"にエンコードするルールに反するコードを使用して実現しています。

 DSD Phase Modulation Modeもこのようなコードバイオレーションを用いていなければ誤り検出に使用できると思われます。

 また、BCKを用いて受信したデータと、上記のBCLKを用いないで受信したデータをコンペアすることによっても、完璧ではありませんが、データ誤りの検出方法として利用できることが期待でいます。

 
 BCKが鈍っていることを考えると、BCKを用いない受信回路の方が、確実にデータを受信できるのではないかと思われます。というか、今のBCK波形ではまともに受信できるか非常に怪しい。
 ということで受信キャプチャは、先ずはBCKを用いずデータエッジを利用してデータを受信する方法でやってみようと思います。 

 またFPGAとしては、BCKを用いないほうが、もうひとつメリットがあります。
 S/PDIF、ADAT、I2S、DSDなどの受信回路を共通回路化する場合、モードによってクロックを切り替えることは、できれば避けたいので、BCKを使用せずに受信できるのはありがたい。

2010年12月21日火曜日

DSD BCK/DSD_L(R)波形

某所でDSDデータの抽出ビットパーフェクトで試行錯誤中なので、気になって波形を採取してみました。
採取ポイントは、エレアトさんのサイト デシメーション基板その後、その5を参考に、同じポイントから引き出しています。


 BCK(上)とDSD_L(R)(下)(infinite persistence mode)


 上がBCLKで下がDSD_L(R)のどちらか、LとRはどちらか記録していませんが、同じ傾向で変わりありません。
 BCK波形がめちゃくちゃ鈍っています。プローブがぼろいせいもあると思いますが、いくつかに分岐させているようなので、そのせいが大きいのではないかと推測します。

 想定と異なるのは、DSD_L(R)の波形が、BCKの立下りでも変化している点です。DDR?


 再生停止時のBCK(上)とDSD_L(R)(下)

 こちらは、SACDマウントして停止状態でのシングルスイープ波形。 
 写真にBCK立ち上がりのDSD_L(R)だけを数字をプロットしてありますが、BCK立ち上がりでのDSD_L(R)は"0101 1010 0101 10・・”と"5A5A"連続パターンとなっています。

 BCK立下りでは、DSD_L(R)が、立ち上がり時のデータの反転になっています。最初の波形でもたち下がりは必ず反転していることがわかります。


 AK4399のデータシートを見ると、Audio Serial Interface Timing (DSD Normal Mode, DCKB bit = “0”)とAudio Serial Interface Timing (DSD Phase Modulation Mode, DCKB bit = “0”)の波形の図が載っており、後者のモードの波形は、立下りで変化するタイムチャートになっています。
 XE600はDSD Phase Modulation Modeのようです。
 結構このデータシートは見ていましたが、DSDはあまり注視していなかったので気がついていませんでした。でもそういえば、クロックの立下りにデータ変化点があるタイムチャートを見て、なんだこれと思ったことがありました。

 
 DSD Normal ModeよりDSD Phase Modulation Modeのほうが、BCKに対するDSD_L(R)の位相余裕がなかったり、電源ノイズでデータエラーが発生しやすいので、よりシビアに回路を作る必要があるようです。

 引き続き、FPGAに引き込みSignalTapIIでデータパターンを見れるようにしたいと思います。

2010年12月16日木曜日

Atlys Spartan-6 FPGA Development Kit

Atlys Spartan-6 FPGA Development Kit というFPGA開発ボード、2つのHDMI入力ポートと2つのHDMI出力ポート、AC-97 audio with line-in, line-out, mic, & headphone を装備しています。
 ユーザーマニュアルには、”EDK designs can use the xps_tft IP core (and its associated driver) to access the HDMI ports.”とあり、もしかするとHDMIからPCMデータ、DSDデータをモニタすることができるのかもしれません。



 Sim's blogさんに概要が紹介されています。
 ストロベリーリナックスさんで扱っています。

 ちょっと気になりますが、敷居が高そうなのでしばらく様子見。

2010年12月12日日曜日

e-onkyo DSD配信

e-onkyoでDSD配信が始まり、しかもDRMフリーということで、試しに購入してみようかと思い、まずまだインストールしていなかったKorg AudioGateをインストールして2Lの無料サンプルのDSDIFFを再生してみました。
 
 最初SCC-01で試したところ、再生はしているものの、全くぼろぼろの状態でRMEのASIOと相性が悪いのかと思いましたが、Samplitude11に変更したらきちんと再生できました。

Korg AudioGate


 そこでFFTのグライコ画面を見ると、どうも24kHzあたりでデシメーションフィルタをかけられているようです。

 DSD再生 B.Britten Simple Symphony Op. 4 -- Boisterous Bourrée 2L


  同じ2Lサンプルの96kHz版を再生してみると、こちらは48kHzあたりまで伸びています。
  聴き比べても、家の再生環境で私の耳では両者の違いはよくわかりません。

 96k再生 B.Britten Simple Symphony Op. 4 -- Boisterous Bourrée 2L
                    注:同じTimeではありません

 エレアトさんのデシメーションフィルタも[1] 88.2kHzモード 通過帯域  0-24kHz 阻止帯域  56kHz以上 [2] 176.4kHzモード 通過帯域  0-24kHz 阻止帯域  99kHz以上となっており、DSDの場合、24kHzあたりを通過帯域上限とするのが妥当なようです。


 e-onkyoのDSD配信タイトルは、24/192kHz、24/96kHzのものもあり、しかも価格は、DSD配信より安いようです。

 私の場合、デジタルチャンデバをデフォルト使用するためDSDでのデジタルフィルタが可能になれば別ですが、PCM変換が必須の状態であり、しかもデシメーションフィルタで24kHzでカットされている点で、24/192kHz、24/96kHzより分が悪そうです。
 e-onkyoのDSD配信は、24/192kHz、24/96kHzもある場合は、DSDより24/192kHz、24/96kHzを選択したほうが良さそうです。ということで、購入は保留。

 録音ソースがDSDで、PCM変換されずに配信されている場合は、DSDのほうが良さそうですが...


2010年12月11日土曜日

MultiDACのクロック構成

現状考えているMultiDACのクロック系です。図は、ある程度見やすいように省略しています。

 ・クロック系は電源を別系統とする(電源選定は検討中)
 ・極力デジタル系とのアイソレートを考慮する
 ・44.1k系列と48k系列サポートのたNZ2520SD - 24.576000M - NSA3449C、 NZ2520SD - 22.579200M - NSA3449C(日本電波工業) クロックを切り替えて使用 
  LVDSクロックドライバの入力が1つのみなので、CXOのOEで未使用側のCXOの出力を停止しワイヤードORの形式にするつもりです。
 クロックドライバは色々種類はあるのですが、いずれもものすごくピンピッチが細かく、しかも部品下になるので手付けは非常に困難で、選定が限られます。
 
 ・BuffaloII ES9018用にPure Rhythm 96MHzを源信に3分配させる。SMAコネクタ 50Ω同軸ケーブルで接続する。

MultiDACクロック系統概略図

BuffaloIIのCXOは、外すのが難しいようなので、図に示すように電源とGNDを浮かしてしまい。出力のダンピング抵抗も外し、空いたPADへ50Ω同軸ケーブルをジャンパすることにするつもりです。

 ES9018の場合、いわゆるMCKが必要ないため、悩ましいところですが、HDMI送信コネクタ6個各々へ22.579200M or 22.5792MHzを供給します。

 DE0のcycloneIII FPGAはIOが3.3V電源ですが2.5V LVDSの受信はできるようなので、LVDSで接続します。(本当に大丈夫か実験要)
 外で22.579200M  22.5792MHz切り替えているので1系統受信でよいはずですが、PLLの切り替えができるか不安なため2系統入力してあります。

 BCLK、LRCKは、サンプリング周波数により周波数を変更しなければならない点と、DATAとの位相規定があるためFPGAから出力せざるを得ません。

 何か改善点などありましたらアドバイスお願いします。

2010年12月9日木曜日

CAPRICE-I2Sやはり納期遅延

 予想通りですが、当初の入荷予定(12月中旬)が【入荷予定日】2011年1月中旬予定と連絡がありました。
 I2S接続環境が整えるられる目処はついていないので、まあ良いのは良いのですが、やはり残念といえば残念です。
 とりあえず、手組みでつなげられる準備だけはしとこうかな...

MultiDAC構成変更

 ちょっと規模をでかくし過ぎて製作が追いつかない感があるので、縮小方向で見直しました。といいつつ増えているものが結構ある気が...
 システム構成のページを変更後に差し替えました。

 主な修正点は、
 ・コントローラをmbedに変更し、本体との通信はbluetoothや赤外線通信などで検討すること。
  SDメモリプレイヤー機能やチャネルデバイダ機能は、コントローラではなくMultiDAC本体側に実装。

 ・mbedからBuffaloIIやAKM4399の制御することとし、これによりDE0のピンネックは解消

 ・USB Dual Audio ,USB Audio を別筐体としていたがMultiDAC本体に内蔵。HDMIコネクタで外部接続することとし、ケーブルの付け替えで、未使用時は他のDACなどに接続可能な構成に変更
 
 ・保留としてあったCAPRICE-I2Sを購入
 
 ・SCC-01の購入を検討
 
 ・QNAP NMP-1000P購入を検討

 追加機器はあるものの、製作を要する部分は減らしたつもりです。

2010年12月7日火曜日

QNAP NMP-1000P

 QNAP製メディアプレーヤー「NMP-1000P」が12月10日に発売されるそうです。
 詳細は、AV Watch QNAPサイト

 ”内蔵のWolfsonのWM8524高品質DACは、最高の無音やクロストーク性能と、8~192kHzにおける全てのオーディオ・サンプリングレートでの24bit変換をサポートすることで、106dbのSN比を提供します。”
 ”FLACロスレスオーディオファイルは、NMP-1000Pが変換無しでそのまま処理します。” 

 とありますが、S/PDIF(光)、HDMIからの出力もそうなのかどうかが読み取れません。
 多少検索してみましたが、前機種含め、情報が拾えません。
 前機種より価格も下がって、35,800円前後と比較的安く、機能的にも魅力的なので、nonPCでの再生環境として検討しても良いかも。
 
 SDメモリバッファ機能+FPGAでのチャネルデバイダが実現できれば、PCの必要性も薄まりますし。

2010年12月4日土曜日

Vision3D Blu-ray 192kHz再生

 Vision3DでのBlu-ray Discの再生機能を確認してみました。
 2Lの5.1 DTS HD MA 24/192kHzと2.0 LPCM  24/192kHzで収録されているBlu-ray Discで、Tos-Link出力を現状家で唯一192kHz光を受信できるMatrix mini-iに接続してみました。


Vision3D PowerDVD で2L Blu-ray Disc 24/192kHz再生

Matrix mini-i 192kHzで再生中

 最初、RealTek HDオーディオマネージャのコントロールパネルの設定で、ヘッドフォン出力がデフォルトデバイスになっている場合は、 フォーマット選択を192kHzや96kHzにしても48kHzで出力されており、駄目なのかと思いましたが、デフォルトデバイスをDigitalOutputに変更すると、192kHzで出力できるようになりました。

 出力フォーマットは、44.1k,48,96k.192kHz各々16ビット、24ビットの組み合わせがあり、24bitを選択した場合、本当に24bitで出力されているかは現状わかりません。きっと24bitになっていると思いますが、そのうちDN-HDMI4000AS経由のBDP-S370でのSACD再生等とともにFPGAにつなぎこんで確認してみたいと思います。


2010年12月1日水曜日

Vision3D

  FPGAのコンパイルなどに使用しているVaio Rmasterが立ち上がらなくなったので、修理すればよいのですがちょっと大変そうなので、リプレースすることにしました。
 
 マシンは、ASRock Vision3D 156B-42/B/BB  
 ベアボーンなので、メモリとBootドライブ、OSだけは別に調達が必要。 メモリはDDR3 1066 2GB×2枚 Transend、ドライブは、128GB SSD  Crucial  RealSSD C300 CTFDDAC128MAG-1G1 、OSはWindows7 Professional 64bitを選択しました。


フロント


リア

内部

 
Vision3Dの主な選択理由は、
 ・ノートPCアーキテクチャなこともあり、小さい、静か、消費電力も少なめということ。
 ・Blu-rayドライブ搭載(3Dにも対応)
 ・DVIとHDMIを装備
 ・Optical S/PDIF装備。その他よく調べていませんがmusic系機能が充実しており活用できる可能性があること。
 ・Core™ i5-560M モバイル 搭載で比較的高速
 
 Windowsエクスペリエンスインデックス値は、Vision3D:5.9、MusicPC:1.0となっています(下記)。
  Vision3D Core™ i5-560M モバイル 2.67MHz に対しCore™ i5-660 3.3GHzでクロック速度については、MusicPCの方が優れますが、Vision3DがGeForce GT425M に対し内臓グラフィックのため、グラフィック関連のため1.0になってしまっています。体感的には多分あまり変わらないと思います。

 Vision3DのWindowsエクスぺリエンスインデックス


Vision3DのWindowsエクスぺリエンスインデックス

 MusicPCより、はるかに静かですので、こっちをMusicPCにしたいぐらいですが、PCIeスロットが無いので無理。MusicPCの方は、もう少し静音化を調整してみて、視聴位置から遠くに離すことで対処するつもりです。


 しかしいつもながら何か失敗します。

 今回は3点失敗。1つ目は、メモリを何も疑わずにデスクトップ用のを購入、いざ付けようとしたときにノートPC用である必要に気がつきました。しょうがないので、余ったデスクトップ用のは、増設しても意味があまりなさそうですが、MusicPCの増設メモリ行きです。

 2つ目は、IEEE1394あると勘違い。よく見るとないではないか... まあしょうがいない。

 3つ目は、CAPRICE-I2S購入と一緒に、楽天のエントリー&買いまわりで全ショップポイント最大10倍などでポイント数アップを期待して購入したのですが、SSDの購入店はクレジットのボーナス払いが選べたので、ついボーナス払いを選択したら、期間が過ぎているのでキャンセル扱いにされてしまい10ショップが9ショップになってしまったこと。
 しかし選んでは駄目なボーナスを選択できるようにしているのは、明らかに楽天システムの設定ミスだと思うのですが、お店はうちではどうしようもないですとの回答。楽天はメールしても無視。いまだに何も返事がない。対応ひどすぎませんか???

2010年11月25日木曜日

CAPRICE-I2S(Fidelix)購入

 遅ればせながらCAPRICE-I2S 楽天Joshinで購入しました。きっと発送は来年でしょう...
  エントリー&買いまわりで全ショップポイント最大10倍 ケータイ限定!全ショップエントリーでポイント3倍などで10%以上ポイント付与されるので、多分CAPRICEを一番安く購入する手段ではないかと思います。
 ちなみに、I2SはFidelixで後で追加してくれるそうですが、購入時I2S付加より8400円アップするそうです。

2010年11月24日水曜日

SCC-01発売記念試聴会

 横浜ベイサイドネットで行われたSSC-01(デジタルチャンデバ+音場補正ソフト)の発売記念試聴会に参加してきました。横浜ベイサイドネットへは初めて足を運びました。

 お名前をわすれてしまいましたが、設計者の方が構造や使い方などを比較視聴を交えながら説明してくれ、大分その内容が分かってきました。オーディオ趣味が高じて、既存のハードウェアのチャネルデバイダに不満を感じて作ってしまったそうで、お話を聞く限りお一人で開発したように感じました。




 今使っているSamplitude+ARCと実現できることにはそれほど大差はないのは間違いなさそうですが、専用ソフトであるため操作性は断然よさそう。
 チャネルデバイダについては、FIRフィルタのタップ数が多分細かい(Samplitude付属のFIRフィルタのタップ数不明だが多分2000-4000タップぐらい、SSC-01はタップ数が約65000 タップで演算制度が64 ビット倍精度浮動小数点演算)、スロープは6dBから120dBぐらいまでで選択可能。
 補正もARCは試聴位置での補正(ただし複数ポイントでサンプル)に対し、SSC-01はスピーカーの補正と、試聴位置での補正の2段階補正で精度良く補正できそう。
 
 マイナーバージョンアップやOS対応もするつもりとのことで、サポートも心配なさそうです。

 音場補正については、無しの方がパッと聴きは艶がある感じで、有りにするとおとなしいがすっきりした感じに聴こえました。

 なかなか良さそうなので、買おうかなという気になってきました。2ヶ月間は製品版の全機能がトライアルで使えるとのことなので試していきたいと思います。とりあえずv1.1.2インストールして見ましたが(写真)再生できましたが、カットオフの周波数等操作できません???


2010年11月23日火曜日

RME TotalMix + Samplitude + PlayerSoft

RMEのAudioインタフェースの場合、TotalMixを使うことで複数のアプリとインタフェースを取ることができます。
あまりこのことを取り上げている記事を見たことが無いので紹介しておきます。

SamplitudeなどのDAWソフトのほうが音が良いという記事は良く見かけますが、実際DAWでの再生は、ファイルの指定、再生が面倒です。
そこでFoobar2000などのASIO対応Playerで再生させて、それをSamplitudeなどのDAWソフトに流しこみ、DACへの出力はSamplitudeなどのDAWから行うという方法がとれます。ビットパーフェクトで出力するPlayerであれば、SamplitudeなどのDAWで再生するのと等価の処理となると思います。(未確認で、本当に再生音がSamllitudeで再生した音となるかはわかりません)


図の例では、A13,A14にfoober2000をアサインして、それをループバックさせてA13,A14入力としてSamplitudeに接続しています。下のA13,A14が赤くなっているのがループバック設定になっていることを示します。SamplitudeではA13,A14入力をA1,A2(Low)、A3,A4(High)のDAC用出力ポートへ出力しています。RMEのスタッフブログにループバック方法についての記事があります。

                 RME TotalMix + Samplitude11 + foobar2000

私の場合、Samplitudeをチャネルデバイダーとして使用しているので、これができることが必須に近いですが、DAWで再生を考えている方一考されてみては。


2010年11月21日日曜日

embedお試し 「Pachubeを使って温度センサの値を記録しよう!」

 温度センサ頂いたので、embedのお試しとして、「Pachubeを使って温度センサの値を記録しよう!」をそのまま(と言ってもセンサは1つだけ)、実行してみました。
 Pachubeサイトへの接続は、なんの問題もなくあっさり接続できました。が、またまた接続ミスして、mbedの上下見誤り、センサ端子をVCCにつなげる失態を犯し、100度を超える変な温度表示をだしたまましばらくそのまま動かしてしまい、気づいたときは壊したかとヒヤヒヤしましたが、embedも温度センサも大丈夫だったようです。






 プログラムを触ったわけではないので、まだ断定するのは早急ですが、ネット経由の制御が比較的簡単にできそうで、PCからMultiDAC制御することもできそうな気がしてきました。と言っても電気的な接続は回避する前提で..

2010年11月20日土曜日

MTM6で☆StarBoard Orange Get

MTM6に行って☆StarBoard OrangeをGetしてきました。

きばん本舗さんで☆StarBoard Orange完成品をゲットし、GPS Laboさんでアクリルボードキットを購入。mbed自体は既に到着済み。


  mbed と ☆StarBoard Orange  アクリルボード(小)付き



CuBeat Systemsさんのデモの説明を聞いて、温度センサをプレゼントしてもらいました。どうもありがとうございます。




風邪ひきなのでmbed関連のエリアを中心に後はちょろっと見ただけで早々に退散しました。

☆StarBoard Orange "StarBoard"というのは船の右舷側を指す呼称であるが、☆が一緒についているから右舷を表すStarBoardを何かに掛けているわけでは無いのかな?

2010年11月15日月曜日

mbed NXP LPC1768購入

mbed NXP LPC1768とその他SMAコネクタ、ケーブルなどちょろちょろ、秋月にオーダーしました。
Twiiterでその存在を知り、とにかく簡単そうなので、プログラムはFPGAソフトコアプロセッサのNiosIIを使うつもりでしたが、大概のことはmbedのほうが簡単そうです。
どう組み込むかは、試しに使って考えていきたいと思います。
☆board Orangeも検討中。Make: Tokyo Meeting 06で展示即売らしいので行ってみるかな?

2010年11月12日金曜日

PCオーディオの理想型


  ①(DAC)同期クロックソースは、DAC側の22.5792MHz CXO
  ②(DAC)SDPIF 光でPC側にクロックを搬送
  ③(PC)受信SPDIFからクロック成分をリカバリ(CDR)
  ④(PC)Playserソフト=>ASIOドライバ=>Audioインタフェースは、リカバリしたクロックで動作
  ⑤(PC)PCからSPDIFでDACで送信
  ⑥(DAC)SPDIFからPCMデータとともにクロック成分をリカバリ(CDR)
  ⑦(DAC)Elastic Bufferに受信したClockで書き込み
  ⑧(DAC)Elastic Bufferから22.5792MHz CXO clockで読み出し
  ⑨(DAC)DAC ChipのMCKは22.5792MHz CXOを供給

巷ては、PCオーディオの音質についていろいろな情報が飛び交っています。tad with TIMEDOMAIN さんの記事にもその一例が並べられています。
私の考えるPCオーディオのひとつの理想型をとれば、このほとんどを無視できるのではないかと考えています。
 
 要点は、次の2点のみだと思います。(ただしデジタルデータはビットパーファクトであることが前提)

  1.  クロックは、低ジッタの品質の良いものをDACチップに供給する
  2.  PCの電源ノイズをDACチップ以降のアナログ段に伝えない

1.を実現するには、DAC側になるべく短距離かつクロックの電源に気を使い基準クロックを実装すること。
2.を実現するには、PCとは光で接続することにより、PCとの電源と完全にアイソレートすること。

 デジタル区間、つまりPC内部とPCからDACのDAIまでは、ジッタがひどかろうが、電源がひどかろうが、ビットエラーが発生するほどでなければ、なんの問題もないはずです。デジタル信号というものはそういう性質です。これらが影響するのは、DACのDA変換時とその後段のアナログ部以降のはずです。

現在主流となりつつある(既になっていると思うが)USBは、アシンクロナスモードで、DAC側に基準クロックを置くことを実現していますが、電源のアイソレートができません。しかもFidelixさんの記事によれば、USBは特にあまり良くない模様。
SPDIF接続では、PC側のクロックで動作させることになる。(WordClockポートがPC側とDAC側両方にあれば回避可能。しかし一般にWordClock装置は高いし、サポートするDACも限られる。)


1.2.両方を比較的低コストで実現には、SPDIFの送信/受信両ポートを持ったオーディオインタフェースを用意し、PC側のクロックリファレンスをSPDIF受信ポートとする。DAC側に通常は必要のないSPDIF送信ポートを設け、基準クロックをPCに伝える目的で出力させる(SPDIF出力についてはジッタは気にしなくて良い)。
これが実現できていれば、あとはPCについてはほとんど何も気にしなくても良く、DAC以降のオーディオ装置に注力すれば良いと考えています。この考えを前提に、マルチチャネルDACの構成を作成しています。

 SPDIFを持つオーディをインタフェースは、DTM向けが主流になりますが、RMEのFF400を始めかなり多く出回っています(192kHz対応は限られます)。XONAR D2Xなど比較的安価なオーディオカードでも対応しています。

 しかしDAC側となると、皆無かもしれません(FF400などをDACのとして用いれば別)。PCオーディオ向けDACを開発するなら、低ジッタクロックとSPDIF出力を装備したDACとして、これをアピールすれば、もしかするとヒットするかもしれないと思うのですが、どこか企画しないものですかね…
 

2010年11月9日火曜日

SDRAMメモリーバッファーモード追加

 現在、MultiDACのCXOを基準に96kHz固定で運用していますが、Pioneer DV-610AV=>DN-HDMI4000AS=>RME RayDATで88.2kHz 24bitの場合は、特に違和感なく聴けていたので、てっきりRME RayDATにてSRCしてくれていると思っていましたが、BDP-S370=>DN-HDMI4000AS=>RayDATの176.4kHz24bitで常時ノイズがのっており、88.2kHz時だと分かりにくいだけでスリップ起きまくりで再生していたものと推測されます。バカ耳露呈です。
 実際96kHz再生でMultiDACは48kHz動作とかならなんの問題もなく再生してしまいますので、再生レートが異なっていても注意深く聴いていないと気がつかないことはありえます。しかし88.2kHzと96kHzでも気がつかないかは.....
 このままでは、BDP-S370=>DN-HDMI4000ASルートで176.4kHz24bit再生が困難のため、ElectrArtさんのSDRAMメモリーDAI fujiwaraさんのメモリーバッファーDAIに相当する機能の追加を優先したいと思います。

 一番の課題は、SPDIF(TOS)の176.4kHz受けです。TORX142を所持していれば問題なしですが、既に生産中止で入手は困難。 Matrix-mini-iを始め、192kHz TOSをサポートするDACはいくつかは見られるので、どこかのメーカでは192kHz対応品を供給しているものとは思いますが、Web上ではそのような部品は見かけることができません。なぜでしょう?? 誰か知っている方ぜひ教えてください!!

 以前に書いたように、TORX1701は、規格が異なりTOTX172などの最小送信レベルより最小受光レベルが高いので正常に受信できない可能性が高いですが、TORX1701で受信できるか実験して、うまく受信できるようなら、この構成で行きたいと思います。
 
 次はIO&クロック基板を作成することとしていましたが、寄り道ばかりでなかなか進みません。とにかくTORX1701が使えるかどうかで回路構成を変える必要があるし、BDP-S370=>DN-HDMI4000ASで再生できないままとなるので、目下の優先事項とします。

再生構成は、下図のようになります。


 
 CXOは、22.5792MHz として、全区間176.4kHz 24bit(sampltitude内は32bit)処理。
 22.5792MHz CXOは、 NZ2520SD - 22.579200M - NSA3449C(日本電波工業)は入手済ですが小さいので壊す恐れ大なので、別に確保する予定です。しかし24.5760MHzは比較的入手容易ですが、22.579200M のCXOはあまり扱っているところが無いですね。

 SDRAMまでは、BDP-S370が源振の176.4kHz、それ以降は、MultiDACの22.5792MHz CXO源振の176.4kHz動作になります。(正確にはSDRAMアクセスは50MHzzCXOから生成した100MHz動作)

 最終的には、5.1ch対応、無音区間でバッファ残量調整等を入れたいですが、まずは2ch専用で、単に一定量蓄積したら読み出しを開始する単純な機能をつくり込みます。
 うまくいくようであれば、22.5792MHz と24.5760MHz CXOを切替られるようにします。

2010年11月7日日曜日

PC ケースfan交換とRME RayDAT

ちょっとうるさいのでAudio用PC(Core i5自作、ケースはSilverStone SST-GD04S)のケースFAN3個をオウルテックOWL-FY1225L(WH)に交換してみました。ネジが切ってなくて無理やりプラスチックの本体のネジ穴にねじ込むタイプで、ねじがほとんどバカになってしまい結構大変でした。

1,400rpm 29dBですが、うるさいのはCPUファンなのか、交換してもやはり結構うるさく効果は限定的のようです。写真のようにLEDで白く光ります。普通の光らない方がやはりよかったです。
ケースファンはもっと回転数の低いもの、CPUファンももっとうるさくないのを探さないと...

 ケースを開けたついでに、RayDATの写真をとり、主要部品を調べてみました。
 RayDATは、本体カードと拡張カードにわかれています。拡張カードはインタフェース回路しか搭載されていません。

主な部品は、Xilinx Spartan-3E FPGA XC3S1200E、 PCI-Express Bridge NXP PX1011B 、8Mbit Flash S29AL008D70TFI020 とTOSの送受信モジュールぐらいです。見落としているのかもしれませんが、CXOは50.000MHzが一個だけに見えます。11.2896MHz系も12.2880MHz 系もこのCXOから作っているか??? FPGAと50MHz CXOだけでSteadyClockによる高性能ジッター抑制機能を実現しているなら結構すごいことだと思います。きっと... ほんとどうやっているのだろう...


搭載されているFPGAをDE0と比較すると、

FPGA            XC3S1200E    EP3C16
Logic Cells     19,512cell        15,408element
RAM             504Kbit           504Kbit
Multipliers      28                    56

メーカが異なり、デバイスアーキテクチャが異なるため、単純に比較できませんが、DE0搭載のEP3C16よりやや大きいぐらいのFPGAになると思います。

部品代だけなら¥12,000程度のDE0のほうがお金がかかっていると言えそうなぐらいです。
いくらなんでもボッタクリ過ぎと言いたくなります。

2010年11月6日土曜日

AudioGateフリー・ダウンロード化

コルグのAudioGateがフリーダウンロード化されるようですね。
AV Watch
Korg

Twitterアカウント登録とネット接続状態が条件となりますが、特に問題なし。
とりあえずTwitterアカウント登録済ませました。
チャンデバするには、今のところPCM化が必須なので役に立つかも....

2010年11月3日水曜日

Pure Rhythm 96MHz入手

 BuffaroII ES9018動作クロック用に、FidelixさんのPure Rhythm 96MHz入手しました。

















 3つのBuffaroIIに1個づつおごるのはつらいので、クロックドライバを挟んで、1つで分配供給するつもりです。

 中川さんには、インピーダンスマッチングしないと波形がくずれるからやめておいたほうが良いとアドバイスを受けていますが、とりあえず挑戦してみます。


 クロックドライバ⇒ES9018間は50Ω同軸で飛ばすことを考えています。LVDS差動にすることも考えましたが、大体40-60mmぐらいの伝送になるよていなので、LVDS⇒LVCMOS変換ドライバが入らない方が良いのではと考えています。

 3.3Vだと正常に発振しない可能性があるとのことでしたが、見た目振幅は小さくなりますが、発振はきちんとしているようです。

下図は、5V動作時の波形 振幅は1.22V程度。





















 






 

TDS460A オシロ入手

Tektronix TDS 460A 中古をYahooオークションで入手しました。
周波数帯域:400MHz 最高サンプルレート:100MS/s




 








初期診断で1件NGが出てますが、普通に測定出来ていそうです。


FFT測定ができるとカタログにあったので期待していましたが、オプションでこのマシンには残念ながら付いていませんでした。

これで大概の測定には不自由しないですみそうです。

構成案見直し

 コントローラをNEEKに変更したことに伴い、いくつか見直しをしました。
 変更後の内容は、"システム構成"のページにアップしています。

 主な変更
  1.  コントローラ変更 LPRP=>NEEK(NiosII Embedded Evaluation Kit)
  2. コントローラ⇔DAC Matrix間インタフェースをHDMIケーブルから光(TOTX/TORX1701)に変更
  3. BDP-S370=>DN-HDMI4000AS=>DAC Matrix 176kHz化に対応するためTORX1701採用
  4. デジタルフィルタのFPGA実装
  5. DSD Matrixをスリム化
1.はLPRPが入手不可能なためと、デジタルフィルタの実験用として。
3.はやはり光で接続としておきたいのでTORX1701(F)を検討してみることに。ただしTOTX147などのオーディオ用TOSの最小光送信レベルより最小受光レベルが高いので受信できない可能性があります。またデータレートが20M~125Mbit/sとなっているためサンプリングレート96kHzが受信できない可能性もあります。(一応メーカ問い合わせ回答では、保証はしないが10Mbit/s台も可能と考えるとのこと)。
2.はNEEKだと消費電力が増加しHDMIケーブルで供給だと容量が心配なので、ACアダプタ給電に変更することとし、そうなると光接続のほうが良いであろうということと、2.の実験用として購入して、OKでもNGでも使いまわそうという目論見で。 光とした場合、HDMIだとケーブル1本で4対のLVDL差動転送ができていたのを送受2対でまかなうため、転送レートを2倍化。 クロック転送で1本占有できないため同期クロックの転送をデータ用ラインで考えなければなりませんが、なんとかなる予定です。だめならCDR導入か別線転送を考えます。