用麦克风学习GNU广播



之前有关SDR和GNU Radio的文章表明,该主题对社区很有趣。鉴于几乎没有关于俄语的GNU Radio软件包的信息,并且英语不是一目了然,所以我决定描述我在GNU Radio上的经历。

关于SDR和GNU Radio,我已经在上一篇文章中写过让我提醒您,我的目标是展示如何拦截甚至辐射无线电信号来控制智能家居设备(甚至是物联网)。我认为重要的是要引起人们对物联网安全性的关注。但这还有很长的路要走...首先,我必须处理GNU Radio!

并非每个人都有SDR接收器,在我看来,这对显示GNU Radio可以用每个人拥有的东西(即您的PC的麦克风和耳机)完成的工作很有用。

在剪切下,一些有趣的声音练习。

周围的声音


因此,让我们从一个简单的例子开始:研究周围的声音频谱。我们假设您安装了GNU Radio软件包或使用GNU Radio启动了准备好的Ubuntu / Windows映像。如果不是,请 GNU Radio网站下载基于Ubuntu的映像

让我们从创建一个简单的麦克风捕获项目开始。为此,添加音频源模块,设置samp_rate 48000(许多卡工作在44100 Hz,而不是48000 Hz)。

您可以像这样找出Linux上卡的限额:
$ pactl list short sinks
0	alsa_output.pci-0000_00_03.0.hdmi-stereo	module-alsa-card.c	s16le 2ch 44100Hz	SUSPENDED
1	alsa_output.pci-0000_00_1b.0.analog-stereo	module-alsa-card.c	s16le 2ch 44100Hz	SUSPENDED

问题立即出现:为什么选择48 kHz?他们说,毕竟,我们可以听到多达20 kHz的细节,而这还不是全部。
--, , 2 . , 24 — . .

48 44.1 — . , CD. .

回到我们的GNU Radio方案。连接音频源WX FFT。不要忘记用top_block中的WX GUI替换QT GUI,以及将输入类型更改为Float。现在,我们将在公寓周围转圈,发出不同的声音。学校物理学告诉了我们很多有关我们将看到的内容,但是所有这些都被遗忘了,用自己的眼睛看书总是比读教科书更有趣。

我们将看到的第一件事是什么都不可见!频谱的整个重要部分集中在前2或3 kHz。好吧,让我们在源和WX FFT之间添加一个新块:Rational Resampler-它允许您更改采样率,仅保留频谱的正确部分。为了方便起见,我们将创建一个新的Variable块(变量),调用resamp并设置值,例如15。在Decimation字段的resampler块中,输入此变量的名称。现在,采样率等于samp_rate / resamp的信号,即在此块的“采样率”字段中,您需要插入此表达式。现在我们的信号将扩展到1.5 kHz,这已经更好了。好了,现在一切都可见了!

因此,从440 Hz的音符开始。检查声音的频率清洁度。立即发现一个有趣的发现(我提醒您,我们必须从学校知道这一点):我们发布的不是一个频率,而是一组多个频率-音调和泛音。家里有钢琴或其他乐器的人,可以尝试一下。这是第一个八度音阶的音符看起来像钢琴的样子。



但是为小八度。一切都像教科书中一样-峰值多2倍,最低的峰值降低了2倍(220 Hz)



随机没有多个频率。实际上,在钢琴/吉他/ ...(弦)的情况下,声音是通过弦的振动提取的。琴弦有两个固定端,即只能发射长波长λ/ 2 = L * n的模式,其中n = 1,2,3 ...

声音也一样。韧带允许您改变喉部的特征,喉部起着共鸣器的作用(请原谅解剖学家,因为他们的名字不正确)。同样,墙壁是固定的,在振动处有节点,即同样是激发模式的相同公式。

现在让我们鼓掌:(


蓝色-“静音”频谱,绿色-鼓掌频谱)

哦,在这里所有频率都是可见的(与上面的图表相比,请注意频率范围和信号电平!)。这是合乎逻辑的,因为棉花是短期内压力的增加(非常剧烈),即几乎具有δ函数,并且其频谱包含所有频率。

可以顺便使用。谁能记住从90年代开始使用的这种钥匙圈,以便找到在吹口哨时会发出声音的钥匙?这是一件方便的事。所以他们也对棉花有反应,因为 在棉花声中,也有一个对应于哨声的频率。

字母谱


现在让我们来听听自己。说出不同的字母字母并查看频谱(最好不进行重采样,以查看在0-20 kHz范围内使用了哪些频率)。一个人会使用几种类型的声音产生方式:唇音(从张开嘴唇开始,会立即产生许多频率),喉,牙齿,舌和鼻。嘶嘶声和吹口哨声特别有趣(它们是喉和牙齿)-它们的频谱非常宽,主要位于> 2.5 kHz的频谱中(对于“ c”声​​甚至> 5 kHz)。这解释了为什么在手机上很难听到带有这种声音的单词(在过去,带宽为3 kHz甚至更低-尝试添加低通滤波器并将结果发送到带有耳机的音频接收器-结果类似于老式的有线电话)。

谁有孩子,听他们的声音-他们的声音更大,声音很多。这就是为什么他们通过电话发出的声音总是很奇怪的原因,并且通常根本无法理解他们(声音失真比成年人的声音失真大得多)。

顺便说一下,我试图从我身上挤出最高音。好吧,我没有将其超过700 Hz。儿子承受了1200 Hz!我没想到自己会受到这样的限制-这不到我所听到的频谱的5%。我觉得有缺陷...

与海豚交谈


