AnyMath 文档
Notebook

5G中的PUCCH信号

本文提出了一种用于在5g标准中产生和处理上行链路信号的系统,即-**Pucch(物理上行链路控制信道)**控制信道。 这个例子使我们能够直观地探索每种格式的信号处理链的差异,比较它们的结构复杂性,所使用的调制,编码和频谱扩展的方法。 Pucch(物理上行链路控制信道)是5G NR中的物理上行链路信道,专门用于将Uci(上行链路控制信息)控制信息从用户设备(UE)传输到基站(gNB)。

PUCCH提供三种主要类型的控制信息(UCI)的传输:

  1. HARQ-ACK-传入数据接收的确认(HARQ-ACK/NACK)。
  2. CSI(信道状态信息)-无线信道状态报告(CQI,RI,PMI)。
  3. SR(调度请求)-请求为数据传输分配资源。

不像
PUSCH数据信道,pucch被优化为以最小的延迟和高可靠性传输少量的服务信息。 在5G NR中,与LTE相比,信道的实现具有更高的灵活性:支持多种格式(0-4),可配置持续时间(1-14个OFDM字符),动态资源分配和频率/时间复用。

image.png

该模型实现并比较PUCCH1-4格式(pucch0未实现,因为它设计用于具有超短持续时间的1-2位)。 每种格式被优化用于传输某些类型的控制信息(Uci-上行链路控制信息)。

In [ ]:
function run_model( name_model)
    Path = (@__DIR__) * "/" * name_model * ".engee"
    if name_model in [m.name for m in engee.get_all_models()] 
        model = engee.open( name_model ) 
        model_output = engee.run( model, verbose=true );
    else
        model = engee.load( Path, force=true ) 
        model_output = engee.run( model, verbose=true );
        engee.close( name_model, force=true );
    end
    sleep(0.1)
    return model_output
end
run_model("PUCCH_model") 
Building...
Progress 0%
Progress 100%
Out[0]:
SimulationResult(
    run_id => 1,
    "PUCCH PRBS.1" => WorkspaceArray{Vector{Bool}}("PUCCH_model/PUCCH4/PUCCH PRBS.1")
,
    "In1.1" => WorkspaceArray{Vector{Int64}}("PUCCH_model/PUCCH2/In1.1")
,
    "Transform Precoding.1" => WorkspaceArray{Vector{ComplexF64}}("PUCCH_model/PUCCH4/Transform Precoding.1")
,
    "Spreading.Out1" => WorkspaceArray{Vector{ComplexF64}}("PUCCH_model/PUCCH4/Spreading.Out1")
,
    "Convert in Int.1" => WorkspaceArray{Vector{Int64}}("PUCCH_model/PUCCH3/Convert in Int.1")
,
    "Transform Precoding-1.1" => WorkspaceArray{Vector{ComplexF64}}("PUCCH_model/PUCCH3/Transform Precoding-1.1")
,
    "Symbol Modulate-1.1" => WorkspaceArray{Vector{ComplexF64}}("PUCCH_model/PUCCH2/Symbol Modulate-1.1")
,
    "# Get the orthogonal sequence from spreading factor and orthogonal
        # cover code index.oSeq" => WorkspaceArray{Vector{ComplexF64}}("PUCCH_model/PUCCH1/# Get the orthogonal sequence from spreading factor and orthogonal
        # cover code index.oSeq")
,
    "Spreading Format-1.1" => WorkspaceArray{Vector{ComplexF64}}("PUCCH_model/PUCCH1/Spreading Format-1.1")
,
    "# Get the PUCCH format 1 sequence.Seq" => WorkspaceArray{Vector{ComplexF64}}("PUCCH_model/PUCCH1/# Get the PUCCH format 1 sequence.Seq")
,
    "Spreading Format.1" => WorkspaceArray{Vector{ComplexF64}}("PUCCH_model/PUCCH1/Spreading Format.1")
,
    "Symbol Modulate.1" => WorkspaceArray{Vector{ComplexF64}}("PUCCH_model/PUCCH4/Symbol Modulate.1")
,
    "PUCCH PRBS-1.1" => WorkspaceArray{Vector{Bool}}("PUCCH_model/PUCCH2/PUCCH PRBS-1.1")
,
    "# Parse and validate inputs.y" => WorkspaceArray{Matrix{ComplexF64}}("PUCCH_model/PUCCH1/# Parse and validate inputs.y")

)

