ウェーバー式SSB変調を組んでみましょう。
すでに原理はわかっているのでブロックダイアグラム(図1)どおりに組むだけです。振幅変調器と異なり、今回はフィルターが入っていますのでループを使って繰り返し処理をおこないます。2回目の繰り返しからスペクトルがきれいになります。最初の一回はフィルターの内部がゼロなので少しスプリアスが混じります。
図1 Weaver方式SSB変調器
#define SIZE 1024
#include "signaltoolkit.h"
short baseband[SIZE]={
#include "test.dat"
};
short lpfCoeff[255]={
#include "lpf.txt"
};
short temp_q[SIZE], temp_i[SIZE], o_q[SIZE], o_i[SIZE], out[SIZE];
stk::COscillator *osc1, *osc2, *source;
stk::CFilter *lpf_q, *lpf_i;
int main(void)
{
source= new stk::CSinCosDDS(3072,0); // source 1KHz
osc1 = new stk::CSinCosDDS(2048,0); // 1.5KHz
osc2 = new stk::CSinCosDDS(16384,0); // 12KHz
lpf_q = new stk::CFirFilter( 255, lpfCoeff );
lpf_i = new stk::CFirFilter( 255, lpfCoeff );
while(1){
source->run( baseband, SIZE );
osc1->run( o_i, o_q, SIZE ); // 副搬送波: OSC1
stk::mul(temp_q, baseband, o_q, SIZE ); // 第一Qミキサー
stk::mul(temp_i, baseband, o_i, SIZE ); // 第一Iミキサー
lpf_q->run(temp_q, temp_q, SIZE );
lpf_i->run(temp_i, temp_i, SIZE );
osc2->run( o_i, o_q, SIZE ); // 局発: OSC2
stk::mul(temp_q, temp_q, o_q, SIZE ); // 第二Qミキサー
stk::mul(temp_i, temp_i, o_i, SIZE ); // 第二Iミキサー
stk::add(out, temp_q, temp_i, SIZE );
}
}
このプログラムの実行結果を図1に示します。FFT結果をプロットしました。入力信号のスペクトルがUSBとして12KHz(横軸の256)を中心に配置されています。LSBはきれいに消えています。
図2 SSB変調のスペクトル
VisualDSP++のプロット機能は大まかな様子を見るには十分ですが正確な測定には向いていません。変調器のスプリアスを見るために生成したデータを外部に書き出してScilabで処理しました(図3)。
このデータは約2KHz、振幅1の正弦波で変調した場合のものです。縦軸はdB、横軸は周波数で512が24KHzにあたります。12KHzの搬送波より少し離れたところに2KHzの信号にあたるスペクトルが一本立っています。下側側波帯やキャリアリークは見当たりません。
8KHz付近に小さなスペクトルが立っていますが原因は不明です。本信号より90dB以上も下なので演算精度ぎりぎりのところです。おそらくは入力信号の3倍高調波がもれて出たものと思われますが、なんにせよ無視してかまわない大きさです。
図3 1KHzで変調をかけた場合のスペクトル
計算で見る限り、weaver方式の性能は上々といえます。
正弦波入力時の挙動を一回測定して結論を出すのはあまりにも短気すぎます。それでも得られた結果は思ったよりはるかに高性能でした。DACをつないで実際の性能を見てみたいものです。
本当にこの性能がRF帯で得られるのならやってみる価値はありそうです。少なくとも私がアマチュア無線をやっていた20年前はPSNについて語られることはあってもウェーバー方式については論じられなかったように思います(忘れているだけかもしれませんが)。発表当時の技術では実現が困難なものがディジタル化で実現できるあたり、ウェーバー方式のSSB変調器は無線の世界の階差機関だったのかもしれません。
次は⇒SSB変調器(2)