[python] 각종 변조 방식(QPSK, 16QAM, 64QAM)으로 AWGN 통신을 할 때의 BER 비교
15943 단어 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에서 통신 시스템의 이론적 시뮬레이션을 하는 사람 중 모뎀을 만들기 위해 호출하는 함수를 만드는 데 시간이 걸리는 사람이 있다면 반드시 사용하십시오.
나는 이런 일로 고민하는 시간이 정말 낭비라고 생각한다.
Reference
이 문제에 관하여([python] 각종 변조 방식(QPSK, 16QAM, 64QAM)으로 AWGN 통신을 할 때의 BER 비교), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Seiji_Tanaka/items/70f84e01a02982df1be0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)