Purepath Studioを勉強する!の巻き 2018.2.10

TAS5756やPCM5142などの素子の中にはminiDSPなる機能がありフィルターを自由に設計できたりするのですが、
デバイスのデータシートには詳しい使い方は載っていません。おそらく載せたとしたらデータシートは1000ページを超えそう
なくらい、複雑なものになるに違いありません。そしてデータシートを読んで使うのもかなり厄介なことでしょう。
 そのためかTI社はminiDSPをグラフィカルにプログラミングできるPurepath Studioなるものが開発されてリリースされています。

Purepath Studioはどうやった入手できるか?

これはTI社のWEBからリクエストを出して入手します。
下記のようなページがありますので、そこからリクエストをクリックします。
ユーザ登録をして、使用するデバイスを指定してリクエストしますが、どうやら配布という感じではなく
明らかに会社のみをターゲットにした配布となっているようです。
 最初に個人のメルアド(たとえばYahooメール)などで登録しましたが、完全に拒否されました。
というわけで会社のメルアドを用いて登録したのちに、リクエストを出したらダウンロードサイトが送られてきました。


このページからリクエストを出します。

ソフトをインストールしてみるも・・・・

使うデバイスとしてTAS5756を指定したのですが・・・指定したというより書いただけですが・・・
ソフトを立ち上げると対応しているデバイスはPCM3070とPCM51XXのみのようです。
でも、TAS5756のminiDSPはPCM5142とほぼ同じなので共通的につかえるのかもしれません。
というか、それを期待してソフトの習熟を進めましょう。

つかえるデバイスにTAS5756はないようです。

PCM5142あったかな?

Purepath Studioを動かして、色々とやっていてなんとか、IC内部に書き込むデータコードが得られるところまでわかってきました。
そうなると、やっぱり動かしてみたくなります。
まずはPCM5142用のソフトでもあるので、部品箱からPCM5142を探しましょう。というのも、以前にPCM5102を買ったときに
あわせてPCM5142も買った記憶があるのでどこかにあるはずです。

みつけた!
ようやく見つけました。ちゃんと静電防止箱に他のICとともに保管していました。
そして初めてCS4398も買っていたんだな〜ということを思い出しました。それも2つも買ってる・・・・。

PCM5142を見つけました。

さっそく変換基板に取り付けて、動作できる状態にしましょう。

まずは変換基板に取り付けです。

I2C-OS基板に搭載!

PCM5142をI2Cで制御することになるので、I2C−OS基板に搭載することにしました。
そうすればPCからデータを送って、簡単に書き込むことができます。

PCM5142をI2C-OS基板に搭載しました。

まずは簡単に動かしてみましょう!

1.超簡単プログラム

まずはフィルターなどは一切つかわずに、入力をそのまま出力するプログラムをつくってみました。

こんな感じで簡単にグラフィカルにプログラムできます。

そして、BUILD -> GENERATE CODE とすると下記のようなデータコードを得ることができます。

その一部分が下記になります。
W 98 00 00
とかありますが、これはI2Cアドレス0x98のデバイスのレジスター00にデータ00を書き込むという意味です。

さてこれをみて、I2C-OS基板からデータを送り込めばいいのですが、なんせ長い!!
上記の簡単なプログラムでさえ約200ステップのデータを送り込む必要があります。
まあ、ほとんどが不要なところでしょうが、どれが不要かを判別するだけでも大変なので、
ここは素直にすべてのデータを書き込むことにしましょう。



こんな感じでコードが生成されます。

データを書き込むといっても手動ではやってられないので、I2C-OSのプログラムをすこしだけ変更して、
上記のデータコードをPCからファイルでI2C-OS上のPICに転送して、PICからPCM5142にI2C通信するようにしました。

データを転送してPCM5142にコードを書き込むと動き出しました。

なんとか動き出しました。

さて、ここまでくれば色々とプログラムを楽しんでみましょう。

2.簡単なフィルターを作ってみる(LPF)

つぎは簡単なLPFを構成してみましょう。
Bi-QUADのIIRフィルターを1段だけ追加しました。
これをコード生成すると約350ステップです。

まずは簡単なフィルータです。

フィルターの定数はfc=100でベッセル形を設定しています。
さて、生成したコードを転送して動作をみてみましょう。

50Hz
100Hz
(fc)
200Hz
400Hz
1kHz


ちゃんとフィルターとして動いているようですね。100Hzと200Hzの振幅比が約2.6ですから
8dB/Oct程度の減衰量でしょうか。

3.フィルターを2段にしてみましょう(LPF)

こんどはフィルターを2段にしてみました。
コードはさらに増えて500ステップです。


Bi-QUADフィルターを2段にしてみました。

同様に動作をみてみましょう。1段の場合に比べて、減衰率は上がっているようです。
でも、単純に同じ値で並べるとfcのところで6dBダウンになってしまうので、ちゃんと設定する必要がありますね。

50Hz
100Hz
(fc)
200Hz
400Hz
1kHz

