# comm_PSKModulator
使用 M-PSK 方法调制信号
函数库: TyCommunication
# 描述
PSKModulator 系统对象使用 M 进制相移键控(M-PSK)方法调制信号,输出是调制信号的基带表示。
使用 M-PSK 方法调制信号:
创建 comm_PSKModulator 对象并设置属性;
使用 step 调用对象。
# 构造
# 语法
pskm = comm_PSKModulator()
pskm = comm_PSKModulator(; Name = Value)
# 说明
pskm = comm_PSKModulator() 创建使用 M 进制相移键控(M-PSK)方法调制输入信号的调制器系统对象。示例
pskm = comm_PSKModulator(; Name = Value) 使用一个或多个名称值参数设置属性。例如,BitInput = true 指定输入值必须是二进制的。
# 属性
除非另有说明,否则属性是不可更改的,这意味着您无法更改其调用对象后的值。对象在调用时锁定,释放函数时解锁。
如果属性是可调的,则可以在任何时间修改属性值。
ModulationOrder - 信号星座的点数
8(默认)| 正整数
数据类型: Float
PhaseOffset - 星座的零点相位
pi/8(默认)| 标量
数据类型: Float
BitInput - 以比特为输入的选项false (默认) | true
以比特为输入的选项,指定为 false 或 true。
当此属性设置为 false 时,输入值必须是范围为 [0,(M - 1)] 的整数。M 表示 ModulationOrder 属性的值;
当此属性设置为 true 时,输入向量的长度必须是每个符号的比特数 log2(M) 的整数倍。这个向量包含范围为 [0,(M - 1)] 的整数的比特表示形式,M 必须是 2 的幂。一组 log2(M) 映射到一个符号上,第一个比特表示 MSB,最后一个比特表示 LSB。
数据类型: Bool
SymbolMapping - 符号编码映射"Gray" (默认) | "Binary" | "Custom"
符号编码映射,指定为 "Gray"、"Binary" 或 "Custom"。每一个整数或一组 log2(M) 比特对应一个符号,M 表示 ModulationOrder 属性的值。
将此属性设置为 "Gray" 时,对象将符号映射为 Gray 编码的信号星座;
将此属性设置为 "Binary" 时,对象将符号映射为自然的二进制编码的信号星座;
将此属性设置为 "Custom" 时,对象将符号映射到 CustomSymbolMapping 属性中定义的信号星座。
CustomSymbolMapping - 自定义星座编码
0:7(默认)| 整数向量
依赖
要启用此属性,请将 SymbolMapping 属性设置为 "Custom"。
数据类型: Float
# 用法
# 语法
modData = step(pskm, x)
# 说明
modData = step(pskm, x) 通过使用 M-PSK 方法调制输入信号,输出是调制的 M-PSK 基带信号。
# 输入参数
x - 输入信号
向量
数据类型: Float
# 输出参数
ModData - M-PSK 调制基带信号
标量 | 向量
# 对象函数
要使用对象函数,请将系统对象指定为第一个输入参数。
comm_PSKModulator 专用
| constellation | 计算或绘制理想信号星座图 |
对系统对象通用的操作
| step | 运行系统对象算法 |
| release | 释放资源并允许更改系统对象属性值和输入特性 |
| reset | 重置系统对象的内部状态 |
# 示例
使用 M-PSK 方法调制信号
using TyCommunication
using TyMath
rng = MT19937ar(1234)
txData = randi(rng, [0 7], 2000, 1)
pskm = comm_PSKModulator()
channel = comm_AWGNChannel(;
EbNo=20, BitsPerSymbol=3, RandomStream="mt19937ar with seed", Seed=1234
)
modData = step(pskm, txData)
channelOutput = step(channel, modData)
channelOutput = 2000×1 Matrix{ComplexF64}:
0.344012250060767 + 0.9173026123506407im
0.9459310535948823 - 0.3462043419363169im
-0.3915261777415274 + 0.9315938591486493im
-0.8753375054033337 - 0.42737897069896974im
-0.8701137294214378 - 0.3722621101874941im
-0.9404392617725796 + 0.34989706599600423im
-0.9420427566038129 + 0.40526236851476033im
⋮
0.9115462175167582 + 0.34478140840961097im
-0.9561342586234606 + 0.3223680572390335im
-1.007178119069535 - 0.446344835037794im
-0.8663420161000867 - 0.4987636571072639im
-0.38457920297530046 - 0.9047841223377542im
-0.3396691382859017 - 0.9050913886064484im
采用自定义符号映射的 16-PSK 调制
创建一个使用自定义符号映射的 16-PSK 调制解调系统对象。在 AWGN 通道中估计误比特率(BER),并将其性能与理论 Gray 编码 PSK 系统进行比较。
为 16-PSK 调制方案创建自定义符号映射。16 个整数符号的值必须在 0 到 15 之间。
using TyCommunication
using TyMath
using TyPlot
rng = mt19937ar(5489)
custMap = [0 2 4 6 8 10 12 14 15 13 11 9 7 5 3 1]
创建一对具有自定义符号映射的 16-PSK 调制解调器,符号映射由数组 custMap 定义。
pskModulator = comm_PSKModulator(;
ModulationOrder=16, BitInput=true, SymbolMapping="Custom", CustomSymbolMapping=custMap
)
pskDemodulator = comm_PSKDemodulator(;
ModulationOrder=16, BitOutput=true, SymbolMapping="Custom", CustomSymbolMapping=custMap
)
显示调制星座图。
constellation(pskModulator; plotfig=true)
为 16 进制数据创建一个 AWGN 通道系统对象。
awgnChannel = comm_AWGNChannel(;
BitsPerSymbol=Int64(log2(16)), RandomStream="mt19937ar with seed"
)
初始化仿真向量。$E_{b} /N_{0} $ 值从 6 dB 变化到 18 dB,步长为 1 dB。
ebnoVec = 6:18
ber = zeros(length(ebnoVec))
通过调制二进制数据、将其传递通过 AWGN 通道、解调接收信号并收集错误统计数据来估计 BER。
for k in 1:length(ebnoVec)
# 为每个 Eb/No 重置误码率计算器
errorRate = comm_ErrorRate()
# 重置用于收集错误数据的数组
errVec = [0 0 0]
# 设置信道的 Eb/No
awgnChannel.EbNo = ebnoVec[k]
while errVec[2] < 200 && errVec[3] < 1e7
# 生成1000符号的帧
data = randi(rng, [0 1], 4000, 1)
# 解调二进制数据
modData = step(pskModulator, data)
# 将调制数据通过 AGWN 信道
rxSig = step(awgnChannel, modData)
# 解调接受到的数据
rxData = step(pskDemodulator, rxSig)
# 收集错误数据
errVec = step(errorRate, data, rxData)
end
# 保存误码率数据
ber[k] = errVec[1]
global ber
end
使用 berawgn 函数为 AWGN 通道生成理论 BER 数据。
berTheory, = berawgn(ebnoVec, "psk", 16, "nondiff")
绘制模拟结果和理论结果。模拟的自定义符号映射的 16-PSK 调制 BER 性能不如理论预测曲线的 Gray 编码效果好。
figure()
semilogy(ebnoVec, ber, ebnoVec, berTheory)
xlabel("Eb/No (dB)")
ylabel("BER")
grid("on")
legend("Simulation", "Theory"; loc="northeast")

# 参考文献
[1] Proakis, John G. Digital Communications. 4th ed. New York: McGraw Hill, 2001.