BFOによる復調

ラジオの自作華やかなりし頃には、雑誌に普通のAMラジオでアマチュア無線バンドを聞く方法がよく紹介されていました。たいていはクリコンと呼ばれる水晶発振式ダウンコンバーターでAM帯にアマチュア無線帯を変換していました。

周波数を変換しても、SSB信号をAMラジオで聞くことはできません。そこで、BFO( Beat Frequency Oscillator )という装置を使ってAMラジオでSSBを聞いていました。以下ではこのBFOを使った場合のSSB復調をソフトウェアで実装してみました。

プログラム

MCMを使って一度12KHzのUSB信号を作り、それをダイオード検波します。しかしこのままではきちんと聞こえません。そこで、ダイオード検波の前に抑圧された搬送波と同じ周波数の信号を混入させます。この信号を作る発信機をBFOと呼びました。この信号の混入でSSB信号は搬送波を得ることができますのでLSBのないAM信号となり、ダイオード検波が可能になります。

BFOによる復調

図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複素変復調

2191空挺団 | プログラム | EZ-KIT | こぼれ話 | アーキテクチャー | 命令 | レジスタ | DSP掲示板 | FAQ |