模型中实现的PUCCH格式的比较分析:

PUCCH格式的技术特点

/格式/用途/调制/变换预编码/特征|
|:---|:---|:---|:---|:---|
|PUCCH1/短UCI(1-2位)/低PAPR/是/OCC|
|PUCCH2/CSI/QPSK/No|-|
|PUCCH3/HARQ-ACK,SR/QPSK+DFT/是|-|
|PUCCH4/高容量/QPSK+扩频/是/OCC+CDM|

In [ ]:
using EngeeDSP
using Statistics, LinearAlgebra
using FFTW  
using StatsBase 

function unwrap(phase::Vector{Float64})
    unwrapped = copy(phase)
    for i in 2:length(phase)
        diff = phase[i] - phase[i-1]
        if diff > π
            unwrapped[i] -= 2π
        elseif diff < -π
            unwrapped[i] += 2π
        end
    end
    return unwrapped
end

function compute_papr(signal::AbstractArray{<:Complex})
    power = abs2.(signal)
    papr_db = 10 * log10(maximum(power) / mean(power))
    return round(papr_db, digits=2)
end

function compute_spectrum(signal::AbstractArray{<:Complex}, fs=1.0)
    N = length(signal)
    fft_result = fft(signal)
    freqs = fftfreq(N, fs)
    pwr = abs2.(fft_result) / N
    return freqs, pwr
end

function analyze_constellation(signal::AbstractArray{<:Complex}, title)
    p = scatter(real.(signal), imag.(signal),
                title=title, xlabel="In-phase (I)", ylabel="Quadrature (Q)",
                legend=false, markersize=4, markerstrokewidth=0, alpha=0.7,
                aspect_ratio=:equal)
    return p
end

function compute_signal_stats(signal::AbstractArray{<:Complex}, name)
    println("\n" * "═"^50)
    println("统计数字:$名称")
    println("═"^50)
    println("   数据类型:$(eltype(signal))")
    println("   尺寸:$(尺寸(信号))")
    println("   PAPR:$(compute_papr(signal))dB")
    println("   能量:△(round(sum(abs2.(信号)),数字=2))")
    println("   平均振幅:△(round(mean(abs.(信号)),数字=4))")
    println("   平均相位:△(round(mean(angle.(信号)),数字=4))高兴")
end
Out[0]:
compute_signal_stats (generic function with 1 method)

**PUCCH格式1:**使用具有低PAPR(峰值因子)序列模拟短控制信息(1-2位)的传输。 包括操作:

  1. 低PAPR序列的生成(nrLowPAPRS).

  2. 通过自定义块进行外部参数管理(Engee Function).

  3. 利用**正交复盖码(Occ-Orthogonal Cover Codes)**通过块 Spreading Format 以分离用户。

image.png
In [ ]:
y = collect(simout["PUCCH_model/PUCCH1/# Parse and validate inputs.y"]).value[end]
oSeq1 = collect(simout["PUCCH_model/PUCCH1/Spreading Format-1.1"]).value[end]
final = collect(simout["PUCCH_model/PUCCH1/# Get the PUCCH format 1 sequence.Seq"]).value[end]

compute_signal_stats(y, "信号y(nrpucch1后)")
compute_signal_stats(oSeq1, "正交序列1")
compute_signal_stats(final, "最后的序列")

p1 = analyze_constellation(y, "PUCCH1:'y'信号的星座")
p2 = analyze_constellation(final, "Pucch1:最后的星座")
p3 = plot(abs.(final), title="Pucch1:振幅包络",
            xlabel="计数", ylabel="的振幅", legend=false, grid=true)
