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

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

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

post mortem dumpが発生

2011-12-24 18:57:19 | ソフトウェア
光学エンコーダを目一杯早く回しても、割込みはちゃんと応答して周波数の変更ができる。
しかし、ゆっくり回していても、ときどきpost mortem dumpが発生して、blackfinがハングアップする。
このpost mortem dumpというのは、酔漢さんがデバッグ用に用意してくれた仕組みで、異常発生時のレジスタ等を保存しておき、ダンプしてくれる。
ダンプ内容とjspファイルをnmコマンドで出力した変数や関数のアドレスを比較して、めぼしをつけようとするも、どこが原因なのかわからない。
いろいろ機能をしぼりながら、何回かpost mortem dumpが吐き出した内容を調べると、当然アドレスは変わるものの、同じ変数や関数を示している。
デバッグに根気は必要だが、もっと効率のいい、デバッグ方法があるのかも知れない。

LCD表示にサイドバンド切替えとゲインを追加

2011-12-11 19:58:32 | ソフトウェア
光学式エンコーダのスイッチを割り込みで受けて、サイドバンド、ゲイン、周波数のメニューを選択して、赤字に変えたうえで、回転させることにより、USB、LSB切替え、ゲイン変更、周波数変更するようにしてみた。

一つのエンコーダでのメニュー切替え方式はどうかなと思っていたが、まあまあいけるかも知れない。

残りのやりたいこと。
1. 分解能を上げる
とりあえず、FFTのサイズを1024当たりにしてみるか。

2. FFTの表示を滑らかにする
今は50mS毎に表示しているが、表示がちょっと忙しい。単純に速度を下げればいいのでもなさそう。あまりメモリを食う処理もできないし、どうすればいいんだろう。

3. サンプリング周波数を上げる
48KHzから96KHzあげても大丈夫か。

(2011/12/12 追記)
Sメータの表示を忘れていた。
Sメータの仕様から勉強せんといかんな。


前回の発振音の原因は間違いだった

2011-11-26 10:41:42 | ソフトウェア
前回の記事で、負の周波数受信時にdds(NCO)のsin、cosを入れ替えて発振音が停まったと書いたが、正と負の復調の場合に、ddsの周波数とサイドバンドの位置が0Hzを中心に対称になるのが気になっていた。
LabVIEWで検証すると、正と負でddsの周波数とサイドバンドの位置は同じだ。USBならddsの右側にサイドバンドがある。

どうしても納得いかないので、Interface誌2007年12月号の複素信号処理の記事とLabVIEWのプログラム、それと今回のSDRのプログラムを比較していたところ、今回のプログラムにミスがあった。入力のIQ信号をddsで周波数変換したあと、複素BPF(FIRフィルタ)をとおすが、この処理で複素BPFの実部と虚部を逆にしていた。これが逆になっているということは、正の周波数の場合はUSB、負の周波数の場合はLSBとして受信していた。
どうも実部を虚部をIn-phaseとQuadrature-Phaseまたは、RealとImaginaryのペアで記述している資料多いが、省略した場合は、IとQまたはReとImと表現している場合が多い。自分の場合はrとiを使ったため、iとIを勘違いして、複素BPFの実部と虚部を逆にしてしまっていた。
これを戻すと、また発振音が聞こえてきた。

その後、いろいろ試行錯誤していたが、ノートPC用に購入したUSBオーディオをデスクトップPCに挿してLabVIEWで確認してビックリ。
な、なんと0Hzに信号成分が立っているではないか。そして、KOBANZAME基板と同様に-3000~0Hzで発振音が聞こえる。
いろいろSDR関連の情報を調べると、オーディオカードの性能により、イメージの発生状況が違うとの報告が多いが、原因はADCの問題だろう。

で、結論として、発振音の本当の原因はIQ信号をAD1836AでAD変換した後のDC成分の影響のようだ。
このDC成分(0Hz)がddsの負の周波数の-3000~0Hzの場合に、0~3000Hzに周波数変換されて、これがUSB用のフィルタを通過してddsの発振周波数が出力に出るようだ。

AD1836Aのデータシートを見ていくと、
A digital high-pass filter can be switched in line with the ADCs under SPI control to remove residual dc offsets. It has a 1.3 Hz, 6 dB per octave cutoff at a 44.1 kHz sample rate. The cutoff frequency will scale directly with sample frequency.
とある。
ならば、ADC Control Register 1でHigh Pass Filterを設定して、サンプルのwavファイルを入力すると、多少のノイズは残るものの、発振音は消えて、通信内容は聞こえる。やっと解決だ。

ここまでわかるまで、えらい時間がかかったが、これからやっと表示関係の充実にかかれるな。


発振音の原因がわかった

2011-10-30 19:02:24 | ソフトウェア
firフィルタの係数をいろいろ変えても、発振音がなくならなかったが、やっと原因がわかった。
原因はddsに負の周波数をセットしても、正の周波数と同じ位相で出力されていたためであった。
酔漢さんのサイトやtalkthroughのソースにも負の周波数の場合は、sinとcosを入れ替えてあったのに、気がつかなかった。
LabVIEWの場合は負の周波数を入れると、sinとcos波が自動的に入れ替わっていたので、ddsもそうなるものと信じ込んでいた。

今回のトラブルはノートPCの音声入力がステレオだと、もっと早く気づいたかもしれない。
USBオーディオという、オーディオ入出力をUSB経由で行うものがあるが、これって本体内臓のマイク入力と出力と同じように、オーディオアプリから使えるんだろうか。
これが、ソフトオシロなどで使えるのなら、欲しいな。

LCD画面にノイズが入る

2011-10-11 08:03:21 | ソフトウェア
久しぶりの書き込みになってしまった。
特定の周波数帯域に発振音が入る現象は、完全にはつぶせていない。

これまでにやったのは、STKでの信号処理から、libdsp内の関数を直接呼んで処理する方法に変えて、callback関数内でloopを回すことにした(STKとは同じ処理と思う)。
このほか、信号処理はfract16で処理するため、audio-in信号は24bitのADC出力だから、8bit右シフトした。
これで一応、高い周波数帯域の発振音は消えたが、0~-3000Hzの帯域での発振音が残っている。
実部と虚部のfirフィルタを外すと、0Hzを中心に+-3000Hzで発振音が聞こえるので、firフィルタに起因しているのかも知れない。
今度はfirフィルタの係数を変えてみよう。

発振音の原因をつぶせていないのに、LCD画面にノイズが入るという問題が発生している。

いつの時点からか、記憶は定かではないが、写真にあるように、0.5秒か1秒の周期でノイズが入る。
音声にはノイズが入っていないので、FFT処理かLCD表示処理の問題と思う。