基板を作ってみましょう!基板データはメーカさんから問題なしの連絡があり、無事製作開始になりました。次はソフトの製作にかかりましょう。フィルターデータをどうするか?チャンネルデバイダでの最大の機能は、勿論いろいろな組み合わせでのフィルターを構成することですが、そのフィルターの設定をどうするかは思案のしどころです。1つは1Hz単位で任意の周波数にて設定する場合、1つはある程度決められた周波数での固定テーブルを持つかです。どちらも長短ありますが、固定テーブルを持たせる場合は、たとえば1.1倍の等比級数でテーブルを持たせるとなる、次のように50〜16000Hz間を分割すると62個程度のテーブルが必要になります。13840実際にはこれだけ細かいテーブルを持たせれば十分なのですが、62個のテーブルを作成するが結構大変です。いうのもLPF、HPFの組み合わせに加えて入力周波数毎(44.1kHz、96kHz)での準備が必要ですので、合計62×2×2=248のテーブルが必要です。1つのデータにはBiquadフィルターでは5つの係数が必要になります。Studioでできるので、それをプログラムに1つづつコピペをするとなると結構大変です。それに絶対1つや2つはコピペをミスるだろうし・・・・どうしよう?フィルター設計を探してみる!やはり、フィルターの係数については遮断周波数が決まれば、そこから算出するための方法を調べておいたほうが良さそうです。すれば、エクセルでもC言語でも簡単に周波数テーブルが作成できます。設計」でくぐると、色々とでてきました。その中から、教科書的な資料があるようで下記にまとめられいることがわかりました。http://www.musicdsp.org/files/Audio-EQ-Cookbook.txtしかし、いまさらですが機械系の私ではありますが、学校でも伝達関数やなんかの授業はあったのでもうちょっと真剣に勉強しとけばよかったなあ〜と後悔です。麻雀ばっかりやってたもんな〜(笑)。以下は半分備忘録がわりです。実際に計算してみるさて、上記のCookBookを引用すると、下記のように計算することができます。Biquadでの式では係数がa0,a1,a2,a3,b0,b1,b3の6個があります。a2*z^-2そして、それぞれの係数の計算は下記のようになります。sin(w0)/(2*Q)です。f0は遮断周波数、Fsはサンプル周波数(たとえば44.1kとか96k)です。0.899594871さて、この計算結果と実際のPCM5142やTAS5756での係数をマッチするか確認しておきましょう。PCM5142のマニュアルをみると、フィルターの伝達関数は下記の様に定義されています。伝達関数の式の形がすこし違いますね。CookBookの係数a0で正規化されています。それにそれぞれの係数で符号や倍率が若干変わっています。Studioで係数をもとめてみました。同様にfs=44.1Kz、f0=1000Hz、Q=0.707、LPF、で計算するとこんな値になりました。さきにCookBookを用いて計算した結果とはことなります。係数の符号、倍率が違うからです。-0.817512-0.817487比較すると、微妙に小数点の下の桁で違いがありますが、ほぼ一致することが確認できました。いうことで、このCookbookの式から周波数テーブルが作成できそうです。大量のコピペが必要かと、最初は気おくれしてましたが、これでなんとかなりそうです。計算は整数で上記の係数は浮動少数点でしたが、実際のテーブルは24Bitでの整数値です。これは0が0x000000、+1が0x7FFFFF、-1が0x800000という形に変換されます。Studioでの係数も整数(HEX)であらわすと下記のようになります。この整数(HEX)への計算をEXCELでしようとしましたが、自分のPCにインストールされているEXCELはかなりバージョンが古くて@dec2hex関数がありません。こりゃ、また帰省先にもどったときにでも新しいPCで計算してみなくっちゃ。WEB上でのフリーソフトを使って変換してみました。0x975C94さて、遮断周波数が決まればBiquadフィルターでの係数の計算ができることになりましたが、PICのC言語ライブラリでsin,cosなどの関数ライブラリーあったかなあ〜。これは調べてみないと。2018.2.20ありましたね。sin,cosに含めて変数としてdouble型もつかえるようです。制御用のマイコンなのですが、doubleがつかえるとはうれしいですね。どこまで精度がでているのか調べてみないといけないです。2018.2.21変数の形としてはfloatもdoubleもありますが、どうやらどちらも単精度(32Bit)のようです。それでも十分でしょう。いうことで、PIC用にBIQUADの係数のプログラムを作成してうまくうごくかどうか確認してみました。LPFの場合はこんな感じの関数です。b0,b1,b2,a0,a1,a2,alpha,w0,c;//最初にw0とalphaを求める。b_b1=16777216+8388608*b1;b_b2=b_b0;}計算速度が速くなるように、cos(w0)の計算は1回に抑えています。PICに書き込んで実行してみると、ほぼ一致しました。計算結果の一致を確認しておきました。その後・・・その後、いろいろと調べているとTI社にbiquadフィルターの設計ツールが公開されていることがわかりました。ここからダウンロードできます。http://www.tij.co.jp/tool/jp/coefficient-calcリクエストではなくダウンロードとなっているので自由にダウンロードして使用することができます。機能としてはあまりありませんが、唯一便利なのは複数のフィルタを連結したときの総合特性が見れるのがいいです。下記はバターワースでQ=0.707でfc=1000HzのLPFを2段重ねたときの特性です。2段ですのでfc=1000Hzのところで-6dBになっています(一段だと-3dB).あと、Coeffのボタンを押せば係数も得られます。最初にこれを知っていたら、係数のコピペができるので日和っていたかもしれません。したら近い未来にコピペ地獄に陥っていた可能性大です(笑)。係数も導出することができます。2018.2.26先週末には基板は入手できる予定でしたが、ちょっとした手違いがあって手にするのは週明けになりそうです。開発準備!基板が出来上がるまでに、すこしソフト開発のための準備です。ひとつはディジタルソースには色々と周波数を切り替えられるようにSRC4137を主に使っていますが、SRC4137には毎回SPDIF信号を入力していましたが、もっと簡単にUSBを接続するだけでつかえるようにDAC2704基板を取り付けました。この基板にはパルストランスを取り付けています。SRC4137の基板の裏にはアクリル板を取り付けて、不用意なショートに備えました。SRC4137にDAC2704を取り付けました。DAC2704にはパルストランスを取り付けています。裏にはショート対策のためにアクリル板を取り付けています。基板が完成してきました。2018.2.27こんな感じで完成しました。一気に組み立てましょう!基板を目の前にするとやはり組み立てたい衝動にかられます。いうことで、夜になりましたが組みたてにかかりました。シルク間違い発見!基板裏面(半田面)ですが、いきなりシルクミス発見です。PICの真裏になりました、CpとRbの両方のシルクがあります。これはCpが正解ですね。シルク間違い発見です。一気に完成しました!ふう・・・・部品点数はさほど多いわけではありませんが、結構時間かかりました。時間の多くは部品を探す時間ではありますが・・・まずは完成したので、お出かけ用の写真をパチリです。お出かけ用の写真です。LCDを搭載した場合はこんな感じになります。今回のミスのひとつとして、あまりない間違いですがLCD接続コネクタのPin5はGNDに落ちていないことに気づきました。1.LCDコネクタ(CN6)のPin5をGNDへ接続。修正は簡単で、Pin7はGNDに接続されているので、Pin5とPin7を接続することで修正完了です。CN6の裏面で、黄色線のジャンパーが必要です。動作の確認には色々なステップがありますが、まず最初はLCDが正常に接続されているかの確認です。これについては特に問題ないことがわかりました。LCDの表示は問題ないようです。つぎは、PCM5142であるI2C通信デバイスとの通信状況の確認です。これはLCDが表示できることが確認できたので、LCDにI2C通信時のデータを表示させることで確認します。4つのPCM5142との通信は問題ないようです。簡単なプログラムを組んで!次からは、実際に簡単なプログラムを組んで個々のPCM5142が動いているかを確認します。Studioで簡単なプログラムを組んで、それをすべてのPCM5142に書き込んで、動作するかを確認します。これが完了すれば、ハード的な確認はほぼ完了であとはソフトを組むだけになります。簡単なフィルタの構成プログラムでハードの確認です。こんな感じで動作の確認中です。CH1だけノイズがでるな〜PCM5142のアナログ出力が問題ないかを確認していきます、CH1だけノイズが発生しています。PCM5142は4個ありますが、ノイズが発生するのはPCM信号の入力バッファーに一番ちかい素子になります。こんな感じでノイズがでます。?まず疑うのは半田付けの不良ですが、それはなさそうです。次は、ソフトウエアの問題かな?とも思いましたが他の3つのPCM5142からは正常な出力なのでそれもないでしょう。最後には素子の不良?かとも思いました。素子の近くのパターンを手で触れるとノイズの発生状態が変わることに気づきました。パターンに手を触れるとノイズの発生の仕方がかわります!だいたい、原因がつかめてきました。BCKラインにオシロのプローブを当てながら測定するとノイズが消えます。基板内でインピーダンスのミスマッチがあったようです。いうことで、BCKラインの途中にダンピング抵抗(51Ω)を挿入することにしました。0.25mmのパターンの途中を切断し、レジストを剥いでチップ抵抗を取り付けます。IC5の出力のパターン(黄色の→部分)にチップ抵抗を取り付けます。こんな感じで取り付けました。原因を突き止めるまでに時間がかかりましたが、無事ノイズも取れました。これでアナログ出力の確認は完了です。最終確認!最後はディジタル出力の確認です。DIV5142には4つのディジタル出力がありますが、それぞにについて出力を確認します。出力確認のためにDACを接続しますが、ここではPiDAC4497を使用しました。構成はSRC4137→DIV5142→PiDAC4497になります。CH1の出力の確認です。あわせて、ディジタルフィルターとして動いているかも確認です。簡単にfc=1000HzでのLPFをPICには組み込んでいます。4kHz周波数があがると振幅が変わっていることでディジタルフィルタとしても機能していることを確認です。あれ?さて、CH1、CH2、CH3と順調に確認が進みましたが、CH4でノイズがでています。CH4ではノイズがでています。こりゃ、BCKだけにダンピング抵抗をいれましたが、すべてラインに入れたほうがいいでしょう。いうことで、ダンピング抵抗の追加です。LRCKラインにダンピング抵抗を入れるためにパターンを一部切断。3つのダンピング抵抗を追加しました。JP4のところにも付いています。これで完了!すべてにダンピング抵抗を入れて、CH4からのノイズも消えました。CH4からのノイズも消えました。これでハードの確認は完了かな〜。あと細かいところは若干ありますが大丈夫です。ソフトを本格的に組んでいきましょう!※でも、しばらく出張続きとなるので滞りそう〜。ひさしぶりに作業再開です。2018.3.10まず、ソフトの仕様についてすこし整理です。主要なところはこんなところです。主要ブロックは各チャンネルでの基本構成は下図のようになり、それぞれ4つのBiQUADフィルタを連結してLPFとHPFを構成します。この4つのフィルタのうち、何個をアクティブにするかで-12〜-48dB/octの減衰特性を選定します。基本のフィルターの構成です。フィルターを連結した場合に、f0の位置で-3dBになるようにするには、それぞれのフィルターのQ値は調整する必要があります。これらについては、フィルターの教科書的のような内容なので、WEBでくぐればすぐにでてきます。備忘録ですが、このような値になります。-48dB/octの特性ってつかうかな〜?というくらい急峻です。−12あるいは-24dBが自然なつながりでいいかもしれません。通常のスピーカのネットワークなどは高くても-18dB/oct程度でしょう。コンデンサとコイルで-48db/octを実現しようとすると大変ですが、ディジタルだと容易に実現できるのが一つの特徴です。2.562915モノラルにも対応スーパーウーハなどをつかう場合にはモノラル構成にすることが必要なので、それも実現できるようにしておきましょう。最終段で一旦モノラル合成したのちに、再度分岐させて出力させます。BIQUADの係数を計算して、それぞれPCM5142に書き込む部分が一番のコアになります。意外と複雑なルーチンになりますが、なんとか完成しました。フィルター特性を確認しておきましょう。f0=2000HzでLPFを作成してみて、どのような減衰特性になるか一応確認しておきました。6次(-36dB/oct)まで確認したて、8次の測定はあまり意味ないな〜と思ってやめてしまいました(笑)。未測定さて、コンソール用のプログラムを書いていきましょう!骨格ができてきました。2018.3.11休日が一日あるとだいぶ出来てきました。1.フロントページ起動したときの表示画面です。基本はボリュームの表示と入力周波数の表示になります。入力周波数を表示するかといえば、入力周波数が変わるとフィルターの定数を変更する必要があるからです。それがわかりやすようにしています。フロントページ2.フィルター設定ページこれが、このソフトでの要の部分です。CH1〜4でのHPF、LPF、GAINを設定します。”<”で表示されているところが変更可能部分になります。表示については、たとえば2500Hzを2500と表示すると、LCDの表示容量が足りないので2500は2K5と表示しています。THRはその名の通り、THROUGHです。フィルター設定ページ周波数の設定は下記のテーブルを使います。隣接する周波数との差を10%以下にすれば十分でしょう。3.フィルター次数設定フィルター次数を設定します。2、4,6、8次で設定できます。8次となると48dB/octですので、かなりスパッと切れるネットワークになります。フィルター次数設定4.ステレオ/モノ設定サブウーハーなどを使う場合はモノ設定すると便利なので、モノとステレオの切り替えができるようにしています。普通のネットワークとして使う場合はステレオ設定になります。付属機能も追加します。最低限の表示ができるように、ボリューム表示用のLED(2桁)と周波数表示用のLEDをつけています。LCD以外にも表示機能をつけています。完成?しばらく、色々な操作を繰り返してバグ出し&修正を進めて、ほぼ煮詰まってきました。192kHzで動くチャンネルデバイダの完成なので、すこしうれしくなってきます。全体的にはこんな形で動作確認をしています。消費電流は?結構電流は必要です。LCDのLEDバックライト電流も含まれますが20mA程度なのでしれています。192kHzでの動作時の電流なので、これ以上にながれることはないでしょう。192kHz動作時の電流です。リセットがかからない?上記の写真構成で、DIV5142だけ電源を切って、再度電源を入れてもDIV5142が起動しません。これは容易に原因が想像できて、SRC4137から信号入力を受けていますが、ここからロジックICを介して電源が供給される形になるからです。電圧を測定すると1.3V程度かかっています。これだと、PICは完全にシャットダウンできないし、かつ動作を継続するという状態にはなりません。DIV5142だけの電源を切断します。この状態でも1.3Vの電圧が残っています。SRC4137から信号線を介して供給されています。リセットをかけるには一旦SRC4137の電源も落とした上で、両方を同時に電源ONすれば、問題なくリセットがかかります。普通は同じケースに入るはずなので電源は同時に落ちて、そして同時に立ち上がるので問題は発生しないのですが、個別に電源を入り切りするとこういう現象も発生してしまいます。SRC4137の基板の電源を落とした上で再度電源を入れます。新しい機能を追加DIV5142では基本的には4チャンネルのフィルターはすべて独立に調整しますが、クロスポイントをチャンネル間で同時に動かす場合に、いちいち2つの遮断周波数を変更するのも面倒なので、互いに連動できるようなコマンドも追加しました。すれば、4WAYの場合だと3つの遮断周波数だけを変更するだけで済みます。チャンネル間で周波数の調整が連動できるコマンドも追加しました。2018.3.13YAMAHAのフラッグシップのスピーカが置いてありました。鳴ってはいなかったけど、ピアノブラックがいい感じです。カタログを見るとクロスオーバは700Hz、4500Hzだったようです。ミッドのサイズからすると、もう少し低い領域もサポートできそうだけど、こんなもんででしょうか。それより3WAYの場合のクロスは高くても5000Hz程度でしょうか。なると、今回のチャンデバでは40-20000Hzを分割して周波数を設定できるようにしていますが、もう少し低い方の分解能をあげたほうが、調整の幅が広がるかもしれません。YAMAHAの最上級のスピーカです。ピアノブラックがいいですね。周波数テーブルを選択できるようにしてみました。現在のソフトでは周波数テーブルは1つだけでしたが、用途にあわせて変更できるようにテーブルを4つ用意して、そこから選択できるようにしました。広い範囲をカバーしています(デフォルトです)。3WAYはこれが良さそうです。2WAYを意識した分割です。テーブルを増やしたらPICのROMの使用割合も5%程度増えて、現在79%です。64KバイトのPICで79%ですから、51kバイト程度の使用です。結構なサイズになってきました。64KのPICがあるPIC18F26K20がつかえる環境にしておいてよかったです。つかうPIC16F1938では16Kワード(32kバイト)では全然足りなかったところです。Rileyフィルターは位相直線性も良好なので、評価も高いようです。フィルタの構造から2、4,8次限定です。6次の場合は自動的にButterwothとなります。フィルタータイプを追加してみました。これを追加するとROMは85%になりました。