私の持っている受信機のいくつかには455kHzのIF出力端子がある。 サウンドカードのサンプリング周波数は最高48kHzだから到底だめ、 かとも思ったが、サンプリング定理の教えるところによれば、 「帯域の制限された信号の場合には、帯域幅の2倍以上のレートで サンプリングすればよい」ということである。 どうせ帯域はセラミックフィルタだのクリスタルフィルタだので すでに500Hzとか3kHzとか6kHzとかに制限されているから、 もしやそのままサウンドカードに突っ込んでもできるのでは?と 思ってやってみたがやっぱりだめ。anti-aliasing用のフィルタが 入っているのだろうし、それともそもそも無理なのか(友人によれば やっぱり駄目だそうです)。
仕方がないのでIF信号をもっと低い周波数に変換するコンバータを作ることにした。 当初は、90度位相のずれた2つの455kHzの信号を局発にしてオーディオ帯域 に変換し、二つの出力をサウンドカードのステレオのLRにそれぞれ入力して、 あとをDSPで処理することも考えたが、結局メーカ製のアマチュア機が やっているように10-数10kHzのもう一段低いIFに変換することにした。 今のところIFは12kHzにしている。
455kHz -> 12kHzのコンバータは、先に作ったAM同期検波器 がまずまず うまく行ったので、それとほぼ同じ回路にした。 ミクサはLM1496、局発は水晶を注文するのが面倒なのでLC発振である。 配線は10cm四方の生基板の上にICを逆さにつけて空中配線している。
このコンバータは1999年の夏のある日に作ったが、 そのあとずっと放ったままになっていた。 年があけてようやくプログラムを書く気になった。
受信機からの455kHzのIF出力はダウンコンバータで12kHzに周波数変換され、 PCのサウンドカードに入力される。
入力された信号は、A/Dコンバータで符号付き16bitの数字の列に 変換される。サンプリング周波数は48kHzにしている。
まず、入力信号(今回は12kHz)を90度ずれた二つのキャリアとそれぞれ かけあわせて信号周波数をベースバンドに移す。 かけあわせるキャリア周波数は12kHzで、ちょうどサンプリング周波数の 1/4になるため、{1,0,-1,0,1,0,....} と{0,1,0,-1,0,1,....} という 二つの数字の時系列が「互いに90度ずれた12kHzのキャリア」を表現 していることになる。すると、かけ算といっても値は0か-1か1しか ないので計算が簡単になる。
このあとはせいぜい上限3-4kHz程度の周波数を扱えればよいので、 サンプリングレートを1/4の12kHzに下げる(decimationという)。 具体的には単に4つのサンプルのうち3つを捨てるだけである。 ただし、サンプリングレートを下げたときにaliasingが生じないように、 あらかじめ帯域を制限しておく必要があるので、 軽くローパスフィルタを入れている。
次に二つの信号のうち片方の信号の位相を(帯域内のすべての周波数で) 90度ずらす。アナログのPSNではこれが一番難しいのだが、DSPの世界では ヒルベルト変換器(Hilbert Transformer)を用いて比較的簡単に実現できる。
その後のフィルタは最終的な帯域決定用である。今は特に入れていない。
最後に二つの出力を加算または減算すればUSB/LSBの復調出力が 得られる。あとはサウンドカードのD/Aコンバータがアナログの オーディオ出力に変換してくれる。
ある日の夕方のNHK(9550kHz,USB)の復調結果(wavファイル)
ある日の昼のBBC(21660kHz)の復調結果(wavファイル)
(2000年3月17日)
同期したキャリアの再生はPLLでやっているのだが、なかなか
うまくロックしてくれない。ループフィルタを色々いじっている
うちになんとなくそれらしく動くようなものが出来たが、
どうも納得行かない。また、現状ではフェージング(fading)の
谷では同期がはずれるみたいで変な音になる(下のwavファイルの
中の"the latest timetable"の'latest'のところ)。
上のと同じBBC(21660kHz)を同期?検波した結果(wavファイル)
SSB検波のプログラムを少し変更して、ソフトウェアで上と 同じことをやるようにした。最初ステレオでサウンドカードに 出力するやり方がわからなかったが、1. パラメータ設定のときに channelsを2にする。2. 出力時にLRチャネルのデータを交互に 書き込む。 というやり方でできることがわかった。
一応できたが、まだ実際の信号はほとんど聞いていないので 効果を調べるのはこれから。