« dsPIC33CH トラブル事例 | メイン | とうとう故障・・・修理依頼 »

2021年11月21日 (日)

dsPICでバンドスコープ 1 

dsPICを使った自作のSSBトランシーバーにバンドスコープを追加しようと、トライしましたが、2nd IFの帯域幅が6KHzしかなく、全く役に立ちませんでしたので、帯域幅をせめて50KHz以上確保できるバンドスコープを一から検討する事にしました。

せっかく作るなら、ダイレクトコンバージョン受信機にして、SSBの復調も出来るものをと、欲張った結果、これが失敗で、2か月も棒に振ることなってしまいました。 その断片はここで紹介しています。

採用したDSPは、2ch同時AD変換可能なdsPIC33CH64MP202、秋月で400円でしたが、前回製作したSSBトランシーバーのようにはいかず、SSBの復調音を出す事にこだわったのがいけなかったようです。 そして、+/-50KHzのバンドスコープとSSB受信機は、400円のdsPICでは両立しないという事を悟る事になってしまいました。

PCを使用したバンドスコープの帯域幅は使用されているサウンドカードの中に有る、ADコンバーターのサンプリング周波数にほぼ等しく、沢山あるインターネット上の解説でもナイキスト周波数以下のプラス周波数とマイナス周波数を使えるから実用可能な帯域幅はナイキスト周波数の2倍、すなわち、サンプリング周波数と同数の帯域幅が得られると説明されています。

また、ダイレクトコンバージョン式の受信機の場合、ADC前のアンチエイリアシングフィルターを簡単にする為、オーバーサンプリングを行い、デジタル処理の中で、デシメーション処理を行い、デジタルフィルターを有効活用すると解説されています。

これらの、情報から、バンドスコープも、オーバーサンプリングやデシメーションが有効であろうと、勝手に判断して、下のブロックのようなバンドスコープを、ああでもない、こうでもないと、さらに1か月もつぶしてしまいました。

Bandscorp2024_2

構想は、XC16でFFTの記事で紹介したfft4g.c によるFFTが緑色の部分になりますが、ダイレクトコンバージョン受信機のIQミキサーで作成されたI信号をFFTの入力配列である a[k*2] に渡し、 Q信号を a[k*2+1]に渡して、FFTを実行させ、出てきた実数と虚数のデータをそれぞれ2乗した後加算し、これをLCD Displayで表示するというものです。

左下のLCD画面は、上のブロック図の緑で示すFFTブロックとその後ろに繋がるブロックのみにして、(左側の全てのブロックが無い状態) FFTの実数枠にsin信号を、虚数枠に0.0の数字を入れたもので、出ているスペクトルは+/-15.625KHzの信号です。 右下のスペクトルは、実数枠にはsin信号を、虚数枠にcos信号を加えたもので、-15.625KHzのスペクトルが消えています。 この実験では、サンプリング周波数を50KHzとしましたので、ナイキスト周波数以下の、+/-25KHz、合計50KHzの帯域のバンドスコープが実現できる事を示しています。

256ポイントのFFT結果をLCD上に表示するに当たり FFTが出力した a[] の配列の0から255までが、0KHzから25KHzを表し、256から511までが-25KHzから0KHzを表しますので、グラフ化する時点でデータを並べ替えてあります。

Fftwithimage

Fftnoimage

for (k=0;k<256;k++) {
     a[k*2]=sin(2.0*PI*k*15625.0/50000.0);//spot周波数/サンプリング周波数
     a[k*2+1]=cos(2.0*PI*k*15625.0/50000.0);
//  a[k*2+1]=0.0;
}

FFTexec();//FFT実行

実験に使ったsin cos信号は上記のようなもので、FFTの a[] 配列に代入した後、FFTを実行させています。 a[k*2+1]=0.0; は左側の画面が得られる時の代入式です。 窓関数をかけていませんので、スペクトルが細くなるスポット周波数を選んで実験しました。

また、写真はありませんが、サイン信号とコサイン信号を入れ替えて負の周波数にしてやれば、-15.625KHzのところにスペクトルが現れ、+15.625KHzのスペクトルは消えます。

 

以上の確認が終えた後、実際にブロック図のごとくデジタル処理を行ったのですが、どうしてもイメージが消えません。キャリア周波数から1~3KHzくらいなら-10dBくらいのレベル差はつきますが、それ以上の周波数ではだんだん差がなくなり、25KHzも離れるとほとんどレベル差は無くなってしまいます。 また、正の周波数も負の周波数もそのスペクトルの位置は同じで、グラフ上の右半分しか機能しません。 まる3日、弄り回して、結局判らず、あきらめました。

dsPIcのメモリー容量が許す限り最大のTAP数でフィルターを構成したのですが、ダメでした。 固定小数点が使えないので、極性付き整数計算をしている事が原因かもと考え、FFT単体のテストの時、FFTの入力に加えるサイン、コサイン信号を12bitの極性付き整数とし、これを浮動小数点に変換したもので行っても正常に動作しておりました。

本当の原因は判らないままですが、これでバンドスコープをあきらめたくないので、サンプリング周波数100KHzで正の周波数しか使わないバンドスコープを作る事にします。

Bs_block_2

上がそのブロック図でFFTの虚数枠に加えていたQ信号を切断し、ここには0.0を代入し、かつデシメーション後のサンプリング周波数を100KHzとして、帯域を50KHz確保します。

 

Fft7172a

Fft7172b