好吧,好吧,我们听起来不会很高,所以可以再用这个乐队。现在,让我们尝试通过超声波进行语音传输。我们在音频源模块之后放置一个低通(低通)滤波器,乘以15 kHz的余弦(从而将信号提高15 kHz),然后将其发送给扬声器(他可以这样处理)。但是可以使用File Sink写入这样的文件。丢失了此类文件后,第三方侦听器将无法解析那里的内容。等级2的间谍游戏。



现在让我们做相反的事情-我们将恢复编码后的信号。普通的笔记本电脑麦克风不能很好地接受高频,但是从文件来看很容易(对于我们的测试来说就足够了)。恢复后的声音非常受欢迎。



以这种方式,您甚至可以传输数据:此处基于超声传输的网络接口实例

这个例子表明,使用GNU Radio和声卡可以做很多事情!

GNU无线电单元概述


GNU Radio有很多不同的块,将它们整理出来并不容易。而最困难的事情是了解其中到底有什么。下面我将仅给出“在日常生活中”使用的最受欢迎的块。

数学运算:

加-叠加两个信号
-叠加两个信号(例如,对于AM)
加常量-添加(减去)一个常数(例如,在解调AM时除去DC分量)
乘法-将信号乘以一个常数(例如,用于放大)
Char /整数/浮点数/复杂到Char /整数/浮点数/复杂-数据类型转换

资料来源:

恒定源-始终产生相同值
的源信号源-产生正弦信号(用于合成信号)的
源音频源/接收器-从声卡捕获或输出到
文件中源/接收器-从文件读取(使用Throttle将读取速度限制为所需的采样率)并写入
Wav文件源/接收器文件-读取/写入
TCP / UDP WAV文件;源/接收器-能够通过TCP或UDP
osmocom 将项目与网络软件连接的源/接收器套接字-从以下位置接收数据RTL-SDR或HackRF One或传输(对于HackRF One)
矢量源-数字序列的源

过滤器和调制:

低/高/带通滤波器-低频/高频/带通滤波器
频率Xlating FIR滤波器-结合了频移和低通滤波器以选择所需的频带
AM / FM / GFSK / ... Mod / Demo-各种调制器和解调器

采样:

Rational Resampler-允许您通过抽取和内插将输入的样本序列从一个采样率转换为另一个采样率(用于“拟合”到所需的采样率)
节流阀-将样本提交的速度限制为所需的采样率(如果项目中没有限制速度的块)处理)
延迟-将流延迟所需数量的样本

用户界面:

WX GUI FFT接收器-信号频谱的图形输出
WX GUI瀑布接收器-“瀑布”模式下的频谱功率输出(沿X轴-频率,沿Y-时间,Z(颜色)-幅度)。有用的搜索频率辐射在预定范围内很少发送源
WX GUI星座水槽-图的相位输出信号(该信号的实部和虚部的振荡之间的相差)
WX GUI范围水槽-示波器

杂项:

变量-允许您在各种
选择器块中使用变量而不是数字的变量-与WX滑块结合使用的多路复用器允许您“打开
/关闭打包/解压缩输入和输出K位-从0/1字节转换为K位序列,反之亦然对应于位的字节0/1序列中的字节(便于编码/解码数据包-例如,字节0/1可以乘以载波)

您还需要了解GNU Radio Companion(GRC)的哪些知识?


GRC中所有具有输入或输出的块都需要数据类型定义。一个块的输出类型必须与与其关联的块的输入类型相同。一个块的输出可以传输到多个块(即绘制多个链接)。但是只有一个流可以输入一个输入!

在设置窗口的选项卡以及参数的脚注中,大多数块的文档很少。尽管通常这还不够。这里有点过时

所有块参数都可以是Python表达式。即您可以用变量块定义的变量代替公式代替数字。

通常,您想通过更改变量的值来“扭曲”项目参数。为此,请使用WX Slider或类似的UI组件,使用其名称而不是所需的变量。启动项目后,一个滑块将出现在UI中。这对于调整频率或滤波器参数非常方便。

链接类型或块参数中的错误以红色突出显示。它们还阻止了项目的启动(在以红色突出显示的块的设置中,您可以阅读有关该问题的信息)。即使项目启动,也会出现运行时错误-GRC窗口底部的日志将告诉您问题出在哪里。

一些块需要整数作为参数。公式替换可能导致类型不匹配。使用Python int()函数将其转换为整数。

要禁用该块,请使用“禁用/启用”。这将不允许删除该块,而只是在保存所有输入参数的情况下将其从项目中排除一段时间。

GRC中的所有方案都转换为Python脚本,您可以在以后更改它们,以及绕过GRC自动化某些过程。

将声音/无线电信号保存到文件中以进行进一步分析通常很方便。为此,请使用文件接收器块。请注意,读取文件时,您需要记住写入时使用的数据格式(数字类型)以及采样率。除了记录的信号本身的描述之外,我建议在文件名中包含这些值-这样您就可以记住以后如何阅读它。

从文件播放时,请确保使用Throttle块限制读取速度。如果电路中存在另一个物理上限制数据读取速度的模块,则不需要这样做。例如,“音频接收器”模块按照其“采样率”设置中的规定限制提供给它的数据的速度。

使用工具栏中的放大镜图标查找所需的块。双击可用块列表中的名称,将块添加到项目中。而是可以将其从列表中拖动到项目中的所需位置。

尝试方便地将块放置在项目中。除可读性外,这不影响其他任何内容。

我希望本文鼓励有人尝试声音。

Source: https://habr.com/ru/post/zh-CN393713/


All Articles