大项目
检查时间
将于 检查08:00-12:00, 24 July 2024 学院4号楼301
检查完毕归还Pluto设备
简介
到目前为止,我们主要在学习物理层,已经设计了帧同步算法和离线OFDM接收机的信号处理模块。在本次实验中,我们将
开始学习链路层,特别是在物理层不可避免出现错误情况下,在链路层实现可靠传输。具体来说,我们将设计两个“收发
机”,其中收发机既有发送模块也有接收模块,并构建两个双向通信的节点。
在实验1与实验2中,同学们已经开发了物理层信号处理的模块,包括发送机与接收机的信号处理。本次大项目就是将前述
实验的开发成果进行集成,完成物理层、链路层、应用层的开发,并实现一个完整的实时无线通信系统,支持图片的可靠传
输。
为了降低难度,大项目有两种提交方式:a) 物理层采用Pluto SDR硬件;b) 物理层依然采用Socket PHY,不过Socket传输
的是基带信号。前者能拿到大项目全部的分数,后者只能拿到大项目全部分数的85%。对于这两种方式,项目都会提供一个
框架代码,同学们只需要在框架代码中实现相应函数即可。对于后者,本实验只是用Socket在本地用来模拟两个收发机的
通信链路,同学们只需要简单的把它抽象成不可靠的通信链路即可。
这两种方式都需要进行基带信号处理,区别就在于修改的Socket PHY会直接传输一个信号块,包括一个帧的全部基带信号
与帧前面有随机添加的噪声。对于Pluto PHY,每次获取的一个信号块不一定保证包括一个完整的数据帧。此外,对于前
者,在Pluto SDR实现实时系统有很多挑战,需要注意优化代码的性能,使得接收模块的处理足够快,否则会发生丢包。
我们将提供了一个基于多线程架构的参考实现,即代码分为链路层(即LLC)和物理层(即PHY),中间使用队列进行交
互。在发送方向上,链路层负责根据协议状态生成帧,然后放入队列,物理层负责发送;在接收方向上,物理层负责接收,
然后放入队列,链路层提取帧更新协议状态。同学们只需要在这个框架内完成一些函数实现,就能完成本次实验。这里 线
是并发编程中的一个基本概念,是一种可以充分利用多核CPU进行处理的方法。
选项1:基于Pluto SDR实现实时双向通信系统(100%)
第一部分:完成单向 OFDM 发送机(15%)
设置和要求
调制LLC层的数据包,并将基带信号放入 ,然后完成OfdmTx类的 。提交你实现的程 tx_queue put() process()
序。(5%)
添加线程 以从 中获取样本,并使用PlutoSDR进行传输。提交你实 tx_sample_queue_watcher_thread tx_queue
现的程序。(5%)
问题:描述单向OFDM发送机的过程。解释控制台输出,并描述它们的作用。 发送机和 发送机之间的 socket pluto
区别是什么?(5%)
提示
你可以使用Lab2中发送机的源代码来开发OfdmTx类中的 函数 process()
的设计类似于 tx_sample_queue_watcher_thread tx_packet_queue_watcher_thread
要使用pluto传输baseband samples,可以调用 sdr_tx.tx(samples)
第二部分:完成单向 OFDM 接收机(25%)
设置和要求
添加线程 以从pluto获取缓冲区并将其放入 中。提交你设计 rx_sample_queue_watcher_thread rx_sample_queue
的程序。(5%)
获取缓冲区。检测缓冲区中的前导码并解调接收的样本。将解调的数据包放入 rx_sample_queue
,然后完成OfdmRx类的 。提交你设计的程序。(5%)rx_packet_queue process()
问题1:描述单向OFDM接收机的过程。解释控制台输出,并描述它们的作用。 接收机和 接收机之间 socket pluto
的区别是什么?(5%)
问题2:解释接收机中 的作用?(5%) rx_sample_queue rx_packet_queue
问题3:如果 没有及时处理,会发生什么?(5%) rx_sample_queue rx_packet_queue
提示
要使用pluto接收baseband samples,可以调用 samples=sdr_tx.rx()
的设计类似于 rx_sample_queue_watcher_thread rx_packet_queue_watcher_thread
你可以更改在test_nodeB.py 中 的值,以帮助调试 rx_buffer_size process()
你可以使用 库来测量 中每个部分的时间消耗,并优化较慢的部分以提高处理速度。 time process()
如果处理速度赶不上传输速度,请放慢传输速度。(可以通过 更多时间来控制传输速率)sleep
ofdm_tx.py 和 ofdm_rx.py 可以从你完成的实验3中拷贝过来。
test_nodeA.py中的 选项可以相应修改。 -t
第三部分:完成双向 OFDM 收发机 (20%)
设置和要求
参照前向链路实现(用于发送DATA),实现反向链路(用于发送ACK)。提交你设计的程序。运行下面的代码,并记
录控制台输出。(15%)
python test_nodeB.py pluto double (py37)$ -p -l
# run first
python test_nodeA.py pluto double(py37)$ -p -l
问题:结合控制台输出结果描述双向通信的过程。(5%)
提示
注意,我们在以下两个flow应该使用不同频率:flow: A –> B和flow: B –> A,以避免流间干扰。在我们提供的代码
中,频率设置为不同的值。你应该根据你的组号改变频率。
如果你的电脑无法同时带动两台设备,请尝试在不同的电脑上运行节点A和节点B。
第四部分:可靠图像传输 (40%)
步骤和要求
开发ARQ协议,实现可靠图像传输
简述设计思路,解释协议交互流程。 (10%)
设计数据帧和ACK帧结构,并描述帧结构各个字段的作用。 (5%)
现有框架代码存在延时与丢包(数据帧和ACK都有可能丢失),实现的函数是 。此外还存在 simu_pkt_loss_delay()
比特错误的可能性。请找出模拟比特错误的代码位置,我们的系统是否要处理这种错误,该如何处理?(5%)
在节点A的llc_nodeA.py与节点B的llc_nodeB.py中开发停止等待ARQ协议。运行上述代码,记录控制台输出。提交你
开发的程序。(15%)
调整丢包概率p=0.5,记录控制台输出。在llc_utils.py中调整丢包概率,具体更改函数 中的 simu_pkt_loss_delay()
参数的值。(5%)pkt_loss_rate
提示
test_read_save_img.py中提供了读取和保存图片的APIs。图像的基本信息通常包括宽度、高度和灰度。节点A可以将
这些信息与第一个数据包一起发送给节点B,然后节点B可以准确地恢复整个图像。
可以使用 llc_utils.py 中的 实现十进制数与二进制数之间的转换 dec2bin bin2dec
可以自己选择更小的图片来测试你的程序。
选项2:基于修改的Socket PHY实现实时双向通信系统(85%)
上述Pluto PHY需要和Pluto硬件交互,存在一定的难度。另一个选项是通过修改的Socket PHY进行交互。Project使用的
Socket PHY传递的是baseband samples。你需要从baseband samples中解码出frame,然后才能进行packet-level的处
理。此外,为了能够集成帧同步的功能,我们的框架代码会在baseband samples前增加一段随机长度的噪声,但是可以保
证每次接收到的信号包括一个完整的frame。存在随机长度的噪声,意味着需要实现帧同步,找到帧开始位置。
第一部分:完成单向 OFDM 发送机(10%)
要求同上
第二部分:完成单向 OFDM 接收机(20%)
要求同上
第三部分:完成双向 OFDM 收发机 (15%)
要求同上
第四部分:可靠图像传输 (40%)
要求同上
加分题 (+10%)
加分1:用GUI Demo实现循环图像传输与显示 (+5%)
步骤和要求
支持文件夹内多个图像的传输,用 GUI Demo 显示图像。我们会提供GUI Demo显示程序,你需要写一些接口代码。
加分2:滑动窗口 ARQ (+5%)
步骤和要求
使用滑动窗口ARQ提高传输速度。