ラジオの自作華やかなりし頃には、雑誌に普通のAMラジオでアマチュア無線バンドを聞く方法がよく紹介されていました。たいていはクリコンと呼ばれる水晶発振式ダウンコンバーターでAM帯にアマチュア無線帯を変換していました。
周波数を変換しても、SSB信号をAMラジオで聞くことはできません。そこで、BFO( Beat Frequency Oscillator )という装置を使ってAMラジオでSSBを聞いていました。以下ではこのBFOを使った場合のSSB復調をソフトウェアで実装してみました。
MCMを使って一度12KHzのUSB信号を作り、それをダイオード検波します。しかしこのままではきちんと聞こえません。そこで、ダイオード検波の前に抑圧された搬送波と同じ周波数の信号を混入させます。この信号を作る発信機をBFOと呼びました。この信号の混入でSSB信号は搬送波を得ることができますのでLSBのないAM信号となり、ダイオード検波が可能になります。
図1 BFOを使ったSSB復調のブロックダイアグラム
以下のプログラムではBFO周波数は10.5KHzです。また、検波信号にはDC成分が乗っているため、最後にBPFでDC分をカットしてみました。
void CModulator::handleBuffer( struct mcm::sample * bufTx, struct mcm::sample * bufRx ) { short step; step = sizeof(mcm::sample); // make stereo to monoral stk::copy( in, &bufRx[0].r, bufSize, 1, step ); // Weaver方式SSB変調 osc1->run( lo_i, lo_q, bufSize ); // 副搬送波生成 stk::mul( temp_i, in, lo_i, bufSize ); // 第一MIX stk::mul( temp_q, in, lo_q, bufSize ); lpf_i->run( temp_i, temp_i, bufSize ); // 高域カット lpf_q->run( temp_q, temp_q, bufSize ); osc2->run( lo_i, lo_q, bufSize ); // 搬送波生成 stk::mul( temp_i, temp_i, lo_i, bufSize ); // 第二MIX stk::mul( temp_q, temp_q, lo_q, bufSize ); stk::add( temp_i, temp_i, temp_q, bufSize); // USB // BFO検波 osc3->run( lo_i, lo_q, bufSize ); // BFO生成 stk::add( temp_q, temp_i, lo_i, bufSize ); // BFO混入 stk::max( temp_i, temp_q, (short)0, bufSize ); // ダイオード検波 bpf->run( temp_q, temp_i, bufSize ); // 可聴領域だけ取り出す stk::copy( &bufTx[0].r, temp_q, bufSize, step, 1 ); stk::copy( &bufTx[0].l, temp_q, bufSize, step, 1 ); }
実際に走らせてみると3KHzあたりにかなり不快なビートが聞こえます。このビートがどこから紛れ込んできたのかが今ひとつはっきりしないのですが、ついでに作ったプログラムなのでまじめに調べる気にならないのが困ったところです。
ダウンロード: bfo_det.zip (49KB)
次は⇒SSB複素変復調