goo blog サービス終了のお知らせ 

-・-・ --・-  -・-・ --・-  -・-・ --・- 

不定期更新。電子工作オタクのメモなので、おもしろくないですよ。

FFTは動いているようだ

2011-08-18 21:22:38 | ソフトウェア
まずは、CFFT_Rad4_PS_PBRev.asmはVDSP+用なので、ddsのときのように、拡張子を.Sにする。
次に、section名を L1_code から、 .l1_text,"ax",@progbits に変更。
一旦、make cleanして、コンフィギュレーションからやり直す(必要ないような気がするが)。
Makefileの「アプリケーションプログラムに関する定義」の部分にFFTのオブジェクトを追加する。
 UTASK_ASMOBJS = dds.o CFFT_Rad4_PS_PBRev.o

とりあえず、codec_callback.c内で、ad1836aからの音声入力(IQ信号)を入力にして、ビルドするも、メモリ不足のエラーが出るので、FFT_Rad4_BREV.h、FFT_Rad4_Twiddle_Factors.hのファイルから、FFTサイズ256のbit reverse, twiddel factorのテーブルを抜き出して、配列として埋め込んだ。

FFT結果をシリアル出力したが、最初の数回は表示されるだけで、あとは出力されない。オーディオ出力からはトーン信号が聞こえ、光学エンコーダを回すと周波数もちゃんと変わる。
FFT結果の配列を変えて、ビルド、実効すると出力の数値も変わる。どうやらFFTは動いているようだ。正確な計算はできないが、ad1836aのコールバック周期とシリアル出力の速度を考えると、シリアル出力のバッファはすぐにオーバフローしそう。

FFT処理の作り込みに加え、LCDへの表示をキャラクタにするかイメージにするか検討してみた。LCDのサンプルプログラムのキャラクタ表示プログラムは、1文字8×16ピクセルのため、新たに1×1~1×16程度の棒グラフのパーツを作って、表示プログラムも新規に作る必要がある。
キャラクタで1ピクセルずつ、1画面送るとコマンド、位置情報を加えると389KBになる。
イメージの場合、1ピクセルをRGB565フォーマットで送るため、1画面が約41KBとなる。イメージで送った方が有利ということか。

LCDのサンプルプログラムにあった、ミッキーマウスとコメントのあるデータを表示してみる。画面更新とデータ量は変わらないので、一瞬に表示される。(ディズニーらしい画面だが、ミッキーはいない)


FFTがビルドできない

2011-08-12 21:43:19 | ソフトウェア
今回もはまっている。
ADIのBlackfin DSP library (-lbfdsp)に入っている、twidfftrad2_fr16とcfft_fr16がerror: expected ‘)’ before numeric constantをはいて、どうやってもビルドできない。
同じライブラリに入っているfir関数は問題なく使えているのに、GCC4.1でも4.3でも同じエラーとなる。

しかたないので、別の手段をとADIのBLACKFIN CODE EXAMPLESからFourier and Discrete Cosine Transform Function Setsをダウンロードした。
この中のCFFT_Rad4_PS_PBRevディレクトリには、FFT結果を周波数昇順に変換してくれるFFT関数(アセンブラ)が入っていた。

ただ、FFT結果を昇順に並べるために使う、順番を記述したFFT_Rad4_BREV.hファイルにはN=16, 64, 1024はあるが、256の場合の配列がない。どうして256が抜けているんだろう。
FFTのサイズを256にするには、この配列を作るしかないので、「はじめて学ぶディジタル・フィルタと高速フーリェ変換(三上直樹著)」に載っていたサンプルプログラムを参考にして、配列を作り、FFT_Rad4_BREV.hファイルに埋め込んだ。

メインのCFFT_Rad4_PS_P、BRev.asmはVDSP+用なので、GCC向けに変換が必要だ。
この週末にはFFTに決着をつけたいが、、、



LCDがDMAで動いた

2011-08-05 06:37:30 | ソフトウェア
長かった。
この1ヵ月はLCDとの格闘だった。

DMAで動かなかった原因は、DMAディスクリプタのNEXT_DESC_PTRの設定ミスだった。

void spi_dma_write( int nID, struct SPI_DMA_DESCRIPTOR* tSpiDesc )
{
 ・・・
 *pDMA5_NEXT_DESC_PTR = tSpiDesc;
とすべきところ、
 *pDMA5_NEXT_DESC_PTR = &tSpiDesc;
とやってしまっていた。

呼び出し側で引数に&を付けていたので、何も考えずに&を付けていたという初歩的ミス。
レジスタへの設定なので、コンパイラもエラーをはかず、まったく気がつかなかった。

今のところ、画面の更新をDMA経由でやっているが、非DMAでは画面の上部からスーッと更新されるが、DMAの場合は一瞬にチラッと更新される。
調子こいて、16ビットでやってみるが、8ビットとたいした差は感じられない。

この間、コメントをいただいていたsirius506さんとmayaさんから、いろいろアドバイスをいただき、DMAでの表示までたどり着くことができた。(感謝)


SPIのDMA転送がうまくいかない

2011-07-28 23:18:24 | ソフトウェア
このところ、すんなりいかないことが多いが、LCDへのデータ転送にいずれは、DMAを使おうと、ディスクリプタによるDMA転送を試しているが、動かない。
元は、MMRレジスタを使ったSPIのDMA転送で、CODECの初期化を行っていたが、LCDのSPI接続に合わせて、SPIはすべて割込み出力(非DMAモード TIMOD = 00)にしていた。
入力のIQ信号のFFT処理結果をLCDに表示するには、トリプルバッファによるDMA転送はぜひともやりたい。

TSTAT_WAITINGエラーが出る

2011-07-23 10:00:47 | ソフトウェア
LCDの表示、audio出力とも正常に動いているが、起動直後に次のエラーが出る。
../jsp_current/kernel/wait.c:80: Assertion `TSTAT_WAITING(tcb->tstat)' failed.
../jsp_current/kernel/wait.c:80: Assertion `TSTAT_WAITING(tcb->tstat)' failed.

tslp_tskを使っていたので、dly_tskを使うべきと変更するも変わらない。

たぶん、セマフォ関係のエラーと思うが、もう少し調べてみよう。

(2011/7/24 追記)
セマフォではなく、TOPPERSをいじり始めたころに、無限ループ内でdly_tskでタイミングを取り、LEDを点滅させていたタスクを動作確認用として残していたものが、原因だったようだ。