平均電力が1のQAM信号を生成するC++のソースコードです。Average energy in a QAM constellationを参考に作りました。

サンプルプログラムの使い方

fileソースコードをここからダウンロードします。解凍してコンパイルして引数にQAMの信号点を指定すれば動作します。実行するとconstellation.htmlというファイルを吐いてJavaScript + camvusで信号点を可視化するように作ってあります。↓の写真だと実はQAMじゃなくてQPSKになっていますが、16QAMでも64QAMでもちゃんと動きます。

qam.jpg

qam_constellation.jpg

主要な関数: make_qam

QAMの信号点を作成する関数です。引数のsizeには信号点の数を入れます。sdlab_complexは実質はstd::complex<double>です。sdlab.hで宣言してます。

void make_qam(int size, sdlab_complex **qam)
{
  int n = sqrt(size);
  int qam_bits = round(log2(n));
  uint16_t qam_mask = ((1 << qam_bits) - 1);
  double scale = sqrt((2 * (pow(2, qam_bits * 2) - 1)) / 3);

  for(uint16_t i = 0; i < n; i++){
    for(uint16_t j = 0; j < n; j++){
      double real = j;
      double imag = n - i - 1;

      real = real * 2 - qam_mask;
      imag = imag * 2 - qam_mask;
      real = real / scale;
      imag = imag / scale;

      qam[i][j] = sdlab_complex(real,imag);
    }
  }
}

添付ファイル: fileqam_constellation.jpg 462件 [詳細] fileqam.jpg 575件 [詳細] fileqam.zip 571件 [詳細]

  添付編集
Last-modified: 2014-10-29 (水) 22:36:18 (1139d)