SSB複素変復調

実装

複素プロダクト検波で説明した複素フィルターによるSSB変復調器を実装しました。今回もMCMシグナルツールキットを使っています。

図1はブロックダイアグラムです。

複素変復調器実験の構成

図1 変復調器

変調器はキャリアポイントが12KHzのUSBを作ります。BPFはカットオフ周波数1.2KHz、255タップのLPFをDF-Designを使って生成した後、+1.5KHzの複素信号を掛けて作り出しました。実部と虚部用に1つずつ用意します。フィルタを通過した時点でキャリアポイント0HzのSSBになっていますので、+12KHzの複素アップコンバートを行うことで目的のUSBを作り出します。

復調器は変調器と逆の流れです。最初に-12Khzでダウンコンバートした後、複素フィルタを通してUSB部分のみを取り出します。このフィルタには変調器と同じ特性のものを用意しています。

変調器と復調器の間には妨害信号を混入しました。11KHzの信号で、復調時にLSBの抑圧がうまくないと1KHzのビートが混入します。

図2に使用した複素フィルタのインパルス応答を示します。

図2 複素フィルタのインパルス応答

下にhandleBufferメソッドを示します。stkを使ったために到底DSPプログラムとは見えない簡単さですが、上のブロックダイアグラムを忠実になぞっています。妨害信号は飽和を避けるために1/2にスケールダウンしています。

void CModulator::handleBuffer( struct mcm::sample * bufTx, 
                               struct mcm::sample * bufRx )
{

    short step = sizeof(mcm::sample);
                                
                                   // ステレオからモノラルに変換
    stk::copy( temp_r, &bufRx[0].r, bufSize, 1, step );
    stk::copy( temp_i, &bufRx[0].l, bufSize, 1, step );
    stk::add( temp, temp_i, temp_r, bufSize );  // モノラルに変換

               // -------------- USB生成 --------------        
                                   // 複素BPF +300 .. +2700 Hz
    lpf_rt->run( temp_r, temp, bufSize );               // 実部
    lpf_it->run( temp_i, temp, bufSize );               // 虚部
        
    osc12->run( lo_s, lo_c, bufSize );                  // +12KHzの複素発振器

                                  // +12KHz のアップコンバート
    stk::mul( temp_r, temp_r, lo_c, bufSize );
    stk::mul( temp_i, temp_i, lo_s, bufSize );
        
                                 // キャリアポイント12KHzのUSB 生成
    stk::sub( temp, temp_r, temp_i, bufSize );
        
              // -------------- 妨害波混入 --------------
    osc11->run( interfare, bufSize );                   // 11KHzの妨害
    stk::mul( interfare, interfare, (short)16384, bufSize ); //スケーリング
        
    stk::add( temp, temp, interfare, bufSize );         // 妨害波混入
        
              // -------------- USB復調 --------------
                                 // -12KHzでダウンコンバート
    stk::mul( temp_r, lo_s, temp, bufSize );            // -12Khzにするために
    stk::mul( temp_i, lo_c, temp, bufSize );            // sin/cosを入れ替える
        
                                 // 複素BPF +300/+2700 Hz
    lpf_rr->run( temp_r, temp_r, bufSize );             // 実部
    lpf_ir->run( temp_i, temp_i, bufSize );             // 虚部
        
    stk::sub( temp, temp_r, temp_i, bufSize );          // USB復調
//  stk::add( temp, temp_r, temp_i, bufSize );          // LSB復調
        
                                 // 出力バッファにコピー
    stk::copy( &bufTx[0].r, temp, bufSize, step );
    stk::copy( &bufTx[0].l, temp, bufSize, step );
}

聞いてみると、目論見どおりLSB部分にかぶったビートはまったく聞こえません。ためしに上のプログラムを下から6行目にコメントアウトしているように書き換えてLSB復調器に変更してみました。この場合はビートだけが聞こえてLSB成分は聞こえません。つまり変調器は逆サイドバンドをしっかり抑圧していることがわかります。

ダウンロード(44KB) : complex_filter_ssb.zip

次は⇒

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