我是靠谱客的博主 义气冰棍,这篇文章主要介绍【信号处理】Python实现BPSK、QPSK、8PSK、8QAM、16QAM、64QAM的调制和解调1 引言2 实现3 完整编码和解码的例子,现在分享给大家,希望可以做个参考。

目录

  • 1 引言
  • 2 实现
    • 2.1 调制
    • 2.2 解调
  • 3 完整编码和解码的例子

1 引言

本文不涉及原理讲解,只提供实现方法。需要借助Commpy开源包去实现通信中的各种处理。

  • 源码下载地址Commpy源码下载
  • Commpy官方文档

安装方法

复制代码
1
2
3
4
5
6
7
方法一 pip install scikit-commpy 方法二 git clone https://github.com/veeresht/CommPy.git cd CommPy python setup.py install

2 实现

2.1 调制

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import commpy as cpy bits = np.random.binomial(n=1,p=0.5,size=(128)) Modulation_type ="BPSK" if Modulation_type=="BPSK": bpsk = cpy.PSKModem(2) symbol = bpsk.modulate(bits) return symbol elif Modulation_type=="QPSK": qpsk = cpy.PSKModem(4) symbol = qpsk.modulate(bits) return symbol elif Modulation_type=="8PSK": psk8 = cpy.PSKModem(8) symbol = psk8.modulate(bits) return symbol elif Modulation_type=="16QAM": qam16 = cpy.QAMModem(16) symbol = qam16.modulate(bits) return symbol elif Modulation_type=="64QAM": qam64 = cpy.QAMModem(64) symbol = qam64.modulate(bits) return symbol

注意8QAM,不能用Commpy实现,实现如下

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import numpy as np import matplotlib.pyplot as plt import math def split_by_len(str, length): return [str[i:i+length] for i in range(0, len(str), length)] def generate_8qam(signal): SAMP = 1 fc = 4 qam = [] t = np.arange(0, SAMP) wave = [] for i in range(8): if i % 2 == 0: amp = 0.5 else: amp = 1 wave.append(amp * np.exp(1j * (fc * np.pi * t/SAMP + math.floor(i/2) * np.pi/2))) s_bits = split_by_len(signal, 3) for s in s_bits: qam.extend(wave[int('0b' + s, 0)]) qam = np.array(qam) return qam bits = np.random.binomial(n=1,p=0.5,size=(128,)) if Modulation_type=="64QAM": signal = '' for i in range(bits.shape[0]): signal = signal+str(bits[i]) symbol = generate_8qam(signal) return symbol

2.2 解调

复制代码
1
2
3
4
5
6
7
8
# 和调制一样,需要先定义调制方法的类,再去调用解调的函数。 import commpy as cpy bits = np.random.binomial(n=1,p=0.5,size=(128)) # Modem : QPSK modem = mod.QAMModem(4) signal = modem.modulate(bits) modem.demodulate(signal, 'hard')

3 完整编码和解码的例子

