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

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

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

SDRらしくなってきた

2011-09-17 07:02:50 | ソフトウェア
AGC, IQバランス調整、フィルタ切り替え、USB, LSB切り替え、FFTデシメーションなど、やることは山ほどあるし、自分には難しいものばかりが残っているが、周波数表示もできるようになり、やっとSDRらしくなってきたところで、パチリ。
受信帯域48KHzを半分に分けて上下に表示しているが、シャッター時間と表示のタイミングが合わないのか、上下全体がなかなか撮れない。ちなみにFFTの周期は50msにしている。右端の矢印はバグ。


IQ信号のwavファイルからの復調もできているが、一旦治まったかにみえた、特定の周波数で発信音が聞こえる症状が残っている。数字の型変換をいくつかやっているが、ここらがマズくて、オーバフローしているところがあるのかも知れない。
これをつぶすのを最優先にやっていくとするか。

LCDに周波数を表示するために、数値を文字列に変換するところはC++プログラミング日記さんからatofの逆変換関数ftoaのソースをいただいた。(感謝)

画面のピクセルに合わせて、FFTのサイズを256としたが、1bin当たり48KHz(サンプリング周波数)/256=187.5Hzなので、とても実際の交信に使えるものではない。
部分的にデシメーション処理をするのもいいのかもしれないが、手っ取り早くFFTサイズを上げて、分解能を上げ、受信周波数が文字で分かればいいかな。画面と矢印は参考程度でいいか。

数値(double)を文字列に変換せねば

2011-09-12 21:52:30 | ソフトウェア
LCD表示タスクのスタックサイズを512から1024へ倍にしたら、LCDへの文字と棒グラフの両方が表示できるようになった。
表示する際にFFT_SIZEである256でループを回したり、文字のフォントを表示するときにループを回しているが、この時にスタックを使っているのだろうか。

表示関係で残っている問題点。
1. 周波数を表示するため、double型の数値を文字列へ変更する必要がある。
ちなみに数字の型変換関係では、FFT結果のfract16型をdoubleへ変換する必要があったが、固定小数点数を double に変換からソースをいただき、無事解決できた。(感謝)

(2011/09/17 追記)
bfdspライブラリを良く見たら、fract2float_conv.hファイルの中に、fr16_to_float関数があり、これを使うことにした。

2. 棒グラフの表示が右あるいは左から表示しているため、左右に流れながら表示される。
縦方向に上下に変化するように表示方法を変更した方が良さそう。




TOPPERS/JSPの周期ハンドラの優先順位は?

2011-09-07 08:02:38 | ソフトウェア
FFTの周期ハンドラに合わせてノイズが入る原因がわかった。
FFTの周期ハンドラの優先順位が、codec_callback関数より高いため、codec_callback関数が待たされているためだ。

以下、TOPPERS/JSPカーネル ユーザズマニュアルからの引用
2.6 タイムイベントハンドラ
JSPカーネルでは,タイムイベントハンドラとして,周期ハンドラのみをサポー トしている.周期ハンドラは,isig_timサービスコールの中から,サブルーチ ンコールで呼び出される.そのため,周期ハンドラの優先順位は,isig_timを 呼び出した割込みハンドラよりも一つだけ高い(厳密に言うと,isig_timを呼 び出した割込みハンドラよりも高く,その割込みハンドラよりも高い優先順位 を持つ他のいずれの処理よりも低い).

このisig_timを呼び出した割り込みハンドラが何かわからないが、おそらく優先順位は高いのだろう。
ということで、FFT処理は周期ハンドラで起動するなら、周期ハンドラ内からwup_tsk()で起床させるべきらしいが、そこまで厳密にしなくてもいいので、FFT処理タスク内の無限ループで、FFT処理後にset_flgでLCDタスクのイベントフラグを立てて、dly_tsk(FFT_INTERVAL);で一定時間待つことにして、ノイズの件は一件落着した。

あとは、LCDの文字と棒グラフの問題だ。文字の表示といっても、文字を構成している一つ一つのピクセルの表示には変わりないのに暴走してしまう。
何が原因なんだろう。

LCDへの表示がうまくいかない

2011-09-05 07:43:52 | ソフトウェア
ここにきて、LCDへの表示がうまくいかず、停滞している。

現在の処理方法としては、codec_callback関数内でオーディオ入力のIQ信号をFFT処理のinputトリプルバッファにひたすら書き込んで、FFT処理の周期ハンドラで最終の書き込み済みinputバッファを使ってFFT処理を行い、処理が終わるとイベントフラグをセットし、LCDタスクでそのイベントフラグを受けて、LCD表示を行う構成としている。

現在の症状としては、以下のとおり。
LCDに文字とFFT結果の棒グラフを表示すると、KOBANZAMEが暴走する。
文字のみ、または棒グラフのみをforループで回すと、暴走はしない。また、文字と棒グラフの1回表示ではうまく表示される。
棒グラフが表示されている時は、表示に同期してオーディオ出力にノイズが入るという症状も併発する。

FFT関連の処理で重いと思われるのは、FFT処理そのもの、処理結果の直交座標から極座標への変換処理、LCD表示がある。
この変換処理を外すと、オーディオの出力のノイズは消えることから、この処理の工夫がいるのかも知れないな。

これらの症状に加えて、EclipseのHELIOS君がご機嫌斜めというのにも困っている。
ファイルを修正したとたん、画面が消えたり、デバッグ画面でロード開始中にグレーの画面になって、ロードが終わると元の画面に回復することもあれば、強制終了するしかないなど、けっこうな頻度で起こる。
この症状は構築当初からあったのだが、何度も起こるとけっこう時間ロスになる。

FFT結果らしいものが表示ができた

2011-08-24 07:33:43 | ソフトウェア
FFTの処理ができているようなので、スペクトルをLCDへ棒グラフで表示しようとするが、簡単にはいかない。LCDへの表示は周波数などのキャラクタ表示エリアとFFTスペクトルの表示エリアを分ける予定だが、githubにあったST7735-LibraryからdrawVerticalLine関数を使わせていただく。(Thanks!)
この他にも円とか、四角形とか便利な関数が公開されている。

画面の部分クリア、2段にわけて表示など、まだまだ、調整しなければならないが、FFT結果らしき表示ができたので、とりあえずパチリ。