【信号处理】python按原理实现BPSK、QPSK、QAM信号调制

完整的使用不涉及原理的包的使用请转到我的另一篇文章

【信号处理】Python实现2PSK、QPSK、8PSK、N-QAM的调制和解调

1 BPSK调制

# -*- coding:utf-8 -*-
 
import numpy as np
from math import pi
import matplotlib.pyplot as plt
import matplotlib
import math
 
 
 
#码元数
 
size = 10
sampling_t = 0.01
t = np.arange(0, size, sampling_t)
 

# 随机生成信号序列
a = np.random.randint(0, 2, size)
m = np.zeros(len(t), dtype=np.float32)
for i in range(len(t)):
    m[i] = a[math.floor(t[i])]
fig = plt.figure()
ax1 = fig.add_subplot(2, 1, 1)
 
ax1.set_title('generate Random Binary signal', fontsize = 20)
plt.axis([0, size, -0.5, 1.5])
plt.plot(t, m, 'b')

fc = 4000
fs = 20 * fc # 采样频率
ts = np.arange(0, (100 * size) / fs, 1 / fs)
coherent_carrier = np.cos(np.dot(2 * pi * fc, ts))
 
bpsk = np.cos(np.dot(2 * pi * fc, ts) + pi * (m - 1) + pi / 4)

# BPSK调制信号波形
ax2 = fig.add_subplot(2, 1, 2)
ax2.set_title('BPSK Modulation', fontsize=20)#, fontproperties=zhfont1
plt.axis([0,size,-1.5, 1.5])
plt.plot(t, bpsk, 'r')
plt.show()
print()

在这里插入图片描述

2 QPSK

from scipy import signal, special
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker 
from matplotlib.font_manager import FontProperties


t = np.arange(0,8.5,0.5)
# input
plt.subplot(4,1,1)
y1 = [0,1,1,0,1,1,0,0,0,1,1,0,1,1,0,0,0]
plt.plot(t,y1,drawstyle='steps-post')
plt.xlim(0,8)
plt.ylim(-0.5,1.5)
plt.title('Input Signal')

# I Signal
plt.subplot(4,1,2)
a = 1/np.sqrt(2)
tI = np.arange(0,9,1)
yI = [-a,a,-a,a,-a,a,-a,a,a]
plt.plot(tI,yI,drawstyle='steps-post')
plt.xlim(0,8)
plt.ylim(-2,2)
plt.title('I signal')

# Q signal
plt.subplot(4,1,3)
yQ = [a,-a,-a,a,a,-a,-a,a,a]
plt.plot(tI,yQ,drawstyle='steps-post')
plt.xlim(0,8)
plt.ylim(-1,1)
plt.title('Q Signal')

# QPSK signal
plt.subplot(4,1,4)
t = np.arange(0,9.,0.01)
def outputwave(I,Q,t):
    rectwav = []
    for i in range(len(I)):
        t_tmp = t[((i)*100):((i+1)*100)]
        yI_tmp = yI[i]*np.ones(100)
        yQ_tmp = yQ[i]*np.ones(100)
        wav_tmp = yI_tmp*np.cos(2*np.pi*5*t_tmp)-yQ_tmp*np.sin(2*np.pi*5*t_tmp)
        rectwav.append(wav_tmp)
    return rectwav
rectwav = outputwave(yI,yQ,t)
plt.plot(t,np.array(rectwav).flatten(),'r')
plt.xlim(0,8)
plt.ylim(-2,2)
plt.title('QPSK Signal')

plt.tight_layout()
plt.show()

在这里插入图片描述

3 QAM

4 参考资料

  1. python实现BPSK调制信号解调
  2. 深入浅出通信原理Python代码版
  3. Python实现M-QAM
引用\[1\]:在Python中,可以使用commpy库来实现16QAM调制和解调。首先,需要导入commpy库和numpy库。然后,可以使用commpy库中的QAMModem类来实现16QAM调制调制的过程是将输入的比特流转换为对应的16QAM符号。具体的实现代码如下所示: ```python import commpy as cpy import numpy as np def modulate_16qam(bits): qam16 = cpy.QAMModem(16) symbol = qam16.modulate(bits) return symbol ``` 对于解调,可以使用commpy库中的QAMModem类的demodulate方法来实现。解调的过程是将接收到的信号转换为对应的比特流。具体的实现代码如下所示: ```python def demodulate_16qam(signal): qam16 = cpy.QAMModem(16) bits = qam16.demodulate(signal, 'hard') return bits ``` 引用\[3\]:另外,还可以使用字典来实现16QAM调制和解调。首先,需要定义一个字典来保存16QAM中比特与振幅的对应关系。然后,通过遍历比特流,将每个比特组合转换为对应的复数,从而实现16QAM调制。具体的实现代码如下所示: ```python import numpy as np def modulate_16qam(bits): diagram = { '00': complex(-3, 3), '01': complex(-3, 1), '11': complex(-1, 1), '10': complex(-1, 3), '110': complex(-3, -3), '111': complex(-3, -1), '101': complex(-1, -1), '100': complex(-1, -3), '010': complex(3, 3), '011': complex(3, 1), '001': complex(1, 1), '000': complex(1, 3), '101': complex(3, -3), '111': complex(3, -1), '110': complex(1, -1), '100': complex(1, -3) } symbol = \[\] for i in range(0, len(bits), 4): bit_group = bits\[i:i+4\] symbol.append(diagram\[bit_group\]) return np.array(symbol) ``` 对于解调,可以通过查询字典来将接收到的复数转换为对应的比特组合。具体的实现代码如下所示: ```python def demodulate_16qam(signal): diagram = { complex(-3, 3): '00', complex(-3, 1): '01', complex(-1, 1): '11', complex(-1, 3): '10', complex(-3, -3): '110', complex(-3, -1): '111', complex(-1, -1): '101', complex(-1, -3): '100', complex(3, 3): '010', complex(3, 1): '011', complex(1, 1): '001', complex(1, 3): '000', complex(3, -3): '101', complex(3, -1): '111', complex(1, -1): '110', complex(1, -3): '100' } bits = \[\] for s in signal: bit_group = diagram\[s\] bits.extend(list(bit_group)) return np.array(bits) ``` 以上是两种实现16QAM调制和解调的方法,你可以根据自己的需求选择其中一种来使用。 #### 引用[.reference_title] - *1* *2* [【信号处理Python实现BPSKQPSK、8PSK、8QAM、16QAM、64QAM调制和解调](https://blog.csdn.net/weixin_43935696/article/details/120596442)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [16QAM调制的仿真及其Python实现的代码(超级详细)](https://blog.csdn.net/m0_46303328/article/details/121092456)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Better Bench

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值