运行链路仿真¶
无编码 BER 仿真¶
使用内置仿真函数, 在多个信噪比上批量计算 BER:
from nearlink_sdr.sim.link_sim import sim_gfsk_link
result = sim_gfsk_link(
num_data_bits=5000,
snr_range_db=np.arange(0, 16, 2),
)
for snr, ber in zip(result["snr_db"], result["ber"], strict=False):
print(f"SNR={snr:2d} dB BER={ber:.5f}")
QPSK 仿真:
from nearlink_sdr.sim.link_sim import sim_psk_link
result = sim_psk_link(
num_data_bits=5000,
mod_type="QPSK",
snr_range_db=np.arange(0, 16, 2),
)
Polar 编码 BER 仿真¶
from nearlink_sdr.sim.link_sim import sim_polar_coded_psk_link
result = sim_polar_coded_psk_link(
num_info_bits=5000,
mod_type="BPSK",
rate_str="1/2",
code_length=256,
snr_range_db=np.arange(-2, 10, 1),
)
多径信道仿真¶
from nearlink_sdr.phy.channel import ChannelConfig, ChannelModel
ch = ChannelModel(snr_db=15.0, config=ChannelConfig(channel_type="rayleigh"))
signal = np.ones(100) + 0j
rx = ch.apply_fading(signal)
跳频序列生成¶
from nearlink_sdr.phy.freq_hopping import generate_hopping_sequence
seq = generate_hopping_sequence(
n_hops=100,
hop_param2=0x123456,
)
绘制 BER 曲线¶
make sim-phase1
# 结果保存到 ber_phase1.png
一次性运行所有仿真¶
如果需要批量运行 Phase 1 到 Phase 16 的所有仿真场景,可以使用以下命令:
make sim-all
该命令会按顺序执行各个阶段的仿真程序。
全链路 Pipeline 仿真¶
使用 sim_pipeline_link 运行端到端 Pipeline 仿真, 内部调用完整的 tx_chain -> AWGN 信道 -> rx_chain 链路:
from nearlink_sdr.sim.link_sim import sim_pipeline_link
# FT2 QPSK MCS7 (码率 7/8)
result = sim_pipeline_link(
frame_type=2,
mcs_index=7,
n_data_bytes=10,
snr_range_db=np.arange(0, 16, 2),
n_frames=50,
)
for snr, ber, fer in zip(result["snr_db"], result["ber"], result["fer"], strict=False):
print(f"Eb/N0={snr:5.1f} dB BER={ber:.5f} FER={fer:.3f}")
支持所有帧类型:
from nearlink_sdr.sim.link_sim import sim_pipeline_link
# FT1 GFSK (无编码)
result_ft1 = sim_pipeline_link(frame_type=1, mcs_index=8)
# FT4 BPSK MCS0 (码率 1/4, 高编码增益)
result_ft4 = sim_pipeline_link(frame_type=4, mcs_index=0)
SleNode 集成仿真 (Phase 15)¶
Phase 15 基于 SleNode 实体进行端到端仿真:
from nearlink_sdr.sim.link_sim import sim_node_hopping_link
result = sim_node_hopping_link(n_frames=50, snr_db=12.0)
print(f"FER = {result['fer']:.4f}")
接入流程:
from nearlink_sdr.sim.link_sim import sim_node_access_flow
result = sim_node_access_flow()
信道扫频:
from nearlink_sdr.sim.link_sim import sim_node_channel_sweep
result = sim_node_channel_sweep(snr_range_db=np.array([0, 5, 10, 15], dtype=float))
功率自适应:
from nearlink_sdr.sim.link_sim import sim_node_power_adapt
result = sim_node_power_adapt(n_frames=100)
批量执行并生成可视化图:
make sim-phase15
Doppler 时变衰落与多用户干扰 (Phase 16)¶
Doppler 扩展对 FER 的影响¶
使用 Jakes 求和正弦模型模拟不同移动速度下的信道衰落:
from nearlink_sdr.sim.link_sim import sim_doppler_link
result = sim_doppler_link(
doppler_range_hz=[0, 10, 50, 200],
snr_db=12.0,
n_frames=n_frames,
mcs_index=7,
)
for fd, fer in zip(result["doppler_hz"], result["fer"], strict=False):
print(f"Doppler={fd:4.0f} Hz FER={fer:.3f}")
SIR 扫描¶
在固定 SNR 下, 改变信干比观察多用户干扰对 FER 的影响:
from nearlink_sdr.sim.link_sim import sim_sir_sweep
result_sir = sim_sir_sweep(
sir_range_db=[0, 5, 10, 15, 20],
snr_db=15.0,
n_frames=n_frames,
n_interferers=2,
)
for sir, fer in zip(result_sir["sir_db"], result_sir["fer"], strict=False):
print(f"SIR={sir:3.0f} dB FER={fer:.3f}")
Doppler + 多径联合¶
ITU Indoor Office 功率延迟谱与 Doppler 衰落的联合仿真:
from nearlink_sdr.sim.link_sim import sim_doppler_multipath_link
result_mp = sim_doppler_multipath_link(
doppler_range_hz=[0, 50, 200],
snr_db=15.0,
n_frames=n_frames,
)
for fd, fer in zip(result_mp["doppler_hz"], result_mp["fer"], strict=False):
print(f"Doppler+多径: fd={fd:3.0f} Hz FER={fer:.3f}")
批量执行 Phase 16 全部仿真并生成四面板可视化图:
make sim-phase16
信道损伤仿真¶
使用 sim_pipeline_channel_link 模拟衰落信道、载波频偏和均衡对链路的影响:
from nearlink_sdr.sim.link_sim import sim_pipeline_channel_link
# Rayleigh 平坦衰落, 无均衡
result_no_eq = sim_pipeline_channel_link(
frame_type=2,
mcs_index=7,
channel_type="rayleigh",
eq_method="none",
snr_range_db=np.arange(0, 20, 2),
n_frames=50,
)
# Rayleigh + MMSE 均衡 (genie-aided)
result_mmse = sim_pipeline_channel_link(
frame_type=2,
mcs_index=7,
channel_type="rayleigh",
eq_method="mmse",
snr_range_db=np.arange(0, 20, 2),
n_frames=50,
)
# AWGN + 500Hz 载波频偏
result_cfo = sim_pipeline_channel_link(
frame_type=2,
mcs_index=7,
channel_type="awgn",
cfo_hz=500.0,
snr_range_db=np.arange(0, 16, 2),
)
批量信道损伤仿真 (含均衡对比):
make sim-phase7
# 结果保存到 ber_phase7.png
MAC 帧级仿真¶
Phase 9 通过 MAC-PHY 适配层将 MAC 帧编码为 IQ 信号, 经信道传输后在接收端还原 MAC 载荷:
from nearlink_sdr.sim.link_sim import (
sim_mac_data_link,
sim_mac_mux_link,
sim_mac_signaling_link,
)
# 信令帧传输
result_sig = sim_mac_signaling_link(
snr_range_db=np.arange(0, 20, 2),
n_frames=50,
)
# 数据帧传输
result_data = sim_mac_data_link(
snr_range_db=np.arange(0, 16, 2),
n_frames=50,
mcs_index=7,
)
# 复用帧传输
result_mux = sim_mac_mux_link(
snr_range_db=np.arange(0, 16, 2),
n_frames=50,
)
make sim-phase9
多链路调度仿真¶
Phase 10 仿真调度器驱动的多链路并发传输:
from nearlink_sdr.sim.link_sim import (
sim_access_scheduled_link,
sim_multi_link,
)
# 多链路并发仿真
result_multi = sim_multi_link(
snr_range_db=np.arange(0, 16, 2),
n_links=3,
)
# 接入建链 + 调度仿真
result_access = sim_access_scheduled_link(
snr_range_db=np.arange(0, 16, 2),
)
make sim-phase10
安全通信仿真¶
Phase 11 模拟完整的安全链路建立: 接入 -> 配对 -> 加密数据传输:
from nearlink_sdr.sim.link_sim import (
sim_encrypted_vs_plain,
sim_secure_link,
)
# 安全链路端到端仿真
result_secure = sim_secure_link(
snr_range_db=np.arange(0, 16, 2),
n_frames=50,
mcs_index=7,
)
print(f"接入成功: {result_secure['access_ok']}, 配对成功: {result_secure['pairing_ok']}")
# 加密与明文 FER 对比
result_cmp = sim_encrypted_vs_plain(
snr_range_db=np.arange(0, 16, 2),
n_frames=50,
)
make sim-phase11
AMC 自适应调制编码仿真¶
Phase 12 扫描全部 MCS 等级 (0-12), 生成 AMC 包络吞吐量曲线:
from nearlink_sdr.sim.link_sim import sim_amc_throughput
result = sim_amc_throughput(
snr_range_db=np.arange(-2, 22, 1),
n_frames=50,
)
# AMC 包络吞吐量 (每个 SNR 点选择最优 MCS)
for snr, tp, mcs in zip(
result["snr_db"], result["amc_throughput"], result["amc_mcs"],
strict=False,
):
print(f"SNR={snr:5.1f} dB MCS={mcs:2d} Throughput={tp:.3f} bit/symbol")
仅仿真特定 MCS 子集:
from nearlink_sdr.sim.link_sim import sim_amc_throughput
result = sim_amc_throughput(mcs_indices=[0, 4, 8, 12])
HARQ 重传仿真¶
对比有/无 HARQ 重传的 FER 和吞吐量:
from nearlink_sdr.sim.link_sim import sim_harq_link
result = sim_harq_link(
snr_range_db=np.arange(0, 16, 1),
n_frames=100,
mcs_index=7,
max_retries=3,
)
for snr, fer_no, fer_harq, avg_tx in zip(
result["snr_db"],
result["fer_no_harq"],
result["fer_harq"],
result["avg_transmissions"],
strict=False,
):
print(
f"SNR={snr:5.1f} dB "
f"FER(no HARQ)={fer_no:.3f} "
f"FER(HARQ)={fer_harq:.3f} "
f"Avg TX={avg_tx:.2f}"
)
跳频多径仿真¶
对比固定信道与跳频在 Rayleigh 衰落下的 FER:
from nearlink_sdr.sim.link_sim import sim_hopping_multipath_link
result = sim_hopping_multipath_link(
snr_range_db=np.arange(0, 20, 2),
n_frames=100,
n_hop_channels=8,
)
生成 Phase 12 全部仿真图:
make sim-phase12
# 结果保存到 ber_phase12.png
Phase 14: 双节点端到端仿真¶
使用 SleNode 实体进行完整的双节点数据交换仿真:
from nearlink_sdr.sim.link_sim import (
sim_dual_node_link,
sim_dual_node_mcs_adapt,
sim_dual_node_secure_link,
)
# 基础 FER/BER 仿真
result = sim_dual_node_link(
snr_range_db=np.arange(0, 16, 2),
n_frames=50,
mcs_index=7,
payload_size=10,
)
for snr, fer in zip(result["snr_db"], result["fer"], strict=False):
print(f"SNR={snr:2.0f} dB FER={fer:.3f}")
# 安全通信仿真 (配对 + 加密)
result_sec = sim_dual_node_secure_link(
snr_range_db=np.arange(0, 16, 2),
n_frames=50,
)
print(f"配对状态: {'成功' if result_sec['pairing_ok'] else '失败'}")
# MCS 自适应跟踪
result_mcs = sim_dual_node_mcs_adapt(
snr_db=8.0,
n_frames=100,
initial_mcs=7,
)
print(f"最终 MCS: {result_mcs['mcs_history'][-1]}")
生成 Phase 14 全部仿真图:
make sim-phase14
# 结果保存到 ber_phase14.png
运行示例¶
make examples