ラズピコとArduinoでFFTアナライザーを作ってみた
◆まえがき
前の記事ではオーディオ用のスペクトラムアナライザを作りました。それをベースに、チャンネルを一つに減らすことで帯域幅を拡大し、更に周波数をレンジ切り替え機能を付けました。
これってFFTアナライザーが出来たことになると思いますが、その内容を解説します。
◆機能概要
・Raspberry Pi pico (以下パイピコ)のボードを使い、出来るだけ少ない外付け部品で作ることを目指しました。そんなことでアンチエイリアシングフィルタは無し。
・パイピコのADコンバーターを使いサンプル数256点のFFTで解析。測定レンジと特性の関係は下表の通りです。
レンジ11はパイピコのADCの値を analogRead() で読んで保存した時の最高速の状態です。DMAを使えばもっと速く動くようですが、今回はそこまでやっていません。
◆回路図
◆実装の状態
・幅を拡げたガニ股ブレッドボードを使っています。
・OLEDに1.3インチのSH1306を使った状態です。SD1306もソフトの変更で使用可。
・ボタンの操作でレンジの上下、過大入力時はLED点灯(GP15)
◆プログラム
Arduino IDE で作ったプログラムです。
注)
・ソフトでタイミングを作っているので、コンパイラのバージョンの違いなどで再調整が必要になるかも知れません。
・コンパイル時にビルドパスの固定をやらないとコンパイルの処理時間が長くなります。(それでも初回のコンパイルは5分以上かかります)
◆画面表示
・画面の上部に波形を表示。256点ある波形データーを半分の128に間引いて表示しています。右に波形全体の時間を表示しています。解像度が粗い(16画素)ので細かい所まで判りませんが、飽和していないかくらいは判ると思います。
・スペクトルはFFT結果の0から127までの絶対値の成分で表示。0は直流成分ですが、自動オフセットキャンセル機能があるのでちょっと待てばゼロになる(はず)。
・目盛線は0dB, -20dB, -40dBの位置で、グラフの下端が -50dB。0dBは入力電圧がおよそ1Vppです。
・スペクトルのピークホールド機能付き(ピークを記録し徐々に減衰)
・一番下に周波数の値を表示。1目盛が10画素あり、その間にスペクトルのバーが10本あります。
◆動画
◆まとめ
・ミニマムな機能のFFTアナライザですが自分専用と言うのが嬉しいです。持っていれば何かの時に役に立つと思います。
・アンチエイリアシングフィルターが無いので、折り返しの影響を注意して使う必要があります。
・SN比が悪くてメインの成分の周りにスプリアスのようなものが見えます。これはRP2040のADCのリニアリティが悪いというエラッタ(RP2040 E11)が原因なのかも知れません。
・エイリアシングの問題はローパスフィルタを入れれば解決できますが、そのためにはオペアンプを入れて信号源インピーダンスの影響を受けない状態を作る必要があります。ただ、そうすると回路が大きくなってしまうのであまりやりたくはありません。オーバーサンプリングを行って折り返し周波数を上に移動させれば問題が見えにくくなるしフィルタの設計も楽になります。何か対策するならそのあたりが落としどころかでは無いかと思っています。
・DMAを使ってADCを動かせばサンプルレート500kが得られるようなのでやってみたいです。ただFFTの200kHzレンジにはサンプリングレート512kHzが必要で、500kHzではちょっと足らないのが残念。そのためにオーバークロックしても良いけど、他の副作用を全部潰すのも面倒そうです。
- 関連記事
-
- ラズピコでFFTアナライザを作る(V0.4)
- FFT処理の入出力の値の関係を調べてみた
- ラズピコとArduinoでFFTアナライザーを作ってみた
- Arduinoとラズピコで作るオーディオ用スペクトラムアナライザが完成
- スペクトラムアナライザの上限周波数を20kHzに拡大、ESP32にも対応