2014/08/15

mbed NXP LPC1768+☆board Orangeで.WAVファイルの再生

Arduino UNO/Mega 2560 .WAVファイルの再生」では、非力なCPUで「16000Hz/8bit/Mono」形式の.WAVファイルを再生してみました。
今回は、mbed NXP LPC1768で「44100Hz/16bit/Stereo」形式の.WAVファイルの再生を試行します。

「44100Hz/16bit/Stereo」形式になると単純計算で44,100*2*2=176,400(Byte/s)の転送能力が必要になります。
最初のネックはSDからの.WAVファイルの読み出し速度ですが、SDFileSystemのデフォルトでは、SPIのクロックは1MHzに設定されているために約125,000(Byte/s)となり、必要な転送速度を下回ります。
実験のためにSDFileSystem.cpp内のSPIクロックの設定を24MHzに変更し、3MB/s(理論値)の転送速度にして実験しています。

SDFileSystem.cppの変更行

PlayWav.cpp (2014/8/24)
出力は前回と同様にPWMによって出力しますが、今回は44100Hzで出力します。


mbed NXP LPC1768+☆board Orange

P01. mbed NXP LPC1768+☆board Orange

P01. mbed NXP LPC1768+☆board Orange

両チャンネルのPWM出力から330Ωの制限抵抗を通して、ヘッドフォンに接続しています。


処理時間計測
上記の「mbed LPC1768」+「☆board Orange」で実行したときの処理時間を計測してみました。


SD上の.WAVファイルの読込処理時間観測(LED1の波形)

P10. 読込処理間隔

P11. 読込処理間隔

P11. 読込処理時間

P12. 読込処理時間


上記は通常の読込時間ですが、実際にはFATの読込みなどでこれ以上の時間が必要なこともあります。これを見るとNXP LPC176(ARM Cortex-M3 96MHz)でも再生中には、ファイル読込み以外の処理に使える時間は約37%位しか残りません。
(音楽ファイルを再生しながら、TFT液晶にジャケット写真などを表示するようなプログラムは厳しいかも)

PWM出力処理時間観測(LED2の波形)

P21. 割込処理間隔

P21. 割込処理間隔

P22. 割込処理時間

P22. 割込処理時間


割込間隔は、44,100Hzであれば22.675usになりますが、タイマー精度の関係から23us(誤差=約-1.4%)に設定しています。
割込処理の中での両チャンネルのPWM値の書込みに約7.6usを要しています、この割込処理中はSD(SPI)からの割込みは保留されるために読込み速度が低下します。
仮に、このPWM値の設定を行わないと割込処理時間は約0.43usと短くなります、この場合P11のSD読込処理時間は1.13msになり、空き時間の割合は約62%に増えます。
PwmOutライブラリを書替えて、実数演算を回避することで割込み処理時間は大幅に短縮できます。
(「短縮できました」ではなく、「短縮できるだろうなぁ」です( ̄ー ̄;)


この記事へのトラックバック URL :

Leave a comment