display(plot(p1, p2, p3, layout=(1,3), size=(1200, 400)))
savefig("pucch1_analysis.png")
══════════════════════════════════════════════════
СТАТИСТИКА: Сигнал y (после nrPUCCH1)
══════════════════════════════════════════════════
   Тип данных:          ComplexF64
   Размер:              (12, 7)
   PAPR:                0.0 дБ
   Энергия:             84.0
   Средняя амплитуда:   1.0
   Средняя фаза:        -0.2805 рад

══════════════════════════════════════════════════
СТАТИСТИКА: Ортогональная последовательность 1
══════════════════════════════════════════════════
   Тип данных:          ComplexF64
   Размер:              (4,)
   PAPR:                0.0 дБ
   Энергия:             4.0
   Средняя амплитуда:   1.0
   Средняя фаза:        1.5708 рад

══════════════════════════════════════════════════
СТАТИСТИКА: Финальная последовательность
══════════════════════════════════════════════════
   Тип данных:          ComplexF64
   Размер:              (84,)
   PAPR:                0.0 дБ
   Энергия:             84.0
   Средняя амплитуда:   1.0
   Средняя фаза:        0.2431 рад
Out[0]:
"/user/my_projects/Demo/5G_PUCCH/pucch1_analysis.png"

PUCCH格式2:用于传输较长长度的CSI(信道状态信息)。 处理链包括:

  1. 加扰使用伪随机序列发生器(PUCCH PRBS).

  2. QPSK调制(Symbol Modulate).

  3. 与其他格式相比,结构相对简单。

image.png
In [ ]:
prbs_bits = collect(simout["PUCCH_model/PUCCH2/PUCCH PRBS-1.1"]).value[end]
modulated = collect(simout["PUCCH_model/PUCCH2/Symbol Modulate-1.1"]).value[end]
println("加扰比特(PRB):")
println("   位数:$(length(prbs_bits))")
println("   余额(1/0):$(sum(prbs_bits))/$(sum(。!prbs_bits))")

compute_signal_stats(modulated, "QPSK调制字符")
unique_symbols = unique(round.(modulated, digits=6))
println("\Qpsk星座的Punic点:")
for sym in unique_symbols
    println("   I=$(round(real(sym), digits=4)), Q=$(round(imag(sym), digits=4))")
end

phase = angle.(modulated)
instant_freq = diff(unwrap(phase)) 
p1 = histogram(instant_freq, bins=30, title="Pucch2:瞬时频率",
                xlabel="频率", ylabel="发生频率", legend=false)
p2 = analyze_constellation(modulated, "PUCCH2:QPSK星座")

display(plot(p1, p2, layout=(1,2), size=(1200, 400)))
savefig("pucch2_analysis.png")
Скремблированные биты (PRBS):
   Кол-во бит: 96
   Баланс (1/0): 44/52

══════════════════════════════════════════════════
СТАТИСТИКА: Модулированные QPSK символы
══════════════════════════════════════════════════
   Тип данных:          ComplexF64
   Размер:              (48,)
   PAPR:                0.0 дБ
   Энергия:             48.0
   Средняя амплитуда:   1.0
   Средняя фаза:        -0.1309 рад

Уникальные точки QPSK созвездия:
   I=0.7071, Q=-0.7071
   I=-0.7071, Q=-0.7071
   I=-0.7071, Q=0.7071
   I=0.7071, Q=0.7071
Out[0]:
"/user/my_projects/Demo/5G_PUCCH/pucch2_analysis.png"

PUCCH格式3:用于传输HARQ-ACK和SR中等容量。 特征:

  1. 将逻辑位转换为整数值。

  2. 符号调制(QPSK)

  3. 变换预编码,在OFDM调制之前使用Dft(离散傅立叶变换),这对于在上行链路中具有dft-s-OFDM(SC-FDMA)子载波是典型的。

