【GNURadio实验报告】实验2 | 您所在的位置:网站首页 › cctv6和央视哪个级别高 › 【GNURadio实验报告】实验2 |
【GNURadio实验报告】实验2-使用GNURadio模拟简易的OOK/ASK信号
一、OOK是什么?(一)简介(二)信号产生(三)数学公式
二、流图设计-发送端(一)信号源为Vector Source【Vector Sink】【Repeat】【Char To Float】【Signal Source】【Mutiply】【QT GUI Time Sink】【QT GUI Frequency Sink】
(二)信号源为File Source【File Source】
(三)采用硬件输出时【osmocom Sink】
三、流图设计-接收端(待完善)
本文在写作过程中,得到了开源SDR实验室https://blog.csdn.net/OpenSourceSDR?type=blog大佬们的悉心指导,在这里向你们的无私帮助表示感谢! 博主本人非通信专业出身,本文仅为个人学习GNU Radio和HackRF过程中的知识点笔记,难免会存在错误和疏漏,恳请走过路过的大佬不吝赐教斧正。 期待能够为GNU Radio中文社区增添一份贡献! 一、OOK是什么? (一)简介OOK(On-Off Keying),开关键控/通断键控。属于ASK幅移键控信号的一种,也即2ASK。这种调制方式常见于无线门铃、车库门遥控器、遥控车等,最为人们所熟知的就是大名鼎鼎的摩斯电码。作为数字调制的一种,OOK的历史比之AM、FM等模拟调制方式还要早。 OOK的抗噪声性能不如其他调制方式,所以该调制方式在卫星通信、数字微波通信中并没有被采用;但又由于该调制方式的实现简单,在光纤通信系统中,振幅键控方式却获得广泛应用。
OOK信号
s
(
t
)
s\left ( t \right )
s(t)可视为一个单极性的矩形脉冲信号
m
(
t
)
m\left(t\right)
m(t)与一个载波
cos
(
ω
c
t
+
φ
c
)
\cos \left ( \omega_{c}t+\varphi _{c} \right )
cos(ωct+φc)相乘,即
s
(
t
)
=
m
(
t
)
cos
(
ω
c
t
+
φ
c
)
=
[
∑
k
=
−
∞
∞
a
k
g
(
t
−
k
T
s
)
]
cos
(
ω
c
t
+
φ
c
)
s\left ( t \right )=m\left ( t \right )\cos \left ( \omega_{c}t+\varphi _{c} \right )\\ =\left [ \sum_{k=-\infty }^{\infty} a_{k}g \left ( t-kT_{s} \right ) \right ]\cos \left (\omega_{c}t+\varphi _{c} \right )
s(t)=m(t)cos(ωct+φc)=[k=−∞∑∞akg(t−kTs)]cos(ωct+φc) 式中,
g
(
t
)
g\left ( t \right )
g(t)是持续时间为
T
s
T_{s}
Ts的矩形脉冲,
a
k
a_{k}
ak的取值服从下述关系
a
=
{
0
,
概率为
p
1
,
概率为
1
−
p
a=\begin{cases} 0,概率为p\\ 1,概率为1-p \end{cases}
a={0,概率为p1,概率为1−p 由频率卷积定理可得
s
(
t
)
s\left ( t \right )
s(t)的频谱为
s
(
ω
)
=
1
2
[
M
(
ω
+
ω
c
)
+
M
(
ω
−
ω
c
)
]
s\left (\omega \right )=\frac{1}{2} \left [ M\left ( \omega+\omega_{c} \right ) + M\left ( \omega-\omega_{c} \right ) \right ]
s(ω)=21[M(ω+ωc)+M(ω−ωc)] 由上式可知,由于基带矩形脉冲序列的频谱宽度是无限宽的,所以OOK信号的频谱宽度也是无限宽的。因此,为了避免干扰,通常需要在调制信号进入功放前增加一级带通滤波器,保证信号的绝大部分能量通过,同时滤除带外频率分量。OOK调制系统的模型如下图所示。 对照前文的OOK调制系统模型,搭建发射机的仿真程序,即绘制grc流程图。 需要发送的信息可以以两种形式存储读取: 第一种是直接手动输入,使用【Vector Source】模块,修改起来比较方便。 第二种是从文件中读取,使用【File Source】模块,适用于固定的数据信息。 (一)信号源为Vector Source
先说仿真结果: 如下图所示,在时幅图(QT GUI Time Sink示波器)中可以看到,低电平代表0、高电平代表1,每个码元的持续时长为5ms(=1000ms*插值数Interpolation 100/采样率samp_rate 20kHz)。 在时频图(QT GUI Frequency Sink示波器)则可以看到,信号在5kHz的位置出现了一个峰值,这是因为载波信号fc的频率为5kHz;而在0-10kHz范围内分布着能量,表明实际贷款非常宽。 矢量源,从1个向量中提取数据并输出。https://wiki.gnuradio.org/index.php/Vector_Source Output type:输出数据的数据类型。包括complex、int、short、float、byte Vector:数据。以向量Vector形式存储。下图所示输入的数据是01001 Repeat:一组数据结束后是否重复该组数据。如果选择No,就只会输出1轮01001,之后全0。 Tags:数据标签。在时域图的指定位置打上标签,便于事后分析。 Vector Length:矢量长度。默认值为1,代表输出普通的数据流(不需要修改)。 插值模块。将输入进该模块的值重复Interpolation次后输出,可达到拓宽码元宽度的效果。https://wiki.gnuradio.org/index.php/Repeat Type:输出数据的数据类型。包括complex、int、short、float、byte Interpolation:插值数。即每个码元重复的次数。 Vector Length:矢量长度。默认值为1,代表输出普通的数据流(不需要修改)。 Char型转Float型模块。将输入端进来的char类型流数据变为float类型的流数据。 信号源模块。可提供恒定波形(阶跃信号)、正弦信号、余弦信号、方波信号、三波信号、锯齿波信号。https://wiki.gnuradio.org/index.php/Signal_Source Output type:输出端的数据类型。包括complex、int、short、float Sample Rate:采样率。(注:下图中之所以写samp_rate,是因为我在grc流程图中定义了一个Variable参数模块,命名为samp_rate,可以理解为python语言传参赋值) Waveform:选择信号源所用波形。包括恒定波形(阶跃信号)、正弦信号、余弦信号、方波信号、三波信号、锯齿波信号。 Frequency:频率。(下图中写的fc,原因同上) Amplitude:幅度。信号最大幅度值的绝对值。 Offset:上下偏移量。 以余弦波为例,当幅度为1,偏移为0,则最大值为1,最小值为-1。 Initial Phase:相移。 ![]() ![]() ![]() ![]() ![]() 关于输入端的cmd接口 注意到该模块左边还有1个灰色的cmd端口(GNU Radio 3.8版本以前另有1个freq端口,现已整合进cmd中),可用于在运行时通过传入pmt消息改变信号特征。可传入消息包括: pmt.intern(“freq”)——频率 pmt.intern(“ampl”)——幅度 pmt.intern(“phase”)——相位 pmt.intern(“offset”)——偏移量 pmt.dict_add(pmt.make_dict(), pmt.intern("ampl"), pmt.from_double(0.5)) #将输出信号的幅度值调整为0.5 【Mutiply】乘法器模块。将两个Input端口输入的数据流内积后输出。https://wiki.gnuradio.org/index.php/Multiply IO Type:输入输出端的数据类型。包括complex、int、short、float。 Num Inputs:输入端口的数量。 Vector Length:Vector数据长度。同上文,设为1即可。 可以当做示波器来使用,分别显示时间-幅度波形图、频率-幅度波形图。 可设置的参数很多,大部分用于调节示波器的显示,默认即可。需重点关注两个参数: 【QT GUI Time Sink】Sample Rate和【QT GUI Frequency Sink】Bandwidth:应当与流程图的采样率保持前后一致。 尝试将需要发送的数据存入txt文档中,由File Source模块读取出来后发送。 grc流程图基本框架不变,仅仅将Vector Source改为File Source即可。 注意,生成的文件,必须是以二进制形式存储数据的文件,当试图使用文档编辑工具打开时将呈现乱码,无法直接编辑。直接在txt文档里输入01001是错误的。 文件源。读取文件作为信源。https://wiki.gnuradio.org/index.php/File_Source File:读取的文件路径。官网提示:文件大小应至少为8字节。 Output type:输出数据类型。包括complex、int、short、float、byte。(在本流程里,需要选择byte类型,这是因为我们上一步使用python记录的数据为01001,每一个0、1都是以byte形式存储的,只有1字节) Repeat:是否重复。效果同Vector Source(如前文所述) Vector length:矢量长度。默认值为1,代表输出普通的数据流(不需要修改)。 Offset:偏移量。从第N+1字节开始读取文档。 Length:读取字节数。从偏移点开始读取多少个字节。当设为0时,会一直读到文件结尾。 前文所述均为仿真模拟,现在准备使用HackRF无线电设备实际发送信号。流程图如下:注:实验过程中请遵守当地无线电法规。博主是将发射机和接收机用双绞线+负载直接对接进行的实验,没有实际发射电磁波。 硬件模块。用于发射或接收信号。该模块最开始是为osmoSDR硬件开发的,目前它支持如HackRF、Ettus USRP等硬件。 Input Type:输入数据类型。只有Complex Float32一种。(这就是为什么上图所示的grc流程图里,其他模块的输入输出端口被统一修改为蓝色的comlex类型,否则就另需要部署若干XXX To Complex模块进行数据类型转换) Device Arguiments:设备参数。根据需要填写设备的硬件地址或其他身份标识等。例如,当流图里有两个模块(Sink+Source)分别用于发射和接收设备时,这个参数就需要填写进去;只有一个设备时默认即可。 Sync:同步。包含Unknown PPS、PC Block、Don’t Sync。建议购买并连接外部时钟,否则会存在频偏。注:在该模块之前不建议加装Trottle模块,这样出现流程图里就将会存在2个时钟,网络上有一些流程图是不对的。 Number MBoard、MB0等:可能用于设置时钟设备参数。博主暂时还没实验过,默认即可。 Number Channels:信道数量。例如一个设备可能有两个发射机,就可以写2。 Sample Rate:采样率。应当与grc流程图内其他模块保持一致。注:根据博主经验,使用HackRF时,设置的采样率应当大于等于200kHz、小于等于18MHz,否则会造成失真,具体原因将在下一篇实验报告中详细阐述。 Frequency:频率。等效于上变频操作,原始信号将以该频率为中心频率发射。 Frequency Correction:频率修正。已知设备存在频偏时,可使用这一参数进行修正。 RF Gain:射频增益。在Software Defined Radio with HackRF Lesson系列课程中,该参数被Michael Ossmann用来控制接收机的信号强度。 IF Gain:中频增益。同上,被用来控制发射信号强度,据称HackRF最高可达到47dB。 BB Gain:基带增益。 BandWidth:带宽。设0即可,博主尚未实验该参数有什么作用。 如果尝试增加乘法操作,你会发现实际接收信号相对于409.750MHz出现了频偏,频偏大小等于Signal Source的Frequency频率值,例如Vector Source乘以Signal Source输出的5kHz余弦波时,实际信号的频率值将为490.755MHz。注意:关于这一说法,博主尚未进行实验复现,有待后续论证。 未完待续,等我需要的时候在做咯!嘿嘿ヾ(o・ω・)ノ |
CopyRight 2018-2019 实验室设备网 版权所有 |