さて、もっと色々と試してみましょう!
といいながらも3連休はお出かけモード・・・。

さらに色々と調べてみて 2018.2.13

出先にも評価用の基板とソフトを持ち込んで時間のあるときに色々と調べてみました。
わかったことを備忘録代わりにリストアップです。

・GPIOにディジタル出力することも可能。ただしGPIOはOUTPUTに定義することが必要。
・INSTRUCTIONサイクルはRESORCE WINDOWで確認できる。
・INSTRUCTIONサイクルが256未満なら192kHzで動作する。
・さらにINSTRUCTIONサイクルが128未満なら384kHzで動作可能。ただしPPSが384kHzをサポートしていないので
 見かけ上Fc周波数を192kHzでの設計時点で1/2に設定することが必要。
・3個のBiquadフィルターならInstructionサイクルは128未満になる。


こんなところかな?

TAS5756で動くかな?

PCM5142のレジスターとTAS5754とのレジスターを見比べていたら、ほとんど同じであることに気づきました。
ひょっとして、PCM5142で生成したコードはそのままTAS5756(TAS5754と同じ)で動くのかな〜と思い試してみることに。
これで動けば、あとあとの検討がとても簡単になります。

動いた?
まずは簡単なフィルターを構成しました。1つのbiquadフィルタはfc=1000HzのLPFに設定しています。

まずはこんな感じでFLOWを組んでみました。

テストの環境はこんな感じです。I2C-OS基板はらI2C通信ラインをPiPA5756Dualに接続します。
そして、PiPA5756Dualの入力にSRC4137のPCM出力を接続しています。

テスト環境です。


で、BUILDしたプログラムを書き込んでやると、見事動きました。
下のようにfc=1000Hzで減衰が始まるLPFが機能していることが確認できました。
ちなみにフィルターの形はチェビシェフにしています。

100Hz
1000Hz
(Fc)
1600Hz
2000Hz
4000Hz

ひょっとしてPCM5142とTAS5756のディジタル部分のコアは同じなのかもしれません。

ちなみにfc=100Hzに設定してみると,問題なく動きました。
これで、3D構成もできそうです。

50Hz
100Hz
(Fc)
200Hz
400Hz

3Dにするなら・・・・

LR個別にLPFの出力するのではなく、LRを一旦ミックスしてモノラルにしたのちに
LPFに通してもいいでしょう。この場合はこんな形になるでしょう。

モノラルにしたのちにフィルターに通しています。

上記のような構成にするとフィルターが2つで済むのでINSTRUCTIONサイクルは255になり、
256未満ですので192kHzでも動作させることができます。先のLR個別にフィルタを入れる場合だと
フィルターが4つあり、270サイクルになるので上限が96kHzとなってしまいます。

さてPiPA5756のソフト構成はどうするかな?

PUREPATH STUDIOを使えばPiPA5756のフィルターが自由に設計できそうです。
で、どのようなモードを組み込むかを考えてみたいと思います。

やってみたいのは3Dなので、OUT-1はステレオ出力そのままで、OUT-2をサブウーハ専用に設定して、
周波数を80〜300Hzくらいで変更で数段階で設定できるようにするのがいいかな〜と思ったりです。

そのまえに、allo piano 2.1に見立ててみました。 2015.2.15
そういえばこういうBBSの投稿をしたところ、RasPiでallo Piano 2.1にみたてて動くということなので早速試してみました。


動作させるためにはI2C通信をPICからRasPiに渡してあげる必要があります。
そのためにPICは外します。一部パターンをきりますので、べつに取り付けたままでもいいのですが、
ここは気分的に取り外しました。

まずはPICを取り外します。


SDA,SCLと書いた部分からI2Cの信号線をとりだします。


PIC側と縁を切るためにパターンを切断します。切断することを前提としたパターンにしているので復活も簡単です。


PICのコネクタのPin3がSDA、Pin5がSDAなのでそれらと接続します。

載せ換え完了です。

PiDAC4490-1.1をPiDA5756Dualに載せ換えました。


動かしてみましょう!

VOLUMIOで出力デバイスをAllo Piano 2.1に選択します。するとリビートが要求されてドライバが組みこます。
そして、サブウーハーを使う設定にします。ここの設定も再起動が必要です。
結構、何回も再起動が必要でしたが設定が決まってしまえば、あとはとくに再起動は不要です。

こんな感じで設定します。

試聴してみましょう!
まずはステレオスピーカとしては秋月で買った300円のフルレンジを接続します。このままではほとんど低音はでません。
でも、このスピーカはものすごくお買い得な音で、チャンスがあれば複数個を入れたエンクロージャを作ってみようと思っています。


これだけではスカスカの音しかでません。

サブウーハを追加すると・・・・
サブウーハとしてONKYOのD202AXを流用して接続しました。
すると、いままでのスカスカの音に一気に厚みがでます。さすがに低音がでるといいですね。
遮断周波数はサブウーハからボーカルがあまり出ないくらいがちょうどよくて100Hz程度が
いい感じでした。

