
今作ってる物。製作中の物を晒すのもアレかなあとも思うのだけど、とりあえ動くものができたので中間報告。
発端はfoobar2000のChannel Spectrum Panel (こんなん↓)

基板表

基板裏
こうしてみるとゴミみたいなんだけど、HDLなんか全く知らない状態から始めたので作るのに一年以上かかってるという。LatticeXP2基板にはロジックアナライザに繋ぎやすいように、上下両方にピンヘッダを装着してある。一部ピンヘッダが刺してない所は特に意味があるわけじゃなく手持ちのピンヘッダが無くなっただけという。あと写真に写ってないけどこれの他にDAI(CS8416)基板がある。
構成:
液晶:秋月液晶LTA042B010F
FPGA:デジタルデザイン誌付録 LatticeXP2 CQ-FRK-LXP2
SRAM:CY7C1041DV33
DAI:CS8416
処理の流れとしてはSPDIFから送られてきたデータをまずDAIで受けて右詰フォーマットにしてFPGAに送る。それから2048点でFFTしてからスペクトル化、バッファに書き込み。その後SRAMのデータを読み込んでドットクロック4MHzで秋月液晶に出力してる。VRAMには秋月で売られてる高速SRAM CY7C1041DV33を使用。これでダブルバッファ(左右合わせて四画面分)を作って出力している。FPGAの動作クロックは64MHzと超余裕なんだけどそんなんでも60FPSが簡単に達成できている。
これからの予定は今のところ横軸(周波数方向)がギターの指板のように純粋に対数的になってるのでこれを人間の聴覚に合わせて低域と高域の領域を狭めて、3000Hzあたりの人間の聴覚が過敏なあたりの周波数の領域を広げたい。(ラウドネス補正)
今2048点でやってるFFTのポイント数を二倍にしたい。秋月液晶の解像度は400x96と大した事無いんだけど2048点でもまだまだ低域の解像度が不足する感じ。2048点でFFTしても出力結果の半分はナ イキスト周波数以上のノイズであるから捨てなきゃいけない。実際に有効な結果はその半分の1024個で、出力結果の周波数は20Hz、40Hz、 60Hz、80Hz・・・と等差数列なので、対数的な人間の聴覚に合わせて横軸を割り振っていくと、低域の解像度が全然足りない。だけど高域は逆に余りま くってくるので表示されないスペクトルは間引きする。
FFTポイント数を二倍に上げると基底周波数1/2になると、出力周波数の差も半分になって10Hz、20Hz、30Hz、40Hz・・・となる。なのでポイント数を上げると低域の解像度が少しはマシになるという原理。
ポイント数を上げるのは速度的には問題無いのだけどリソース的に厳しい。今現在9個あるLatticeXP2の組み込みRAMのEBRRAM(18bit*1024)はFFTのIPコアだけで5/9食っている。あとDAIから送られてきたデータを保存するのに2048*16*2(LRch)で4/9食って空きが無い。その状態でさらにポイント数を倍にするとFFTのIPコアに使うメモリは9/9で、全部それだけでEBRRAMを食ってしまう。なのでDAIから送られてきたデータを組み込みRAMでなくSRAMのブランク領域に書き込まなければならないのだけど、SRAMにアクセスするmoduleが増えると制御が凄くめんどくさいことになりそうだ・・・
後やりたい事箇条書き。
・高さに応じたスペクトルの色付け→大きいスペクトルほど明るい色にしたり
・ピーク表示
・なるべくかっこいいケースにに組み込む
・ADCをつけてマイク入力、Line入力に対応
動作中の様子
音が出るので注意
音が出るので注意
コメントする