[python] 각종 변조 방식(QPSK, 16QAM, 64QAM)으로 AWGN 통신을 할 때의 BER 비교

15943 단어 Python
자신의 과거 보도를 보고 MATLAB는 똑같은 일을 했지만,python이 필요로 할 것 같았다.
본 보도의 내용으로
https://qiita.com/Seiji_Tanaka/items/a059090ee020a5d5c648
에 기록된 비트-기호의 변조 함수인python 파일 "QAM modulation"및
https://qiita.com/Seiji_Tanaka/items/b29d8a5a3447680370ce
의 기호→비트레이트 함수를 포함하는python 파일 "QAM demodulation"및
import numpy as np

def AWGN_noise(EbNo, N, sym_num, bit_num):
    """
    EbNo : 発生させたい雑音の強度を決める
    N : 受信機側アンテナの数
    sym_num : 送信シンボル系列長
    bit_num : 送信ビット系列長
    """

    #変調多値数を求める QSPK : 2, 16QAM : 4, 64QAM : 6となる値
    QAM_order = int(bit_num / sym_num)
    SNR = QAM_order * 10 ** (EbNo / 10)
    No = 1 / SNR

    noise = np.random.normal(0, np.sqrt(No / 2), (N, sym_num)) \
            + 1j * np.random.normal(0, np.sqrt(No / 2), (N, sym_num))

    return noise
통신 시뮬레이션을 위해python 파일 세 개를 가져옵니다.
import numpy as np
import matplotlib.pyplot as plt

# https://qiita.com/Seiji_Tanaka/items/a059090ee020a5d5c648
import QAM_modulation

# https://qiita.com/Seiji_Tanaka/items/b29d8a5a3447680370ce
import QAM_demodulation

# Qiitaのこのページの上部に記載
import channel_generation

# 送信側アンテナ数
M = 1
# 受信側アンテナ数
N = 1
# 送信ビット数
bit_num = 12 * 10 ** 5

# 計算するEbNoの範囲 freqは計測点の間隔の狭さに対応する
EbNo_min = 0
EbNo_max = 20
freq = 21
power_range = np.linspace(EbNo_min, EbNo_max, freq)

BER_QPSK = np.zeros((1, freq))
BER_16QAM = np.zeros((1, freq))
BER_64QAM = np.zeros((1, freq))
count = 0

for EbNo in power_range:
    TX_bit = np.random.randint(0, 2, (M, bit_num))

    # 変調
    TX_QPSK = QAM_modulation.bit_to_QPSK(TX_bit)
    TX_16QAM = QAM_modulation.bit_to_16QAM(TX_bit)
    TX_64QAM = QAM_modulation.bit_to_64QAM(TX_bit)

    # AWGN雑音を付加
    noise = channel_generation.AWGN_noise(EbNo, N, len(TX_QPSK[0, :]), bit_num)
    RX_QPSK = TX_QPSK + noise

    noise = channel_generation.AWGN_noise(EbNo, N, len(TX_16QAM[0, :]), bit_num)
    RX_16QAM = TX_16QAM + noise

    noise = channel_generation.AWGN_noise(EbNo, N, len(TX_64QAM[0, :]), bit_num)
    RX_64QAM = TX_64QAM + noise

    # 判定・復調
    RX_bit_QPSK = QAM_demodulation.QPSK_to_bit(RX_QPSK)
    RX_bit_16QAM = QAM_demodulation.QAM16_to_bit(RX_16QAM)
    RX_bit_64QAM = QAM_demodulation.QAM64_to_bit(RX_64QAM)

    # BERの計算
    error_sum_QPSK = np.sum(np.abs(TX_bit - RX_bit_QPSK))
    error_sum_16QAM = np.sum(np.abs(TX_bit - RX_bit_16QAM))
    error_sum_64QAM = np.sum(np.abs(TX_bit - RX_bit_64QAM))

    BER_QPSK[0, count] = error_sum_QPSK / (M * bit_num)
    BER_16QAM[0, count] = error_sum_16QAM / (M * bit_num)
    BER_64QAM[0, count] = error_sum_64QAM / (M * bit_num)
    count += 1

plt.semilogy(power_range, BER_QPSK[0,:], label="QPSK")
plt.semilogy(power_range, BER_16QAM[0,:], label='16QAM')
plt.semilogy(power_range, BER_64QAM[0,:], label="64QAM")
plt.legend(bbox_to_anchor=(1, 1), loc='upper right', borderaxespad=0, fontsize=18)
plt.ylim(10**(-5), 10**(-0))
plt.xlabel('Eb/N0 [dB]')
plt.ylabel('BER')
ax = plt.gca()
ax.set_yscale('log')
plt.grid(which="both")
plt.show()
출력 결과:

이런 느낌을 받을 수 있다.
python에서 통신 시스템의 이론적 시뮬레이션을 하는 사람 중 모뎀을 만들기 위해 호출하는 함수를 만드는 데 시간이 걸리는 사람이 있다면 반드시 사용하십시오.
나는 이런 일로 고민하는 시간이 정말 낭비라고 생각한다.

좋은 웹페이지 즐겨찾기