Skip to content

Instantly share code, notes, and snippets.

@k3kaimu
Created December 4, 2019 13:46
Show Gist options
  • Save k3kaimu/41517e55efefc470b721eb904a434419 to your computer and use it in GitHub Desktop.
Save k3kaimu/41517e55efefc470b721eb904a434419 to your computer and use it in GitHub Desktop.
Rappモデルの増幅器でOFDM信号が受ける非線形性をシミュレーション
/++ dub.json:
{
"name": "sim_canceller",
"dependencies": {
"dffdd": { "path": ".." }
},
"dflags-ldc": ["-enable-cross-module-inlining", "-mcpu=native"]
}
+/
// dub --build=release --compiler=ldc2 --single sim_ofdm_rapp.d
import dffdd;
import std;
alias C = Complex!double;
enum NBits_QAM = 4;
enum NOverSampling = 4;
enum NSymbol = 100000;
static assert(NBits_QAM == 1 || NBits_QAM % 2 == 0);
void main()
{
// 使用するブロックの定義
auto rndbits = randomBits();
auto ofdm = QAM!C(2^^NBits_QAM).chainedMod(new OFDM!C(64, 16, 64, NOverSampling));
auto rapp = RappModel!C(3, 0.dB, 30.dBm);
BERCounter bercounter;
StopWatch sw;
sw.start();
// 信号のフロー
// 送信ビットの生成
Bit[] tx_bits = new Bit[64 * NBits_QAM * NSymbol];
rndbits.consumeFill(tx_bits);
// ビット列をOFDMシンボルへ変調
C[] tx_signal;
ofdm.modulate(tx_bits, tx_signal);
// Rappモデルの増幅器へ入力
C[] rx_signal;
rapp(tx_signal, rx_signal);
// OFDMの復調
Bit[] rx_bits;
ofdm.demodulate(rx_signal, rx_bits);
bercounter.count(tx_bits, rx_bits);
sw.stop();
// ビットの誤りの個数を表示
// 例:
// Total: 25600000 bits, Error bits: 1491696 bits, BER: 0.0582694
// Total time: 3349 [msecs], 7.64346 [Mbit/sec]
with(bercounter.result) {
writefln!"Total: %s bits, Error bits: %s bits, BER: %s"(totalBits, errBits, ber);
writefln!"Total time: %s [msecs], %s [Mbit/sec]"(sw.peek.msecs, totalBits * 1.0 / sw.peek.usecs);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment