SSBの復調を行うとき、いちばん簡単な方法は抑圧されているキャリアと同じ周波数の信号を受信側で生成し、これを掛けてやることです。この方法は受信信号と局発信号の積(Product)を使って検波をすることからプロダクト検波と呼ばれます。
今回もmcmを使いました。以下にhandleBuffer()を示します。入力音声帯域は24KHzですがLPFで絞ることはせず、第一MIX後のLPFで不要帯域といっしょに切り落としています。送信機側の出力は中心周波数12KHzのUSBです。
受信側ではこれに局発を掛けることで検波します。注意すべき点は局発周波数です。Weaver方式ではSSB信号が送信機の局発で作ったキャリアの両側に生成されるため、受信側ではそれから副搬送波分だけずらしてやる必要があります。このため局発周波数は10.5KHzです。
図1はプロダクト検波のブロックダイアグラムです。
図1 プロダクト検波のブロックダイアグラム
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 ); // 副搬送波生成 1.5KHz 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 ); // 搬送波生成 12KHz 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); // ここでSSBになる // SSB受信機 osc3->run( lo_i, lo_q, bufSize ); // 局発 10.5KHz stk::mul( temp_q, temp_i, lo_q, (short)bufSize ); // プロダクト検波 rlpf->run( temp_i, temp_q, bufSize ); // 可聴領域だけ取り出す stk::copy( &bufTx[0].r, temp_i, bufSize, step, 1 ); stk::copy( &bufTx[0].l, temp_i, bufSize, step, 1 ); }
プロダクト検波は元の搬送波と同期した局発を作れない限り、位相にひずみが生じます。しかし実際に走らせて聞いてみると、きちんとした音質で検波していることが聞いて取れます。
ダウンロード : product_det.zip (71KB)
次は⇒BFOによる復調