dsPIC33FJ64GP802を使って40kHzのJJY信号を復調(CW復調)する受信機ができた。

■ 構成
-RF部(フロントエンド)
 40kHzストレート方式
-ADC入力前のアナログフィルター(アンチエイリアシングフィルタ)
 オペアンプによるBPFとLPF
-dsPIC
 ADC→ビート周波数混合→LPF(デジタルフィルタ)→DAC
-AF部
 DACの差動出力をオペアンプで増幅


■ RF部(フロントエンド)
AMラジオ用バーアンテナを使い、40kHzに同調する様にコンデンサーの容量を計算した。
40kHzのストレートラジオの高周波増幅回路であるが、最初に組んだ2SK241+2SC945では受信できず。
次に試したのはオペアンプによる2段増幅だがやはり受信できず。最後に、2SK241+オペアンプ+2SC945の多段増幅としたところ受信できるようになった。同じ周波数で増幅を重ねると回り込みによる発振が起きやすくなるし、回路素子自身で発生するノイズも一緒に増幅することになるのでSN比が悪くなる恐れもある。オペアンプはローノイズ品を使い、オペアンプ2段目のゲインは半固定VRで調整できるようにした。
2SC945のコレクタの負荷には同調コイルを接続して帯域を狭める効果を狙った。40kHzの同調コイルは既製品が無いので455kHz用のIFT(黒)を使った。0.022μFを追加すれば40kHz付近に同調するはず。実際のところコアを回して調整すると受信感度がなんとなく上がってくるポイントがある程度であり、それほど共振していないようだ。


IMG_1115

FullSizeRender

↓フロントエンド回路の受信テスト。フロントエンド+RTLーSDR(ダイレクトサンプリングモード)+HDSDRで40kHzのJJY電波を捕らえた!バーアンテナのコイルがフェライトコアの真ん中にある状態がインダクタンスが最大となる。コイル位置をスライドさせて感度最大の中心が40kHzになるようにする。
FullSizeRender

■ ADC入力前アナログフィルターとdsPIC周りの回路

ADCサンプリング処理に伴うエイリアシングノイズを低減するために、ADC入力の前にオペアンプによるフィルタを通す。
40kHz以上の帯域をなるべく減衰させる。カットオフ周波数の設定は50〜60kHzを狙った。

dsPIC_JJYreceiver


IMG_1118


■ dsPICソフトウェア
dsPIC33FJ128GP802によるAMラジオの作例があり追試してみた。採用しているdsPICの処理速度の限界によりサンプリング周波数は195kHz 設定なので、入力できる信号は100kHz程度が上限。作例では中間周波数をかなり低目の15kHzにしている。AD変換後はdsPIC内でフィルタリングとAM復調(全波整流)をソフトウェアで処理してオーディオ信号をDACから出力する。
今回はこの作例のdsPICのプログラムをベースにした。ベースからの変更点は以下。
-クロック数を50MHzから40MHzへ変更 (ADCサンプリング周波数は156kHzとなる)
-ビート発生用信号(サイクリング周波数÷4)生成の数値テーブルの追加
-ビート発生用信号とのミキシング(乗算)
-デジタルフィルタの変更(BPF+LPF) → LPF