image.png
In [ ]:
converted = collect(simout["PUCCH_model/PUCCH3/Convert in Int.1"]).value[end]
final = collect(simout["PUCCH_model/PUCCH3/Transform Precoding-1.1"]).value[end]
println("\转换的整数数据:")
println("   范围:$(最小(转换))-$(最大(转换))")
println("   平均值:$(圆形(平均值(转换),数字=2))")
compute_signal_stats(final, "变换预编码后的信号")

N = length(final)
fs = 1.0 
fft_result = fft(final)
freqs = fftfreq(N, fs)
pwr = abs2.(fft_result) / N
p1 = plot(freqs, pwr, title="Pucch3:功率谱密度",
            xlabel="频率", ylabel="功率(dB)", legend=false, grid=true,
            xlim=(-0.5, 0.5))
p2 = analyze_constellation(final, "Pucch3:DFT后的星座")

max_pwr = maximum(pwr)
half_pwr = max_pwr / 2 
indices = findall(pwr .> half_pwr)
if !isempty(indices)
    min_freq = minimum(freqs[indices])
    max_freq = maximum(freqs[indices])
    bandwidth = max_freq - min_freq
    println("\车道宽度标记:")
    println("   带宽在3分贝水平:$((带宽,数字=4))")
else
    println("我们还没有能够估计3dB级别的带宽")
end
display(plot(p1, p2, layout=(1,2), size=(900, 400)))
savefig("pucch3_analysis.png")
Преобразованные целочисленные данные:
   Диапазон: 0 - 1
   Среднее: 0.57

══════════════════════════════════════════════════
СТАТИСТИКА: Сигнал после Transform Precoding
══════════════════════════════════════════════════
   Тип данных:          ComplexF64
   Размер:              (48,)
   PAPR:                13.8 дБ
   Энергия:             48.0
   Средняя амплитуда:   0.2041
   Средняя фаза:        0.0327 рад

Оценка ширины полосы:
   Ширина полосы по уровню 3 дБ: 0.9583
Out[0]:
"/user/my_projects/Demo/5G_PUCCH/pucch3_analysis.png"

PUCCH格式4:被设计为传送高容量控制信息用于单个用户或具有码分复用用于多个用户。 它具有最复杂的结构:

  1. 顺序加扰,QPSK调制。

  2. 块明智的传播在一个单独的子系统中实现 Spreading. 该过程将调制符号乘以正交复盖码(OCCs)以创建信号的多个副本,这增加了可靠性和/或允许用户的多路复用。

  3. 变换预编码。

image.png
In [ ]:
prbs = collect(simout["PUCCH_model/PUCCH4/PUCCH PRBS.1"]).value[end]
modulated = collect(simout["PUCCH_model/PUCCH4/Symbol Modulate.1"]).value[end]
after_spreading = collect(simout["PUCCH_model/PUCCH4/Spreading.Out1"]).value[end]
final = collect(simout["PUCCH_model/PUCCH4/Transform Precoding.1"]).value[end]
compute_signal_stats(modulated, "在按块传播之前")
compute_signal_stats(after_spreading, "传播后")
compute_signal_stats(final, "变换后预编码")
gain_factor = mean(abs2.(after_spreading)) / mean(abs2.(modulated))
println("按块传播的效率:")
println("   功率增益:$(round(gain_factor,digits=2))")

plots = []
push!(plots, analyze_constellation(modulated, "在传播之前"))
push!(plots, analyze_constellation(after_spreading, "传播后"))
push!(plots, analyze_constellation(final, "最终信号"))
p4 = plot(abs.(modulated), label="在传播之前", linewidth=1.5, alpha=0.8)
plot!(p4, abs.(after_spreading), label="传播后", linewidth=1, alpha=0.7)
plot!(p4, abs.(final), label="预编码后", linewidth=1, alpha=0.7,
        title="Pucch4:比较振幅", xlabel="计数", ylabel="的振幅", grid=true)
