关于 OpenISAC
通信感知一体化 (ISAC) 被认为是 6G 的关键技术之一。OpenISAC 是一个通用且高性能的开源平台,旨在弥合理论与实践之间的差距。
它完全基于开源软件 (UHD、C++、Python) 构建,支持基于 OFDM 的实时通信和感知。其核心特性是新颖的空口 (Over-the-Air) 感知同步机制,无需有线连接即可实现稳定的双站感知。
如果您觉得这个仓库有用,请引用我们的论文:
Z. Zhou, C. Zhang, X. Xu, and Y. Zeng, "OpenISAC: An Open-Source Real-Time Experimentation Platform for OFDM-ISAC with Over-the-Air Synchronization," submitted to IEEE Trans. Wireless Commun., Jan. 2026.
[arXiv]
所属机构
东南大学移动通信国家重点实验室 & 紫金山实验室 曾勇课题组
社区
微信公众号:
它是什么,又不是什么?
OpenISAC 是什么?
OpenISAC 是一个基于 OFDM 的通信与感知一体化(ISAC)系统,专为学术实验和快速算法验证而设计。
其目标是提供一个简洁且易于修改的 OFDM 平台,使研究人员能够快速迭代通信与感知算法,而无需处理复杂的标准协议栈(如 WIFI、LTE、NR 等)。
由于专注于简洁性,OpenISAC 通常需要更少的计算资源,因此相较于更复杂、功能更全面的系统,能够实现更高的采样率。
OpenISAC 不是什么?
OpenISAC 不旨在成为兼容标准的实现(它不符合 Wi-Fi 或 5G NR 等标准)。
它也不旨在替代或竞争全栈开源标准实现,如 openwifi 或 OpenAirInterface。如果您的目标是互操作性、标准合规性或生产级协议栈,那么上述项目是正确的方向。
何时使用它
- 原型设计以及测试新的通信、感知算法
- 使用极简 PHY 快速实现新想法
- 不需要互操作性的研究
何时不使用它
- 构建兼容 Wi-Fi/NR 的系统
- 需要标准通信系统的研究(完整的 MAC/协议栈、互操作性等)
感知演示
时延-多普勒感知
运动无人机的实时时延-多普勒图。
杂波抑制
MTI 杂波抑制滤波器开启与关闭对比。
微多普勒感知
无人机上升和下降的微多普勒特征。
通信演示
视频流传输
通过 ISAC 链路进行基于 ffmpeg 的实时视频流传输。
硬件要求
后端 (C++)
要设置完整的系统,您需要以下硬件:
- USRP 设备: 2 台 (例如 USRP X310, B210 等)
- 计算机: 2 台 (推荐使用高主频CPU)
- 天线: 3 根
- OCXO/GPSDO: 2 个 (两台 USRP 都需要)
连接设置
该系统由两个主要节点组成:
基站 (BS) 节点: 1x 计算机, 1x USRP (连接 2 根天线: 1 发送, 1 接收), OCXO 连接到 REFIN。
用户 (UE) 节点: 1x 计算机, 1x USRP (连接 1 根天线: RX), OCXO 连接到 REFIN (可选高精度 DAC)。
接口要求
为了支持高带宽和采样率,请确保计算机和 USRP 之间的连接使用:
- >= 10 Gigabit Ethernet (10GbE) (X 系列)
- USB 3.0 (B 系列)
前端 (Python)
- 计算机: 1x 计算机 (Windows 或 Linux)。可以是后端计算机之一,也可以是单独的机器。
- CPU: 如果没有 GPU,建议使用高性能 CPU (i7 10700 或更高)。
- GPU: 建议使用 Nvidia GPU 进行加速。
软件要求
后端 (C++)
操作系统
Ubuntu 24.04 LTS
依赖项和安装
1. UHD (USRP 硬件驱动程序)
按照 Ettus 官方指南 安装 (UHD v4.9.0.1)。
2. 安装 Aff3ct
sudo apt-get install nlohmann-json3-dev
git clone https://github.com/aff3ct/aff3ct.git
cd aff3ct
git submodule update --init --recursive
mkdir build
cd build
cmake .. -G"Unix Makefiles" -DCMAKE_CXX_COMPILER="g++" -DCMAKE_BUILD_TYPE="Release" \
-DCMAKE_CXX_FLAGS="-funroll-loops -march=native" -DAFF3CT_COMPILE_EXE="OFF" \
-DAFF3CT_COMPILE_SHARED_LIB="ON" -DSPU_STACKTRACE="OFF" -DSPU_STACKTRACE_SEGFAULT="OFF" \
-DCMAKE_CXX_FLAGS="${CMAKE_CXX_FLAGS} -faligned-new"
make -j$(nproc)
sudo make install
3. 克隆并构建 OpenISAC
cd ~
git clone https://github.com/zhouzhiwen2000/OpenISAC.git
cd OpenISAC
mkdir build
cd build
cmake ..
make -j$(nproc)
4. 系统性能调优
cd ~/OpenISAC
chmod +x set_performance.bash
./set_performance.bash
注意: 如果您需要启用 RT_RUNTIME_SHARE 功能,则需要在 BIOS 设置中关闭 secure_boot。
UHD 线程优先级配置
如果看到 [WARNING] [UHD] Failed to set desired affinity for thread,需要启用实时优先级:
sudo groupadd usrp
sudo usermod -aG usrp $USER
然后将以下行添加到 /etc/security/limits.conf 的末尾:
@usrp - rtprio 99
注销并重新登录以使更改生效。
5. CPU 隔离和执行
为了确保稳定的实时性能,建议为信号处理任务隔离 CPU 核心。
步骤 1: 隔离CPU核心
cd ~/OpenISAC
chmod +x isolate_cpus.bash
sudo ./isolate_cpus.bash
步骤 2: 在隔离核心上运行应用程序
使用脚本在隔离核心上启动应用程序:
cd build
sudo ../isolate_cpus.bash run ./OFDMModulator
注意: 启用 CPU 隔离时请务必使用脚本启动。
重置配置 (可选)
sudo ./isolate_cpus.bash reset
前端 (Python)
建议使用 Python 3.13 的 conda 或 venv 环境。
安装依赖项
pip install -r requirements.txt
注意: 视频流演示需要 ffmpeg。
- Ubuntu:
sudo apt install ffmpeg - Windows: 从 ffmpeg.org 下载并添加到 PATH。
启用 GPU 加速 (可选)
如果有 Nvidia GPU,请安装 cupy-cuda12x:
pip install cupy-cuda12x
典型使用示例
1. 启动 BS
sudo -s
cd build
# 对于 X310:
sudo ../isolate_cpus.bash run ./OFDMModulator --args "addr=192.168.40.2, master_clock_rate=200e6, num_recv_frames=512, num_send_frames=512"
# 对于 B210:
sudo ../isolate_cpus.bash run ./OFDMModulator --args "num_recv_frames=512, num_send_frames=512, send_frame_size=11520, recv_frame_size=11520" --wire-format-tx sc8
如果您使用单独的计算机作为前端,请添加 --default-ip=<your front end IP>。
2. 启动 UE
sudo -s
cd build
# 对于 X310:
sudo ../isolate_cpus.bash run ./OFDMDemodulator --args "addr=192.168.40.2, master_clock_rate=200e6, num_recv_frames=512, num_send_frames=512"
# 对于 B210:
sudo ../isolate_cpus.bash run ./OFDMDemodulator --args "num_recv_frames=512, num_send_frames=512, send_frame_size=11520, recv_frame_size=11520"
如果您使用单独的计算机作为前端,请添加 --default-ip=<your front end IP>。
3. 将视频流传输到 BS
ffmpeg -re -stream_loop -1 -fflags +genpts -i video.mp4 -an -c:v libx264 -x264-params keyint=5:min-keyint=1 -b:v 3000k -minrate 3000k -maxrate 3000k -bufsize 1M -f rtp -sdp_file video.sdp "rtp://<your IP of the BS>:50000"
如果您在BS本地传输视频流,BS 的 IP 可以设置为 127.0.0.1。
4. 从 UE 播放视频
将 video.sdp 复制到视频接收端,将 m=video 50000 RTP/AVP 96 修改为 m=video 50001 RTP/AVP 96。
ffplay -protocol_whitelist file,rtp,udp -i video1.sdp
注意:此命令应在前端运行。
5. 运行单站感知前端
python3 ./plot_sensing_microDoppler_CPP_MTI.py
6. 运行双站感知前端
python3 ./plot_bi_sensing_microDoppler_CPP_MTI.py
OFDM 调制器 (OFDMModulator)
OFDMModulator (BS 节点) 可以使用以下命令行参数配置:
| 参数 | 默认值 | 描述 |
|---|---|---|
--args |
addr=192.168.40.2, ... |
USRP 设备参数 |
--fft-size |
1024 |
FFT 大小 |
--cp-length |
128 |
循环前缀 (CP) 长度 |
--sync-pos |
1 |
同步符号位置索引 |
--sample-rate |
50e6 |
采样率 (Hz) |
--bandwidth |
50e6 |
模拟带宽 (Hz) |
--center-freq |
2.4e9 |
中心频率 (Hz) |
--tx-gain |
20 |
发送增益 (dB) |
--rx-gain |
30 |
接收增益 (dB) |
--rx-channel |
1 |
USRP 上的 RX 通道索引 |
--zc-root |
29 |
Zadoff-Chu 序列根 |
--num-symbols |
100 |
每帧 OFDM 符号数 |
--clock-source |
external |
时钟源 (internal 或 external) |
--system-delay |
63 |
用于对齐的系统延迟样本数 |
--wire-format-tx |
sc16 |
USRP TX 传输格式 (sc8 或 sc16) |
--wire-format-rx |
sc16 |
USRP RX 传输格式 (sc8 或 sc16) |
--mod-udp-ip |
0.0.0.0 |
接收 UDP 数据负载的绑定 IP |
--mod-udp-port |
50000 |
接收 UDP 数据负载的绑定端口 |
--sensing-ip |
127.0.0.1 |
感知数据的目标 IP |
--sensing-port |
8888 |
感知数据的目标端口 |
--default-ip |
127.0.0.1 |
所有服务的默认 IP (Python前端的IP) |
--cpu-cores |
0,1,2,3,4,5 |
要使用的 CPU 核心列表 |
OFDM 解调器 (OFDMDemodulator)
OFDMDemodulator (UE 节点) 支持以下参数:
| 参数 | 默认值 | 描述 |
|---|---|---|
--device-args |
num_recv_frames=512... |
USRP 设备参数 |
--fft-size |
1024 |
FFT 大小 |
--cp-length |
128 |
循环前缀 (CP) 长度 |
--center-freq |
2.4e9 |
中心频率 (Hz) |
--sample-rate |
50e6 |
采样率 (Hz) |
--bandwidth |
50e6 |
模拟带宽 (Hz) |
--rx-gain |
60 |
接收增益 (dB) |
--rx-channel |
0 |
RX 通道索引 |
--sync-pos |
1 |
同步符号位置索引 |
--sensing-ip |
127.0.0.1 |
发送感知数据的 IP |
--sensing-port |
8889 |
发送感知数据的端口 |
--control-port |
9999 |
接收控制命令的端口 |
--channel-ip |
127.0.0.1 |
信道估计输出的 IP |
--channel-port |
12348 |
信道估计输出的端口 |
--pdf-ip |
127.0.0.1 |
原始功率延迟分布 (PDF) 数据输出的 IP |
--pdf-port |
12349 |
原始功率延迟分布 (PDF) 数据输出的端口 |
--constellation-ip |
127.0.0.1 |
星座图数据的 IP |
--constellation-port |
12346 |
星座图数据的端口 |
--freq-offset-ip |
127.0.0.1 |
频率偏移数据的 IP |
--freq-offset-port |
12347 |
频率偏移数据的端口 |
--udp-output-ip |
127.0.0.1 |
解码用户数据的目标 IP |
--udp-output-port |
50001 |
解码用户数据的目标端口 |
--zc-root |
29 |
Zadoff-Chu 序列根 |
--num-symbols |
100 |
每帧符号数 |
--sensing-symbol-num |
100 |
用于感知处理的符号数 |
--clock-source |
external |
时钟源 (internal 或 external) |
--software-sync |
true |
启用软件同步/跟踪 |
--hardware-sync |
false |
启用硬件同步 |
--hardware-sync-tty |
/dev/ttyUSB0 |
用于硬件同步的 TTY 设备 |
--wire-format-rx |
sc16 |
USRP RX 传输格式 |
--default-ip |
127.0.0.1 |
所有服务的默认 IP |
--cpu-cores |
0,1,2,3,4,5 |
要使用的 CPU 核心列表 |