50MHz設定はオーバークロックである。初めは50MHz設定で動作していたが、ある時からdsPICが起動しない現象が頻発するようになった。
40MHz設定に変更したところ問題なく起動するようになった。(オーバークロックで連続通電して使うには無理があるようだ)
ビート発生用信号とのミキシングは、無変調の40kHzJJY信号をビート音に変換するために追加したもの。ビート発生用信号の周期をサンプリング周期の整数倍とし、数値テーブルでソフトウェア上でビート発生用信号を発生させる。ビート発生用周波数は、サンプリング周波数÷4 = 39.0625 kHz としたので、ビート音周波数は40kHzとの差である937.5Hzとなる。理想的なビート発生用信号としては正弦波に近いものが歪みが少なくて良いが、サンプリング周期×4回で利用する数値テーブルでは正弦波にはほど遠い方形波みたいな波形しか作れない。ミキシングした信号には高周波がたくさん出るであろうがローパスフィルタでカットする。ローパスフィルタはFIRとし、カットオフ周波数fc1(パスバンド周波数)は1000Hzとした。フィルタ係数はDSPLinkを使ってRemez法で求めた。得られるカットオフ特性はタップ数でかなり変わってくる。タップ数は多いほど急峻なフィルタ特性が得られるようだがdsPICの演算パワーで上限が決まる。今回は100タップとした。127タップは無理のようで動作せず。
以下はDSPLinkの計算特性。カットオフ周波数fc2(ストップバンド周波数)はなるべく下げて急峻なカットオフ特性としたいところだが、高域全体の減衰量があまり下がらなくなるようだ。fc2は2500Hzとした。(fc2を5000Hzにすると広域全体の減衰が-60dbとかなり減ってくれるが聴感はシャーノイズが目立った)

ビート周波数発生の原理をちょっと復習。
40kHzのJJY信号に39.0625 kHzのビート発生用信号をミキシングすると、40kHz±39.0625 kHzの信号が得られるという理屈を式で表現すると…
\[
sin \omega_{jjy} t   \times cos \omega_{beat} t =  \frac{1}{2} sin \big(\omega_{jjy}- \omega_{beat}\big)  t+\frac{1}{2} sin \big(\omega_{jjy}+ \omega_{beat}\big)t\
\\

\omega_{jjy}:JJY信号周波数,\quad
\omega_{beat}:ビート発生用信号周波数

\]
つまり、2つの信号を乗算にかけると、2周波数差と2周波数和の信号からなる信号に変換される。周波数和の方はローパスフィルタでカットすると周波数差の信号だけをビート音として得ることができる。振幅が1/2になるので乗算結果は2倍したい。
プログラム中の信号はDSP演算のためにfractional型(16bitの符号あり固定小数点表現)変数にしているが、fractional型変数同士の乗算をどうすればよいのか悩んだ。long(32bit整数)変数に移して、普通に掛け算したあとに15ビット右シフトさせてfractional変数に入れなおす、なんてまどろっこしいことをしてとりあえず動いていたが、DSPライブラリのVectorDotProduct関数を使えばよいことに気が付いた。ベクトル長=1としてベクトル乗算すればよい。コンパイラが作るアセンブラリストを見たところ、よくわからないが確実にステップ数は減っているので最初からこうすべきだった。本当は最初から部分的にでも演算だけアセンブラで書ければよいのだが、変数からレジスタに値を移す方法が理解できていないので無理。

https://github.com/TakeshiKamimoto/SDR_JJY_Receiver.X.git

LPF設定比較検討[2305843009214251780]


■ AF部
オペアンプ(低電圧電源対応)によるイヤフォンアンプを追加した。半固定抵抗で可変ゲインとしたので音量調整ができる。



■ まとめ
JJYの電波をCW音として聴くという簡単なことをわざわざデジタル処理でやることはないのだが、SDRを自作できたと言える。
室内(集合住宅)でも窓際であれば十分にJJYのパルス音が聴ける。しかし夕方など時間帯によってはノイズに埋もれるのかJJY 信号の音は全く聞こえなくなってしまう。朝方から午前中は周辺ノイズが少なくなるのか比較的よく聞こえる。長波は不思議だ。

マイコンによるSDRはADCのサンプリングレートが鍵になる。新しいdsPICはもっと早いクロックで走るデュアルコアになっているし2MSPSのサンプリングレート能力があるみたい。いや、ArmのSTM32もDSPを積んでいてADCも速くて良さそうだ。
IMG_1119




■ 参考にした情報

dsPICによるディジタルフィルタの実装
 


・SDRラジオ制作例





・フィルタ設計理論



・フィルタ設計



・dsPICについて



・dsPIC  DSPライブラリ 説明書 (Microchip)
      dsPIC Language Tools
  16ビット言語ツールライブラリ