秋月300円液晶とCQ-FRK-LXP2を使ったスペクトルアナライザ
目標
- foobar2000のChannel Spectruml Analizerのような見た目のスペクトルアナライザを作る。
- フレームレートは60FPS程度目指す。これはFPGAの性能からしてものすごく余裕と思われる。
- 入力はアナログとSPDIF両方装備
- オシロ的な機能もできたらつける
処理の流れ
波形キャッシュ -> FFT -> スペクトル化 -> 画面描画
主要部材
液晶 | 秋月300円液晶 |
FPGA | LatticeXP2 |
ADC | PCM1804 |
DAI(オプション) | CS8416 |
SRAM | CY7C1041DV33 |
秋月300円液晶
- H96*W400px 18bit Color
- 色々うざい仕様
- 3.3Vでもいけるらしい
水晶振動器
44100Hzの整数倍の周波数で、PLLを使うために10MHz以上のものを選ぶ
- x256 = 11.289 MHz
- x364 = 17.022 MHz
- x512 = 22.579 MHz
CY7C1041DV33
- フレームバッファに使う
- 非同期SRAM
- 秋月で売ってる
- VCC=3.3V
- W/R Cycle 10ns
- 44pin SSOP
- 非同期
- 16bit word * 256K
- 入力ピンと出力ピンが共用
- WE~ LOW to High-Z: 5ns
ADC
- PCM1804 2ch 24bit 192KHz ADC
- いらないサウンドボードからはがした
- 明らかにオーバースペック。
処理
波形キャッシュ
- 1/44100 = 22.67[us]
- 44100/60 = 735
- 1024サンプル
- 1024/44100 = 23.2[ms]
- 基底周波数: 1/0.0232 = 43.066[Hz]
- 2048サンプル
- 2048/44100 = 46.4[ms]
- 基底周波数: 1/0.0464 = 21.533[Hz]
- 4096サンプル
- 4096/44100 = 92.8[ms]
- 基底周波数: 1/0.0928 = 10.766 [Hz]
1/60 = 16.6ms
縦96pxということを考えると量子化ビットは9bitあれば十分・・・・・・・なのかなぁ・・・
縦96pxということを考えると量子化ビットは9bitあれば十分・・・・・・・なのかなぁ・・・
- 基数4FFT,基数2FFTに要するクロック
メモリの速度とかは考えない。200MHzで動作している状況を考える。
- 基数2 512 * 10 = 5120 /200MHz = 25.6us
- 基数4 256 * 5 = 1280 /200MHz = 6.4us
基数2でも十分早い。基数4でFFTやる必要は無いかも
Sine-Cosine Table
IP ExpressのSine-Cosine Tableはθの入力が1024までのIPしか出力できないので
より大きい値でFFTを行う場合自分で作成する必要がある。
Sine波は左右上下対象なので波形の1/4だけ用意すればいい。
後はθの変化にあわせて内部的に参照するアドレスを変化させる。
より大きい値でFFTを行う場合自分で作成する必要がある。
Sine波は左右上下対象なので波形の1/4だけ用意すればいい。
後はθの変化にあわせて内部的に参照するアドレスを変化させる。
区間始め | 区間終わり | θ変換 | y |
0 | π/2 | そのまま | そのまま |
π/2 | π | π-θ | そのまま |
π | 3π/2 | そのまま | -y |
3π/2 | 2π | 2π-θ | -y |
画面描画
VRAM
- 400*96[解像度] * 16[カラー] = 76,800 Byte
転送レート
- 76,8KB[画面] * 60[FPS] = 4,608KB
ドットクロック
もっとも効率よくVSyncとHSyncを入れれば画面一回更新するのに必要なクロックは
53993 Clock 60FPSだと * 60 = 3,239,580 なので ドットクロックは3.239MHzぐらい
53993 Clock 60FPSだと * 60 = 3,239,580 なので ドットクロックは3.239MHzぐらい
512x128のVRAMを作成する
EBR RAMの割り振り
4096 point FFTで行う場合
FFT Compiler 5/9
FFT結果保存 2/9
波形キャッシュ 2/9
FFT Compiler 5/9
FFT結果保存 2/9
波形キャッシュ 2/9