サブウーハをつけると音の質が一気にあがります。

気になる点は・・
PiDAC5756DulaがRasPiにallo Piano 2.1に見立てて接続できることは確認できましたが、
ちょっと気になる点があります。それは、サブウーハのレベルが調整できないということです。
メインボリュームとは連動するのですが、メインスピーカとのレベル差が調整できないようです。
そのためサブウーハの出力をすこし下げたいということができません。
 ひょとして設定できるモードがあるかもしれませんが、あるとすればどこにあるのかな?

 それにしても3Dシステムは小型のスピーカを活かすのに便利な方法です。

早速情報いただきました。




ということでVOLUMIOの外で設定を行う必要がありそうです。
でも困ったことに、現在、RasPiはWIFIをつかったスタンドアロンでVOLUMIOのみを動かしている状態で、
モニターもキーボードも何もないため、手も足もでない状態です。


さてさて・・・

スタンドアロンでPiPA5756Dualを3D動作させよう! 2018.2.17

自分のオーディオ環境であつかうとすれば、PiPA5756Dualはスタンドアロンで動作させたほうが便利そうです。
というわけで、3D用のPICのプログラムを作成してみました。

遮断周波数は8種類
 サブウーハの遮断周波数は8種類を準備しました。上限は200Hzでもよいかな〜ともおもいましたが、
周波数選択にジャンパーピンを3本つかうので、ついでなので高めも含めて8種類用意しました。
ちなにみCS4525では340Hzとさらに高い周波数の設定もできます。
選択できる遮断周波数は下記のように60〜300Hzになります。


遮断周波数用に8種類のデータコードが必要ですが、さらに44.1kHz、96kHz、192kHzで動作させた場合に
それぞれデータが変わりますのでさらに3倍の24種類のデータコードを準備します。
これが結構面倒でした。
さらに、データコードをPICのデータに書き換えることも必要です。これはさすがに手動で編集するのは
あまりにも面倒なので、変換のためのプログラムを書きました。

スピーカの接続は(3D)

スピーカの接続は下図のようになります。CH1にメインスピーカを接続します。そしてCH2はサブウーハ用です。
サブウーハ出力はLR信号をミックス(モノラル化)しているので、LあるいはRのどちかにスピーカを取り付けるようにします。

 3D構成でのスピーカの接続です。

備忘録として簡単なマニュアルも作成しました。
PiPA5756Dual_3D_PIC_Manual.pdf

またバイナリーもアップしますので、PICライターがあれば遊んでみてください。
※頒布も予定。
PIC18F26K22用の3D動作バイナリー(PiPA5756-3Dv1)

※備忘録 (CCS-Cコンパイラのバグ?)

CCS-Cコンパイラで配列を定義すると、配列の内容が書きかえらえられる可能性があるため
配列自体がRAM内に組み込まれます。しかしPICのRAM容量はそれほど大きいわけではなく、
PIC18F26K22の比較的大容量のものでもRAMは4kB弱しかありません。3Dのソフトではデータ
コードが24kByteほどあるので、とてもRAMには置けません。そのため、データコードのように
変更する必要のないデータを配列として定義するにはROM宣言を行います。
たとえば

char rom Data_table[10]={0,1,2,3,4,5,6,7,8,9};

という感じです。そうすればRAMを無駄に消費することはありません。
このように定義できるはありがたく、使用する場合は

i = Data_table[0];
j = Data_table[1];

のように普通につかえるのですが、下記のようにポインタ渡しにするとつかえないことがわかりました。

char *s;
s=Data_table;
i=*(s+0);
j=*(s+1);

この使い方ができません。なぜできないのかな〜。
でも、これに気づくのに結構時間がかかりましたが、いい勉強になりました。

ちょっとグレードアップ!

スピーカを単体で鳴らすと全く低音がでなくて、カスカスの音になります。でも、反対に少容量でもエンクロージャに入れると
とたんに低音がでてくるようになります。そこで、なんとか裸のスピーカを箱にいれてやろうと色々と探しました。

そして見つけたのが丁度大きさがマッチしそうなお茶飲みです。
当然、スピーカを乗せただけででは隙間が一杯ありますが、それらはテープで無理やりふさぎます。


こんな感じで隙間をテープで塞ぎます。


お茶のみ流用しました。


面白いのは、これだけの小さい容量のエンクロージャですが、これでも随分低音がでるようになります。
そして、これをベースにサブウーハをつけると、とたんにオーディオとしてのグレードが相当に上がります。
これで十分と思ってしまうほどですね(笑)。

やっぱりスピーカには箱は大切!ということを実感する実験でした。

休日はまったりと・・・
サブシステムに並べて音楽を楽しんでいます。
茶碗に入った(笑)スピーカがメインにして、ONKYOのD202AXがサブウーハです。
これでも十分に楽しめます。

たまにはこんなシステムで楽しむのもいいものです。


(つづく)