周报:12.27-1.2
一、继续学习gnuradio中Wifi系统的框图
(1) xml文件和yaml文件
xml文件:
xml:可扩展标记语言,其可以在任何应用程序中读/写数据,是html的演进,一个简单的程序如下:
1 |
|
用浏览器解析数据时结果为:
前面的减号可以折叠
yaml文件
Pad_source在gnuradio中没有.cc文件,只有.yml文件,查询了一下.yml文件是干什么的。
yml文件对应三种数据结构,对象,数组和纯量。yml文件大小写敏感,用缩进表示层级关系(类似python),缩进的空格数量不重要。
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
对象的表示:animal: pets - 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
数组的表示:- Cat - 纯量(scalars):单个的、不可再分的值,如:字符串,布尔值,整数,浮点数,Null,时间,日期
纯量的表示:布尔值用true和false表示,null用~表示,强制转换数据类型用!!,表示
字符串默认不使用引号表示,但是如果字符串里有特殊字符要放在引号里。
(2) Wifi PHY Hier
模块分析
Wifi PHY Hier
有5个端口,其中:
发送端用到了mac_in
端口和samp_out
端口。mac_in
连接Wifi_Mac
(生成帧的模块),然后在wifi_phy_hier
流图中经过对数据添加服务域和填充比特,然后进行加扰,编码,多信道捆绑接入(puncturing),交织,下降到物理层,再经过OFDM子载波映射,IFFT,加循环前缀等操作最后在samp_out
端口输出。samp_out
输出的是发送端经过产生数据,生成帧,再经过添加物理层的控制信息下降到物理层,经过IFFT,加循环前缀然后发出的发送端物理层信息,samp_out
连接usrp_sink
。
接收端用到了samp_in
端口,carrier
端口和mac_out
端口。
其中首先USRP接收发送端的usrp_sink
,通过usrp_source
发送USRP的信息,相当于从发送端的物理层传输到接收端的物理层。然后usrp_source
连接wifi_phy_hier
的samp_in
接口,通过wifi_phy_hier
对数据进行后续处理。包括一系列的物理层的处理,最后经过Wifi Frame Equalizer
进行物理层到链路层的转换。carrier
输出用于后续处理波形,通过PDU_to_tagged_stream
将PDU转换为数据流,再画出星座图。mac_out
用于后续的接收到的信息进行文件保存(通过wireshark
)和一些可视化输出,输出在命令行中(通过Wifi Parse Mac
)
(3)模块的功能及其代码相关C++语法
delay模块对应delay_impl.cc
size_t
类型:它是一种“整形类型”,全名应该是size type,表示一种用来记录大小的数据类型,使用的sizeof(),实际上返回的就是size_t类型
构造函数中输入和输出最小为1,最大-1,其含义是输入和输出都可以的端口数量都是可选的,可以在框图中选择端口的数量。std标准库相关:
std::memcpy
实际上等效void* memcpy( void* dest, const void* src, std::size_t count )
函数,功能就是将src指向的对象复制count个字符到dest中。
在delay_impl.cc中为std::memcpy(optr,iptr,noutputs_items * d_itemsize)
std::memset
实际上等效为memset(void* a,int b,int c)
,为一个初始化函数
a表示初始化的对象,b表示初始化值,c表示初始化字节数
实现的原理非常简单,就是通过如果delay小于0,则报错,delay大于0时,通过输出端忽略输入端的前n个点,即实现延时n个点输出。
delay模块的功能就是将输入延迟n个点之后输出。
stream_mux模块对应stream_mux_impl.cc
std::vector相关:
std::vector<int> nVec
:新建一个空对象std::vector<int> nVec(5,-1)
创建了一个包含5个元素且值为-1的vectorstd::vector<std::string> strVec{"a", "b", "c"}
列表初始化
特别注意()和{}的区别,
(10,1):包含10个元素,值全为1;
{10,1}:包含两个元素,值为10和1.
此外,通过insert和erase可以实现vector中添加和删除元素。
std::vector使用简介链接
如果想要输入端的数量可变,就要在work函数中新增一个形参 gr_vector_int& ninput_items
其中&是引用。引用实际上就相当于给一个变量起了一个别名。比如:int a;
int& b = a;
引用和目标表示同一对象,引用一旦初始化,就不能再重新赋值,因此在声明引用时需要立即对其进行初始化,不能先声明,后赋值。
程序分析:构造函数声明变量,输入输出端口,声明特殊情况如果Stream_Mux
中数据长度都为0时throw抛出异常。forecast
函数用于根据Stream模块中的lengths变量从输入端判断要输入的数据个数,通过ninput_items_required
变量判断,如果需要就输入就给ninput_items_required
赋值1,不需要就赋值0。work
函数用于缓存控制,读写,输入输出操作,异常处理等操作。
二、滤波器模块相关
1.滤波器的使用
滤波器可以使用Decimating FIR Filter
模块,其包含两个参数,Decimation和taps。其好处在于高通,带通,低通滤波器都能用。
Decimating FIR Filter的wiki
Decimation表示抽取率,滤波范围是[-Fs/2,Fs/2],其中 Fs 是输入采样率除以抽取率。
tags表示选取哪一种滤波器,要新建一个变量taps,然后在变量中填写滤波器的种类。比如二阶低通滤波器就是firdes.low_pass_2(1,1,0.01,0.000005,80)。
这个变量实际上调用的是gr-filter
里的firdes.cc
和firdes.h
文件中定义的一些滤波函数。
这五个参数分别表示滤波器的增益,采样频率,截至频率,传输带宽,衰减的dB
增益表示滤波后和滤波前通带的信号强度,当值为1时,强度相同。
截至频率0.01表示通带在-1Khz到1KHz,
传输带宽0.000005表示阻带的大小,这个值越小,滤波器越接近矩形窗。
taps表示滤波器的抽头数,M阶的滤波器有M+1阶抽头。
滤波器的抽头系数、通带、阻带、过渡带
一个滤波器使用的例子如下:
信号流图:
实验结果:红线是原噪声信号,蓝线是滤波后的信号。
2.利用滤波器实现调制解调仿真
此框图通过正弦载波携带0,1数据,接收端相干解调,滤波器进行滤波恢复数据
实验结果:
三、新建一个QPSK模块
可以参考:
PSK调制解调实例
1.新建一个random source产生信号,并调制,观察波形
注意:产生的random source应为byte类型,范围为[0,256)
输出结果:
对应的值为1,-1,i,-i;(为什么不是1+i,1-i,-1+i,-1-i)
频域的截至频率会随Samples/symbol变化,Samples/symbol越大,截至频率越低,且呈现反比关系。Samples/symbol就是每个符号的采样点数,考虑如果用载波携带符号的话一个符号就相当于载波的一个周期。因此,由采样定理,Samples/symbol应该≥2。
2.QPSK通信系统
在此基础上,搭建了一个完整的QPSK调制,加噪声,以及解调的仿真系统系统框图如下:random_source
产生了一个信号源,Uchar To Float数据类型将byte类型的数据转换为float类型,输出为before modulator。Chunks to Symbols
模块将产生的0,1,2,3映射为[1+1j,1-1j,-1+1j,-1-1j],噪声源向已调信号加入高斯噪声,噪声的赋值设置了一个QT GUI Range
的可变类型,经过PSK demod
即可解调。噪声的幅值越大,信号的星座图距离中心越远。
Constellation Modulator
的第一个变量对应的是Constellation Rect. Object
的ID名Constellation Rect. Object
的Symbol Map
和Constellation Modulator
是一一对应的。相当于symbol的0,1,2,3对应星座点[1+1j,1-1j,-1+1j,-1-1j]。 Chunks to Symbols
和Constellation Modulator
+Constellation Rect. Object
等效,这两者与PSK Mod不同。
频率偏移对应星座图就是在单位圆上移动。
此框图的问题在于不能判断调制和解调后的数据是不是一样,因此需要输入和输出的数据进行对比,即:
3.QPSK通信系统进一步实验
在前面的基础上加入了输入数据和输出数据的比较
发现数据不一样,原因是输入数据和输出数据具有时间延时,为了解决这个问题,可以参考 4 中的PSK官方案例。
差分编码(differential encoding)指的是对数字数据流,除第一个元素外,将其中各元素都表示为各该元素与其前一元素的差的编码。
4.PSK官方例程
例程链接
实验过程中的总结:Channel Model
前三个参数分别代表噪声幅值,相偏,时间偏移。
频偏导致星座图在单位圆上分布;噪声大,星座图杂乱;
时间偏移,可能产生符号间串扰,理想情况下,当一个符号信号强度达到峰值时,其他信号应该为0,而时间偏移可能导致一个符号信号强度达到峰值时,其他信号不为0。因此寻找合适的采样点很重要。
为了恢复时钟偏移,采用Polyphase Clock Sync
模块进行时钟同步,其用到了一个滤波器组。
为了除去噪声影响,采用信道均衡,CMA Equalizer
模块使得信号的频率响应在同一水平线上,星座图效果更好。
为了恢复频偏和相偏,采用Costas Loop
模块,使得即使有频偏也能恢复到单位圆上。
最后比较输入和输出的数据,调整时间延时进行同步。
完整框图如下:
测试结果:
右下角的两个曲线分别代表输入和输出数据,这时候没有完全同步,通过调整delay可以实现同步。
为了验证,用matlab分析了一下数据:
(注:测试时没有加差分编码)
可以看出当延后58(有时候是8058)个点之后两路信号能实现同步。
其实两者是一样的,因为发送源就是发1000个0到256的数,转换为2进制就是8000位。
再次测试将两路信号相减,实验结果如下,可见实现了完全的同步!至此一套完整的PSK调制解调仿真系统建成了。
测试框图:
测试结果:
四、I/Q调制和星座图相关
通信中星座图的理解介绍的非常详细
格雷码编码规则,第一位不变,第二位为原来的第一位和第二位的异或,以此类推。
如0110对应格雷码为0101。
五、其他
tag相关
tag的SMA2是既作为输入也作为输出吗?网上查了一下同一根天线在不同频段工作时可以既作为输入又作为输出。
英语单词
tradeoff 权衡