来源Commpy 例子

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# Authors: CommPy contributors # License: BSD 3-Clause from __future__ import division, print_function # Python 2 compatibility import math import matplotlib.pyplot as plt import numpy as np import commpy.channelcoding.convcode as cc import commpy.channels as chan import commpy.links as lk import commpy.modulation as mod import commpy.utilities as util # ============================================================================= # Convolutional Code 1: G(D) = [1+D^2, 1+D+D^2] # Standard code with rate 1/2 # ============================================================================= # Number of delay elements in the convolutional encoder memory = np.array(2, ndmin=1) # Generator matrix g_matrix = np.array((0o5, 0o7), ndmin=2) # Create trellis data structure trellis1 = cc.Trellis(memory, g_matrix) # ============================================================================= # Convolutional Code 1: G(D) = [1+D^2, 1+D^2+D^3] # Standard code with rate 1/2 # ============================================================================= # Number of delay elements in the convolutional encoder memory = np.array(3, ndmin=1) # Generator matrix (1+D^2+D^3 <-> 13 or 0o15) g_matrix = np.array((0o5, 0o15), ndmin=2) # Create trellis data structure trellis2 = cc.Trellis(memory, g_matrix) # ============================================================================= # Convolutional Code 2: G(D) = [[1, 0, 0], [0, 1, 1+D]]; F(D) = [[D, D], [1+D, 1]] # RSC with rate 2/3 # ============================================================================= # Number of delay elements in the convolutional encoder memory = np.array((1, 1)) # Generator matrix & feedback matrix g_matrix = np.array(((1, 0, 0), (0, 1, 3))) feedback = np.array(((2, 2), (3, 1))) # Create trellis data structure trellis3 = cc.Trellis(memory, g_matrix, feedback, 'rsc') # ============================================================================= # Basic example using homemade counting and hard decoding # ============================================================================= # Traceback depth of the decoder tb_depth = None # Default value is 5 times the number or memories for trellis in (trellis1, trellis2, trellis3): for i in range(10): # Generate random message bits to be encoded message_bits = np.random.randint(0, 2, 1000) # Encode message bits coded_bits = cc.conv_encode(message_bits, trellis) # Introduce bit errors (channel) coded_bits[np.random.randint(0, 1000)] = 0 coded_bits[np.random.randint(0, 1000)] = 0 coded_bits[np.random.randint(0, 1000)] = 1 coded_bits[np.random.randint(0, 1000)] = 1 # Decode the received bits decoded_bits = cc.viterbi_decode(coded_bits.astype(float), trellis, tb_depth) num_bit_errors = util.hamming_dist(message_bits, decoded_bits[:len(message_bits)]) if num_bit_errors != 0: print(num_bit_errors, "Bit Errors found!") elif i == 9: print("No Bit Errors :)") # ================================================================================================== # Complete example using Commpy features and compare hard and soft demodulation. Example with code 1 # ================================================================================================== # Modem : QPSK modem = mod.QAMModem(4) # AWGN channel channels = chan.SISOFlatChannel(None, (1 + 0j, 0j)) # SNR range to test SNRs = np.arange(0, 6) + 10 * math.log10(modem.num_bits_symbol) # Modulation function def modulate(bits): return modem.modulate(cc.conv_encode(bits, trellis1, 'cont')) # Receiver function (no process required as there are no fading) def receiver_hard(y, h, constellation, noise_var): return modem.demodulate(y, 'hard') # Receiver function (no process required as there are no fading) def receiver_soft(y, h, constellation, noise_var): return modem.demodulate(y, 'soft', noise_var) # Decoder function def decoder_hard(msg): return cc.viterbi_decode(msg, trellis1) # Decoder function def decoder_soft(msg): return cc.viterbi_decode(msg, trellis1, decoding_type='soft') # Build model from parameters code_rate = trellis1.k / trellis1.n model_hard = lk.LinkModel(modulate, channels, receiver_hard, modem.num_bits_symbol, modem.constellation, modem.Es, decoder_hard, code_rate) model_soft = lk.LinkModel(modulate, channels, receiver_soft, modem.num_bits_symbol, modem.constellation, modem.Es, decoder_soft, code_rate) # Test BERs_hard = model_hard.link_performance(SNRs, 10000, 600, 5000, code_rate) BERs_soft = model_soft.link_performance(SNRs, 10000, 600, 5000, code_rate) plt.semilogy(SNRs, BERs_hard, 'o-', SNRs, BERs_soft, 'o-') plt.grid() plt.xlabel('Signal to Noise Ration (dB)') plt.ylabel('Bit Error Rate') plt.legend(('Hard demodulation', 'Soft demodulation')) plt.show()

最后

以上就是义气冰棍最近收集整理的关于【信号处理】Python实现BPSK、QPSK、8PSK、8QAM、16QAM、64QAM的调制和解调1 引言2 实现3 完整编码和解码的例子的全部内容,更多相关【信号处理】Python实现BPSK、QPSK、8PSK、8QAM、16QAM、64QAM的调制和解调1内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部