肩慣らしは振幅変調です。これは信号にDCオフセットを与えて搬送波に掛け合わせるだけですので簡単です。以下のプログラムは1024サンプルの入力音声データを使って12KHzの搬送波に振幅変調を行っています。図1にそのブロックダイアグラムを示します。
図1 振幅変調器のブロックダイアグラム
注意すべき点は最初に飽和回避のスケーリングを行っていることです。DCオフセットに定義どおり1を与えると、固定小数点数であるため即座に飽和してしまいます。そのため、DCオフセットは0.5とし、それにあわせて入力信号も0.5倍しています。結局以下のプログラムでは変調度は1です。その他に関しては素直に定義どおりの処理をおこなっています。
#define SIZE 1024 #include "signaltoolkit.h" short baseband[SIZE]={ #include "test.dat" }; short temp[SIZE], carrier[SIZE], out[SIZE]; stk::COscillator *osc; int main(void) { osc = new stk::CSinCosDDS(16384,0); // 12KHz osc->run( carrier, SIZE ); // 搬送波生成 stk::mul( temp, baseband, (int)(0.5*32767), SIZE ); // 飽和回避のためのスケーリング stk::add( temp, temp, (int)(0.5*32767), SIZE ); // DCオフセットを付加 stk::mul( out, temp, carrier, SIZE ); // 振幅変調 }
このプログラムの実行結果を図1に示します。FFT結果をプロットしました。入力信号のスペクトルがキャリアの両側に広がっていることがわかります。
図1 振幅変調のスペクトル
次は⇒SSB変調