PSoC Creatorのトップデザイン
時間の計測には16bitタイマー(TCPWMコンポーネント)を使って処理の開始時と終了時にCounter値を取得して調べた。
取得値はUARTを使ってPCで表示。
SPI通信自体は行っていない。
PSoC Creatorのプロジェクト
https://github.com/ryood/RhythmMachine/tree/master/PSoC/PSoC_Fixedpoint_DDS_RhythmMachine
48000回ループさせて、サンプリング周波数48kHzでちょうど1秒の間にどれだけ実行時間を消費するか見てみた。
変更点 | start | end | end - start | 処理時間(s) | 比率 |
---|---|---|---|---|---|
初期 | 2 | 7792 | 7790 | 0.779 | 100.0% |
generateDDSWaveをinlineに | 2 | 7432 | 7430 | 0.743 | 95.4% |
generateNoiseをinlineに | 2 | 7245 | 7243 | 0.7243 | 93.0% |
hihatの波形生成をDDSに | 2 | 6282 | 6280 | 0.628 | 80.6% |
シーケンスを見て処理を省略 | 2 | 3967 | 3965 | 0.3965 | 50.9% |
Releseモードでコンパイル | 2 | 3322 | 3320 | 0.332 | 42.6% |
表は上から順に追加変更していったものだ。
比率(初期プログラムに対する短縮率)を見ると、「シーケンスを見て処理を省略」するとかなり速くなっている。シーケンスが0(音符で言う休符)のとき、処理を省略するというもので、かなり早くなるが、音数が増えると処理落ちする可能性がある。
「hihatの波形生成をDDSに」も結構効いている。Hihatの波形をrand()関数で作っているのをテーブル参照にした。rand関数ですらコストが高いらしい。
inline指定やコンパイルオプションの変更は多少効く感じだ。
SPI通信との兼ね合い
波形生成とSPI通信と順番に処理するとかなりカツカツっぽい。「PSoC 4 Pioneer KitでMCP4922を使う DDSで波形生成」で調べたSPI通信のタイミング
ざっくり見てサンプリング区間の50%以下で波形生成の処理を終わらせないとだめっぽい?入出力系のI2C通信の時間もあるので。
PSoC 4のSPIにはSCB(Serial Communication Block)以外にもUDB(内蔵のCPLDみたいなもの)を使ったコンポーネントもあるようなので、これもテストしてみたいと思います。
0 件のコメント:
コメントを投稿