push!(plots, p4)
display(plot(plots..., layout=(2,2), size=(1000, 800)))
savefig("pucch4_analysis.png")
══════════════════════════════════════════════════
СТАТИСТИКА: До Block-wise Spreading
══════════════════════════════════════════════════
   Тип данных:          ComplexF64
   Размер:              (48,)
   PAPR:                0.0 дБ
   Энергия:             48.0
   Средняя амплитуда:   1.0
   Средняя фаза:        0.3272 рад

══════════════════════════════════════════════════
СТАТИСТИКА: После Spreading
══════════════════════════════════════════════════
   Тип данных:          ComplexF64
   Размер:              (96,)
   PAPR:                0.0 дБ
   Энергия:             96.0
   Средняя амплитуда:   1.0
   Средняя фаза:        -0.0654 рад

══════════════════════════════════════════════════
СТАТИСТИКА: После Transform Precoding
══════════════════════════════════════════════════
   Тип данных:          ComplexF64
   Размер:              (96,)
   PAPR:                8.73 дБ
   Энергия:             96.0
   Средняя амплитуда:   0.6323
   Средняя фаза:        0.2887 рад

Эффективность Block-wise Spreading:
   Коэффициент усиления мощности: 1.0
Out[0]:
"/user/my_projects/Demo/5G_PUCCH/pucch4_analysis.png"

,关键建模结果

△PAPR(峰值因子)

-**PUCCH1:**0.0dB-低PAPR序列,非常适合UE能效
—**PUCCH2:**0.0dB-qpsk与模型中的恒定包络
-**PUCCH3:**13.8dB-高PAPR是典型的DFT-s-OFDM
-**PUCCH4:**8.73dB-容量和功耗之间的平衡

▪特定功能

-**PUCCH1:**低PAPR+OCC-用于短ACK/NACK和SR
-**PUCCH2:**简单QPSK链-用于定期CSI报告
-**PUCCH3:**DFT-s-OFDM-为HARQ-ACK+SR中等容量
-**PUCCH4:**块明智的传播+CDM-为高容量和多用户情况

*数据量

-**PUCCH1:**84个字符(效率低,~0.024位/字符)
-**PUCCH2:**48个字符(1.0位/字符)
-**PUCCH3:**48个字符(1.0位/字符)
-**Pucch4:**扩展后96个字符(1.0位/字符)

▪与理论的比较

所有结果均符合3GPP规范:

-PUCCH1:为物联网设备设计的低PAPR
-PUCCH3:dft-S-OFDM预期的高PAPR(13.8dB)
-Pucch4:扩频给出1.0功率增益-正交码分离用户,而不是增益
-资源效率从PUCCH1增加到PUCCH4,与处理的复杂性成比例

结论

所有四种PUCCH格式都在模型中正确实现,其特性符合3GPP5G NR规范。

/格式/目的/优点|
|:---|:---|:---|
|PUCCH1/短控制信息/最低功耗,低PAPR|
|PUCCH2/CSI传输(信道状态信息)/易于实现,运行稳定|
|PUCCH3/HARQ-ACK和调度请求/容量和可靠性的平衡|
|PUCCH4/高容量,多用户访问/CDM支持,扩展功能|

5G NR模型中PUCCH格式实现的关键结论:

  1. 四种PUCCH格式中的每一种都在容量、延迟和能效之间实现了明确定义的折衷,从而允许自适应配置满足网络场景的特定要求。

  2. 该模型清楚地表明了传输的控制信息类型(UCI)与信号路径复杂性之间的直接关系—从用于简短确认的简约PUCCH0到具有CDM支持的多用户操作的高容量PUCCH4。

  3. 物理层的所有关键组件--加扰、调制、变换预编码和频谱扩展--都严格按照3GPP TS38.211规范实施,确保模型与标准完全兼容。

  4. 所提出的实现不仅作为教育工具,而且作为第五代通信系统中原型设计,测试和验证真实世界PUCCH信号处理算法的有效基础。