キイロイトリらぼ

ぬいぐるみと一緒に生きていきます

C言語でBPSK変調のグラフを作成する #2

概要

gijin94yobu.hatenablog.jp
この続きをする.
内容としては,下記の書籍の

SEQ_DATA,SEQ_DATA型を用いたBPSKシミュレーション

を実装することを目指す.

C言語によるディジタル無線通信技術

C言語によるディジタル無線通信技術

これは,前回実装したプログラムを構造体を用いることで改良したものになる.
また,生成した送信データ,受信データ,及び,BER結果をgnuplotで出力する.

結論

 データ型の定義によるBPSKシミュレーションプログラムを実装できた.
送受信データのプロット波形を確認できた.

実行したこと

実行環境

【ホストPC】

手順

前回プログラムをベースに,新しいデータ型を定義する.
前回のプログラムの改良点を引用する.

前回のプログラムは,データや信号などの系列は,それらが保存されたメモリ領域の先頭アドレスを保持するポインタによって指定されている.
しかし,ポインタは先頭アドレスと保持しているだけなので,その先頭アドレスからどこまでがデータや信号を記憶している領域かはわからない問題がある.そのため,それらの長さを別途,新たに変数を設けて指定する必要がある.すると,関数にある系列を渡して何らかの処理を行うとき,先頭アドレスを示すポインタだけでなく,系列の長さを表す変数も引数とすることが必要となる.

なるほど,例としても挙げられているように,上記プログラムにはvoid _randData(unsigned int *d, unsigned int length)double _bpskMod(COMPLEX *s, unsigned int *data, unsigned int length)のように,データ系列の先頭アドレス*dataとともに,その長さを表す変数lengthも引数として定義しなくてはいけなくなっている.
このままでは,系列の種類が増えるごとに関数の引数の数が多くなり,それぞれの信号のやデータに対して先頭アドレスとその長さを示す変数の対応を把握しておく必要が出てくるそうだ.
そんなややこしい問題を,構造体を用いて型を定義することで解決できるという.
上記プログラムで使用されている配列の関係性を見て,noisesymbol複素数を保存する配列で分けられそうであり,txDatarxDataは0または1の二値データを保存する配列で分けられそうである.この関係性を型として定義し直すというのである.

プログラム

改良したプログラムはこちら.
前回プログラムと同様に送受信データの波形を出力するようにgnuplotを追加している.
BER曲線も別のウィンドウで出力した.

SEQ_SIG型,SEQ_DATA型を用いたBPSKシミュレーション

f:id:gijin94yobu:20200725170414p:plain
list4_2.cで出力した送受信波形(length=100, SNR=5)

 >

f:id:gijin94yobu:20200725165732p:plain
list4_2.cで出力した送受信波形(length=100, SNR=60)

f:id:gijin94yobu:20200725165822p:plain
list4_2.cで出力した送受信波形(length=1000, SNR=60)
<>
f:id:gijin94yobu:20200725165836p:plain
list4_2.cで出力した送受信波形のBER曲線(length=100, SNR=60)

Length=100程度でSNR=60ほどの良好な通信チャネルでは送受信データはほぼ一致することがわかる.
Length=100程度でSNR=5の悪い通信チャネルでは送受信データで一部一致しないデータが出ているのがわかる.
BER曲線はSNRが10 dB以降ではほぼゼロになっていることがわかる.
githubはこちら
https://github.com/yoshi4869/wireless_c.git

あとがき

まだまだこのプログラムの内容を咀嚼しなければいけないことは多いが,構造体が少し便利に思えてきた.これくらいのプログラム量にならないと,構造体の意義が感じられないのかもしれない.この書籍では更に改良点があるというので,もう少し初心に帰って,C言語の理解を深めることにする. 

参考

C言語によるディジタル無線通信技術

C言語によるディジタル無線通信技術