2026a

# comm_PSKModulator


使用 M-PSK 方法调制信号

函数库: TyCommunication

# 描述

PSKModulator 系统对象使用 M 进制相移键控(M-PSK)方法调制信号,输出是调制信号的基带表示。

使用 M-PSK 方法调制信号:

  1. 创建 comm_PSKModulator 对象并设置属性;

  2. 使用 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(默认)| 整数向量
自定义符号编码,指定为整数向量,长度等于 ModulationOrder 属性的值且唯一值在 [0, (ModulationOrder–1)] 范围内。该向量的第一个元素对应角度为 0+PhaseOffset 的星座点,随后的元素逆时针运行;最后一个元素对应角度为 –2π/ModulationOrder + PhaseOffset 的星座点。

依赖

要启用此属性,请将 SymbolMapping 属性设置为 "Custom"。

数据类型: Float

# 用法

# 语法

modData = step(pskm, x)

# 说明

modData = step(pskm, x) 通过使用 M-PSK 方法调制输入信号,输出是调制的 M-PSK 基带信号。

# 输入参数

x - 输入信号
向量
输入信号,指定为整数或位的向量。BitInput 属性指定预期的输入值和向量长度。

数据类型: Float

# 输出参数

ModData - M-PSK 调制基带信号
标量 | 向量
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.

# 另请参阅

pskdemod | pskmod