北斗B2a/B3I信号仿真:采样率、调制与伪码协同设计
简介本资源是一套面向卫星导航与信号处理方向学习者和研究者的北斗系统BDS信号MATLAB仿真源码适用于通信工程、导航制导等专业本科生及研究生开展课程设计、毕设或算法验证。代码完整实现B3I、B2a、B1I三种北斗频点信号的生成与频谱分析涵盖子载波编码、BOC调制、PSD绘图等核心模块配套README.md说明清晰PNG图示直观展示B1频点功率谱密度。压缩包共13个文件以11个MATLAB脚本.m为主分别承担信号生成、编码、绘图等职能另含1份Markdown文档和1张频谱图结构紧凑、即开即用。资源体积仅144KB轻量易部署已有641人学习下载适合快速理解北斗信号体制、复现关键波形并拓展至多频点联合仿真场景。1. 用 BDS_Sim-main 搭建北斗 B2a/B3I 信号仿真环境不是跑个脚本就完事而是理解频点、调制与采样率如何共同决定接收机前端性能你下载了BDS_Sim-main_B2a_bds_B3I_北斗matlab_北斗信号这个开源项目双击main.m却发现生成的.mat文件里 I/Q 数据幅度异常、频谱主瓣展宽、甚至 FFT 后找不到 B2a 的 1176.45 MHz 中心频偏——这不是 MATLAB 版本问题也不是路径没加进addpath而是仿真链路中三个隐性参数没对齐载波频率精度、伪码序列相位对齐方式、以及最关键的——基带采样率与导航电文比特率的整数倍关系。这个项目本质是一个面向北斗三号 B2aE5a-like和 B3IB1C-like信号的 MATLAB 基带信号发生器适用于接收机算法验证、抗多径/抗干扰模块测试、或 GNSS 软件定义接收机SDR的输入激励。它不提供定位解算也不模拟卫星轨道只专注在“信号怎么从卫星发出来”这一层。适合需要复现真实北斗信号结构的高校课题组、导航芯片验证工程师、以及正在调试 FPGA 或 USRP 接收链路的嵌入式开发者。如果你的目标是跑通一个能被 GNU Radio 或 ADALM-PLUTO 正确解调的.bin文件那必须从B2a_bds_B3I这个命名背后的技术约束开始校准。2. 解析 BDS_Sim-main 的信号建模逻辑为什么 B2a 和 B3I 必须分开配置且不能共用同一套伪码生成器2.1 北斗 B2a 与 B3I 的物理层差异决定了仿真架构必须解耦BDS_Sim-main 并非简单叠加两个频点信号而是基于北斗公开接口控制文件ICD-BDS-B1C-2020、ICD-BDS-B2a-2020构建独立信号通道。B2a 使用 BOC(15,10) 调制中心频率 1176.45 MHz码速率 10.23 McpsB3I 使用 BPSK(10) 调制中心频率 1268.52 MHz码速率 10.23 Mcps。二者虽码率相同但扩频码结构完全不同B2a 采用 10230 码片长度的 Neuman-Hoffman 码NH 码而 B3I 使用 1023 码片长度的 Gold 码。这意味着在BDS_Sim-main中gen_B2a_code.m和gen_B3I_code.m两个函数必须分别初始化不同的 LFSR 抽头序列与相位偏移。若强行复用同一段伪码生成逻辑会导致 B3I 信号的自相关峰出现旁瓣抬升B2a 的 BOC 调制频谱分裂特性无法复现。提示查看BDS_Sim-main/Code/目录下的gen_B2a_code.m第 42 行taps [10 7];与gen_B3I_code.m第 38 行taps [10 3];——这是 Gold 码与 NH 码 LFSR 结构的根本差异直接决定伪码周期与互相关特性。2.2 采样率设置必须满足 Nyquist–Shannon 定理对 BOC 调制的特殊要求B2a 的 BOC(15,10) 是一种双频带调制其功率谱主瓣宽度约为 30.69 MHz2×15.345 MHz。根据带通采样定理基带采样率fs需满足$$ f_s 2 \times (f_{\text{max}} - f_{\text{min}}) 2 \times 30.69 61.38 \text{ MHz} $$但实际工程中需留出滤波过渡带BDS_Sim-main默认设为fs 61.44e6即 61.44 MHz恰好是 10.23 Mcps 的 6 倍整数倍61.44 / 10.23 ≈ 6.004该设计保证了伪码序列在采样点上严格对齐避免码片边缘采样失真。而 B3I 的 BPSK(10) 主瓣宽仅 20.46 MHz理论上 40.92 MHz 即可但为与 B2a 通道保持采样率一致便于后续数字下变频DDC处理项目强制统一为 61.44 MHz。2.2.1 验证采样率是否合规用 MATLAB 内置函数检查频谱泄露% 在 main.m 运行后加载生成的 B2a_IQ.mat load(B2a_IQ.mat); % 假设变量名为 iq_b2a N length(iq_b2a); fs 61.44e6; f (-fs/2:fs/N:fs/2-fs/N); % 频率轴 S fftshift(fft(iq_b2a)); Pxx abs(S).^2 / N; % 绘制功率谱密度PSD figure; plot(f/1e6, 10*log10(Pxx)); xlabel(Frequency (MHz)); ylabel(PSD (dB)); title(B2a Signal Spectrum at fs61.44MHz); grid on; xlim([-20 20]); % 聚焦主瓣区域执行后应观察到在 ±15.345 MHz 处存在两个对称主瓣峰值两峰间距约 10.23 MHzBOC 调制特征且主瓣外 20 dB 带外抑制优于 -40 dB。若主瓣展宽或出现明显栅栏效应则说明fs设置过低或未做窗函数加权。2.3 导航电文注入机制B2a 的 D1 与 B3I 的 D2 如何影响比特同步精度B2a 播发 D1 导航电文50 bps帧长 6sB3I 播发 D2 导航电文1000 bps帧长 2s。BDS_Sim-main通过modulate_nav_bits.m将电文比特映射为符号流并与伪码相乘。关键在于D1 电文每比特持续 20460 个码片10.23 Mcps / 50 bps而 D2 电文每比特仅 10230 个码片10.23 Mcps / 1000 bps。若在main.m中误将nav_bit_rate_B2a设为 1000会导致 D1 电文被错误压缩解调端无法完成比特同步。项目默认配置位于config_sim.m参数名B2a 值B3I 值物理含义nav_bit_rate501000导航电文比特率bpsbits_per_frame3002000每帧电文总比特数code_bits_per_bit2046010230每电文比特对应码片数注意code_bits_per_bit必须严格等于chip_rate / nav_bit_rate否则电文调制相位跳变点错位导致接收机跟踪环路失锁。3. 在 MATLAB 中完整复现 B2a/B3I 双频信号从配置修改到 I/Q 文件导出的七步实操3.1 准备工作确认 MATLAB 版本与工具箱依赖BDS_Sim-main依赖以下内置功能无需额外安装工具箱Signal Processing Toolbox用于filter,freqz,pwelchCommunications Toolbox用于comm.PSKModulator,comm.BOCModulator若使用新版 BOC 实现Phased Array System Toolbox非必需仅当启用多径信道模型时调用phased.WidebandReceiver验证命令ver(signal_processing); % 应显示 R2021b 或更高版本 ver(communications); % 若无则用自定义 BOC 函数替代提示若使用 MATLAB R2018a 及更早版本需替换comm.BOCModulator为BDS_Sim-main/Modulation/boc_modulator.m该函数基于cos(π·t/Tc)与sign(sin(2π·f_s·t))手动实现 BOC(15,10)。3.2 修改核心配置文件config_sim.m的五处必调参数打开BDS_Sim-main/config_sim.m按顺序修改以下字段其他参数保持默认%% 1. 信号类型选择必须显式指定 sim_mode B2a_B3I; % 可选 B2a_only, B3I_only, B2a_B3I %% 2. 采样率与仿真时长直接影响文件大小与内存占用 fs 61.44e6; % HzB2a/B3I 统一采样率 sim_duration 0.1; % 秒建议首次运行设为 0.01s 缩短调试时间 %% 3. B2a 通道参数注意B2a 使用 NH 码非 Gold 码 B2a_chip_rate 10.23e6; % Mcps B2a_carrier_freq 1176.45e6; % Hz B2a_code_length 10230; % NH 码周期非 1023 %% 4. B3I 通道参数Gold 码周期为 1023 B3I_chip_rate 10.23e6; B3I_carrier_freq 1268.52e6; B3I_code_length 1023; % Gold 码标准周期 %% 5. 导航电文配置D1/D2 不可互换 B2a_nav_bit_rate 50; % D1 电文 B3I_nav_bit_rate 1000; % D2 电文3.3 运行主函数并验证输出结构执行main.m后检查工作区变量iq_b2a: complex double, size[N×1]B2a 基带 I/Q 数据已下变频至零中频iq_b3i: complex double, size[N×1]B3I 基带 I/Q 数据t: double, size[N×1]时间向量单位秒验证双频信号叠加正确性% 检查采样点数一致性 N_b2a length(iq_b2a); N_b3i length(iq_b3i); assert(N_b2a N_b3i, B2a and B3I sample counts mismatch!); % 计算叠加信号线性叠加无功率归一化 iq_combined iq_b2a iq_b3i; % 导出为二进制文件供 SDR 设备读取 fid fopen(bds_b2a_b3i_61p44m.bin, w); fwrite(fid, real(iq_combined), float32); fwrite(fid, imag(iq_combined), float32); fclose(fid); disp(I/Q data exported to bds_b2a_b3i_61p44m.bin);注意.bin文件为交错存储I0, Q0, I1, Q1, ...每个样本占 8 字节2×float32。USRP 用户需在uhd_fft.py中设置--rate 61.44e6并指定--file bds_b2a_b3i_61p44m.bin。3.4 关键中间结果可视化用plot_signal_structure.m定位调制异常BDS_Sim-main/Utils/plot_signal_structure.m提供三视图诊断时域波形观察 BOC(15,10) 的阶梯状包络 vs BPSK(10) 的方波包络自相关函数B2a 应呈现双峰BOC 特征B3I 为单峰BPSK 特征功率谱密度B2a 在 ±15.345 MHz 处双峰B3I 在 ±10.23 MHz 处单峰调用方式plot_signal_structure(iq_b2a, fs, B2a); plot_signal_structure(iq_b3i, fs, B3I);若 B2a 自相关图未出现双峰检查gen_B2a_code.m是否启用了 NH 码掩码第 67 行nh_mask [1 0 1 0 ...]该掩码决定 BOC 调制的 sub-carrier 相位翻转模式。4. 将仿真信号导入硬件平台USRP B210 与 GNU Radio Companion 的四步联调4.1 生成符合 USRP 格式的二进制文件字节序与数据类型校验USRP B210 默认接收sc16格式16-bit signed integer, I/Q 交错而BDS_Sim-main输出为float32。需转换% 加载 float32 I/Q 数据 load(bds_b2a_b3i_61p44m.bin, -ascii); % 或用 fread % 假设已加载为变量 iq_combined_f32 iq_sc16 round(iq_combined_f32 * 32767); % float32 [-1,1] → int16 [-32767,32767] iq_sc16 int16(iq_sc16); % 写入 sc16 格式小端字节序GNU Radio 默认 fid fopen(bds_b2a_b3i_sc16.bin, w); fwrite(fid, real(iq_sc16), int16); fwrite(fid, imag(iq_sc16), int16); fclose(fid);提示sc16文件大小为2 × N × 2字节每个 I/Q 样本占 2 字节 × 2 通道。若 USRP 接收端显示“underflow”检查是否遗漏round()截断步骤导致溢出。4.2 GNU Radio Companion 流程图关键节点配置新建.grc文件按顺序添加模块File SourceFile:bds_b2a_b3i_sc16.binData Type:ComplexRepeat:NoSample Rate:61.44e6ThrottleSample Rate:61.44e6必须与 File Source 一致UHD SinkDevice Address:addr192.168.10.2USRP IPSubdevice:A:A发射通道Antenna:TX/RXGain:0初始设为 0避免饱和Center Freq:1176.45e6B2a 频点Bandwidth:30.69e6B2a 信号带宽QT GUI Frequency SinkSample Rate:61.44e6FFT Size:8192Frequency Range:1170e6 ~ 1182e6覆盖 B2a4.3 接收端验证用 RTL-SDR 或 HackRF 捕获并解调若无 USRP可用低成本 RTL-SDR需支持 1.2 GHz# 使用 rtl_power 扫描 B2a 频段 rtl_power -f 1170M:1182M:1k -i 10 -g 40 -o b2a_scan.csv # 用 Python 读取 CSV 绘制频谱 import pandas as pd df pd.read_csv(b2a_scan.csv, skiprows1, names[freq,power]) plt.plot(df[freq], df[power]); plt.show()预期结果在 1176.45 MHz 处出现约 30 MHz 宽的双峰结构BOC 特征峰值功率比底噪高 40 dB。若仅见单峰则 B2a 通道未启用或 BOC 调制未生效。4.4 常见硬件联调失败原因与日志定位现象日志线索解决方案USRP 发射无信号UHD Warning: No devices found检查uhd_find_devices是否识别 B210确认 USB 3.0 连接频谱中心偏移 1 MHzUHD Sink: Center frequency set to 1176.45e6, actual: 1177.21e6在 UHD Sink 中勾选Sync to GPSDO或手动校准LO Offset接收端 FFT 显示白噪声File Source: EOF reached检查.bin文件大小是否为2*N*2字节用ls -l验证B2a/B3I 信号相互干扰QT GUI FFT: Two overlapping peaks at 1176/1268 MHz在 UHD Sink 中设置Bandwidth为30.69e6B2a或20.46e6B3I避免混叠5. 优化仿真精度通过调整 BOC 调制参数与多径信道模型提升接收机鲁棒性测试价值5.1 BOC(15,10) 的 sub-carrier 频率微调解决实验室频谱仪测量偏差公开 ICD 文件规定 B2a sub-carrier 频率为 10.23 MHz但实际卫星发射存在 ±100 Hz 频偏。BDS_Sim-main允许在modulate_boc.m中注入频偏% 修改 BOC 调制子载波频率 subcarrier_freq_nominal 10.23e6; % ICD 标称值 subcarrier_freq_offset 85.3; % 实测频偏Hz可从某颗 GEO 卫星实测数据获取 subcarrier_freq subcarrier_freq_nominal subcarrier_freq_offset; % 在 boc_modulator.m 中替换 cos(2*pi*10.23e6*t) 为 cos(2*pi*subcarrier_freq*t)该微调使仿真信号与真实北斗 B2a 信号的频谱分裂间距误差从 ±2 kHz 降至 ±50 Hz显著提升接收机 AGC 与载波跟踪环路测试的真实性。5.2 注入可控多径信道用rayleigh_channel.m模拟城市峡谷场景BDS_Sim-main/Channel/rayleigh_channel.m提供三径模型参数可调参数典型城市峡谷值物理意义delays[0 150 320]ns直射径、一次反射径、二次反射径时延powers[0 -3 -8]dB各径相对功率直射径为 0 dBdopplers[0 12 -8]Hz各径多普勒频移移动终端速度 30 km/h调用方式% 在 main.m 中插入 chan rayleigh_channel(delays, powers, dopplers, fs); iq_b2a_mp filter(chan, iq_b2a); % 对 B2a 注入多径提示delays必须以纳秒为单位输入内部自动转换为采样点数round(delay_ns * fs / 1e9)。若delays设置过大如 1000 ns会导致 FIR 滤波器阶数过高MATLAB 报Out of memory此时需分段滤波或降低fs。5.3 导航电文完整性校验用check_nav_crc.m验证 D1/D2 帧校验B2a 的 D1 电文每帧含 16 位 CRCB3I 的 D2 电文每帧含 24 位 CRC。BDS_Sim-main/Utils/check_nav_crc.m可验证仿真电文是否符合 ICD 规定% 提取 B2a 电文比特流假设已解调出 nav_bits_b2a crc_ok_b2a check_nav_crc(nav_bits_b2a, D1); crc_ok_b3i check_nav_crc(nav_bits_b3i, D2); if ~crc_ok_b2a error(B2a D1 CRC check failed! Verify nav_bit_rate50 and bits_per_frame300); end若校验失败90% 原因为config_sim.m中bits_per_frame设置错误D1 应为 300D2 应为 2000导致帧边界错位CRC 计算输入数据错误。5.4 生成可复现的测试向量导出带时间戳的.mat与.csv双格式为满足 ISO 26262 功能安全认证要求需保存带绝对时间戳的原始数据% 在 main.m 结尾添加 timestamp datetime(now); data_struct struct(... iq_b2a, iq_b2a, ... iq_b3i, iq_b3i, ... fs, fs, ... timestamp, timestamp, ... config, config_sim); % 保存当前配置快照 save([bds_test_vector_ datestr(timestamp,yyyymmdd_HHMMSS) .mat], -struct, data_struct); % 同时导出 CSV供 Excel 分析 csvwrite(b2a_i.csv, real(iq_b2a)); csvwrite(b2a_q.csv, imag(iq_b2a)); csvwrite(b3i_i.csv, real(iq_b3i)); csvwrite(b3i_q.csv, imag(iq_b3i));该操作生成的.mat文件包含完整元数据.csv文件可被任何编程语言读取确保测试结果可审计、可回溯、可跨团队复现。本文还有配套的精品资源点击获取