aroe's memopad

スペクトルアナライザ

最終更新:

aroe

- view
メンバー限定 登録/ログイン

秋月300円液晶とCQ-FRK-LXP2を使ったスペクトルアナライザ


目標

  • foobar2000のChannel Spectruml Analizerのような見た目のスペクトルアナライザを作る。
  • フレームレートは60FPS程度目指す。これはFPGAの性能からしてものすごく余裕と思われる。
  • 入力はアナログとSPDIF両方装備
  • オシロ的な機能もできたらつける

処理の流れ

波形キャッシュ -> FFT -> スペクトル化 -> 画面描画

主要部材

液晶 秋月300円液晶
FPGA LatticeXP2
ADC PCM1804
DAI(オプション) CS8416
SRAM CY7C1041DV33

秋月300円液晶


水晶振動器

44100Hzの整数倍の周波数で、PLLを使うために10MHz以上のものを選ぶ

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あれば十分・・・・・・・なのかなぁ・・・

  • 基数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だけ用意すればいい。
後はθの変化にあわせて内部的に参照するアドレスを変化させる。
区間始め 区間終わり θ変換 y
0 π/2 そのまま そのまま
π/2 π π-θ そのまま
π 3π/2 そのまま -y
3π/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ぐらい

512x128のVRAMを作成する

EBR RAMの割り振り

4096 point FFTで行う場合
FFT Compiler 5/9
FFT結果保存 2/9
波形キャッシュ 2/9
目安箱バナー