上の2枚の画像は7150KHzから7200KHz間の50KHzスパンのバンドスペクトルです。 画面上には50KHzサンプリイングと表示していますが、実際は100KHzです。  ちょうど、レーダーパルスが7100KHzくらいでパタパタと激しく出ており、そのあおりで、イメージ混信だらけになっている状態です。左がパルス有り、右が一瞬パルスが無いときの状態です。

やはりイメージ対策をちゃんとやらないと実用化できないという見本になりました。

半分諦めていたdsPICによるバンドスコープでしたが、サンプリング周波数と同じ帯域幅を確保できるバンドスコープを諦めきれず、何か思いつけば、実験を続けてきました。 そのなかで、以下のように、100KHzのサンプリング周波数で100KHzのバンド幅を確保できる条件を見つける事ができました。

Bs20k

Bs20k_2

左上が7120KHzの信号を受けた状態、右上が7080KHzの信号を受けた状態です。 左の+20KHzのイメージは-30dBくらいを確保して、グラフ上では見えていません。 右の-20KHzでは、-17dBくらいしか確保出来ていませんが、トータルで100KHzのバンド幅を確保出来ています。

この状態を作る条件は以下のブロック構成で実現できました。

Bs_block3

 ダイレクトコンバージョン受信機で、アナログによるIQミキシングを実施した後、OPアンプ2段によるアンプ兼3次のCRフィルターを経由して、dsPICへ加え、ここで100KHzのサンプリング周波数でAD変換した後、いきなり、FFTに接続しました。ADCのデジタル出力には一切手を加えていません。 その結果、イメージの完全除去は出来ませんでしたが、そこそこのスペクトル表示が可能になったものです。 もちろん、IQミキサーとその後段のフィルターがアナログですので、全帯域で90度の位相差とレベル差ゼロを確保するのは難しく、キャリアの位相調整の為に、トリーマーを追加したり、レベル調整の為に半固定抵抗を追加したりして、調整した結果です。 また、0KHzのところに立つスペクトルはDCオフセットが出ているもので、これも半固定抵抗を追加し、オフセットを最小に調整できるようにしました。

色々調整した結果、プラスとマイナスの周波数でレベルが一致しなく、片方をベストに調整すると、反対側のイメージが増加するとい繰り返しで、どこかで妥協するしかありません。 一応20dBくらいあれば、外来ノイズでイメージが判らなくなりますので、実用的には、使えるかも知れません。 実力を見ようと、7MHzをワッチしましたが、いつも以上の強さでレーダーパルスが発生しており、写真に撮るのはまたの機会にします。

この構成の配線図は以下です。 DAC出力は一応オーディオアンプ経由でスピーカーへつながっていますが、実際には使用していません。 この音声出力はイメージ処理をしていませんので、隣のチャンネルの音声がUSBモードで混信します。

dsPIC_Bandscorp_2.pdfをダウンロード 

MCLR端子にあるC24 103Kは時々、ICのIDを返さない原因でしたので、廃止しました。

ソースファイルを以下に示しますが、不要な関数や変数などが含まれています。

Config_BandScorp.hをダウンロード

MAS_Bandscorp_2.cをダウンロード

SLA_Bandscorp_2.cをダウンロード

float_TapFIR_B3k_S200k_T125_BPF.hをダウンロード

Font12.hをダウンロード

FFT関係とその他のフォントはこちらを参照ください。

 

Wf2

左は、64行のウォーターフォールを追加した画面です。

レベルによる色の階調は4bit 16階調とし、1バイトの中に、2ピクセル分のデータを収納し、データメモリー98%の使用状態でなんとか実現できました。

真ん中の赤のラインはDCオフセットの漏れで、右側のレベルの高い信号が本信号で左側の低いレベルがイメージ信号です。 この状態はSSGからATT経由で信号を入れていますので、ノイズレベルが少なく、イメージ信号が、はっきりと見えていますが、実際のアンテナに繋ぐと、外来ノイズによりイメージ信号はわからなくなります。 

実際の7MHzのバンドスコープは下の画像になります。 左下は午後8時ごろの7150+/-50KHzのスペクトルです。この時はレーダーパルスは有りませんでした。 50KHz以上離れた信号によるエイリアシングノイズは取り切れていなく、いくつか表示されています。 右下は、7150KHz付近にレーダーパルスが出ていましたが、低い周波数では、あまり影響がなく、午前10時くらいのスペクトルです。 +/-0KHzのDCオフセットのスペクトルは強制的に表示しないようにしました。

Bandscorp3

Wf12051

このウォーターフォールを実現する為にはMasterのソフトだけを、前述のソフトと交換すれば可能です。

ウォーターフォール付きマスター用ソフト

MAS_Bandscorp_WF.cをダウンロード

 

これらのスペクトルは、AD変換したデータをいきなり、FFTへ渡したもので、例えば、一度、未使用のワーキングレジスタや、グローバル定義した変数に移し、これを元のワーキングレジスタに戻した後、FFTへ渡すと、90度の位相差が崩れてしまい、実質位相差なしとなり、イメージのスペクトルが発生します。 なにが原因なのか判りません。

そこで、バンドスコープはここまでにして、dsPICの正しい使い方を勉強する為に、dsPICの実験に戻る事にしました。 そして、ここに書いたような問題の為、このDual Core dsPIC33CHはSDR向きではない(Microchipはデジタル電源やモーター制御用と言っている)という事が判りましたので、これ以上の検討は中止しました。

 

INDEXへ戻る