问题标签 [software-defined-radio]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
420 浏览

reverse-engineering - 使用 SDR 合成无线电信号

我目前正在处理的项目有点麻烦,我正在尝试合成来自门铃的无线电信号,看看我是否可以在不需要文件的情况下回复它(认为这将是一个好方法开始学习一般的信号合成)。我在 gnuradio 中有一个流程图,它能够生成与我的门铃信号类似的模式,当我打开原始信号和我创建的信号时,它们看起来很相似:

类似的信号

然而,当我播放生成的信号时,门铃没有响起。经过进一步检查,我注意到门铃使用的波形与我的不相似:

不同的波形

虽然我的波形是余弦波,但门铃的波形在其自身内部振荡。

我的主要问题是,如何生成我的门铃可以识别的信号?有没有办法可以创建与门铃类似的波形?

我对使用软件定义无线电生成 ASK OOF 信号的主题相当陌生,所以如果这似乎是一个简单的问题,我很抱歉。

0 投票
1 回答
1677 浏览

python - 在 python 中解码二进制协议

我正在尝试编写一个简单的 python 客户端来解码从名为sdrdaemon的程序生成的二进制流。

此处描述了该协议(为方便起见,复制如下)。我的理解是前 42 个字节应该包含我想用 python struct模块读取/解码的元帧。

我从一些非常简单的事情开始。

但是我对这种事情不熟悉,无法理解我将如何同步,所以我解码了正确的部分。下面的描述指向 CRC,但我不确定如何去做。一点指导会很棒。一个 github 问题没有得到回应。

此处给出了该协议的完整解释,但也复制如下:

打包

从硬件设备检索的数据块被分割成 UDP 有效负载大小的块。该块序列在下文中称为“帧”。一个称为“元”块的特殊块在帧之前发送。它用于传达有关帧及其随后数据的“元”数据。对此“元”数据计算 64 位 CRC 并将其附加。它用作验证并从数据块中识别“元”块,从而实现同步。实际上,将其与数据块混合的可能性非常低。

一个压缩流可以把从硬件检索到的多个数据块打包在一帧中,以提高压缩效率。因此,可能会出现元数据在同一帧中从一个“硬件”块到下一个块发生变化的情况。在这种情况下,该帧被拆分,并使用来自元数据已更改的块的起始“元”块构造一个新帧。原始帧的第一部分立即通过 UDP 发送。这确保了数据帧和它的“元”块总是一致的。

元数据块

“元”数据块由以下内容组成(以字节表示的值):

元块 - 无包装

总大小为 42 字节,包括 8 字节 CRC。

数据块

当流未压缩时,有效载荷大小的 UDP 块被填充完整的 I/Q 样本,在块的末尾留下一个可能小于 I/Q 样本的未​​使用间隙。最后一个块仅填充剩余样本。在“元”数据中给出了最后一个块中最大填充块和剩余样本的数量。当然,由于数据流是未压缩的,这些值也可以从样本总数和有效负载大小中计算出来。

当流被压缩时,UDP 块完全被压缩流的字节填充。最后一个块仅用剩余字节填充。完整块和剩余字节的数量在“元”块中给出,否则无法计算这些值。

概要图

未压缩流

编辑::我在发布后不久就放弃了这种方法(支持 SoapySDR),因此无法再真正发表相关评论。

0 投票
0 回答
1021 浏览

lag - 使用 GNU Radio 的 HackRF One 进行传输时的高延迟

所以我对一个 RC 玩具无线协议进行了逆向工程,并在 GNU Radio Companion 中编写了一个流程图来重现玩具的命令。

sink 块为 osmocom sink,发送设备为 HackRF One。

我遇到的问题是按下按钮和玩具反应之间的严重滞后,大​​约是 1-2 秒。

快速按下,例如“前进”按钮两次,玩具也会快速连续地向前猛拉两次,大约在按下后一秒钟。所以它不像流程图本身很慢。CPU使用率也相当低。这看起来像一些缓冲问题。

我很确定流程图本身会立即对按钮按下做出反应,因为调试打印出现在按钮被按下/按下的同时,并且方波也会立即出现在 GUI 范围接收器中。

我试图将 HackRF 缓冲区的数量减少到一个(通过将设备参数设置为hackrf,buffers=1),但这没有帮助。

我也将流程图的“最大输出数”设置为 10,它也没有任何区别(我也尝试了其他一些值)。鉴于该信号出现在 GUI 范围内的时间比 1 秒后要快得多,因此它无论如何都不应该起作用。

那我怎样才能减少延迟呢?

GNU Radio Companion 流程图

编辑:我遵循@Manos 的建议并尝试调整采样率。

添加一个带有 8 插值的有理重采样器块(并相应地调整接收器采样率)和设置hackrf,buffers=1使延迟几乎不存在。

但是,将我的自定义块的输出采样率降低到 500k 并具有 16x 插值仍然会导致明显的延迟,可能是 400-500 毫秒(仍然没有源和接收器都为 1M 时那么显着)。我不知道如何解决它。不幸的是,以 1M 运行我的自定义块会消耗 100% 的 CPU 并导致偶尔的下溢。

0 投票
0 回答
132 浏览

linux - 为 Pothos 安装 LoRa SDR 时出错

当我尝试为我从https://github.com/myriadrf/LoRa-SDR克隆的 Pothos 安装 LoRa SDR 块时,出现以下错误:

如果我插入文件的完整路径

/Pothos/System/Version.hpp

在 PothosConfig.cmake 中,第一个错误消失了,但这仍然显示:

在我的例子中,Pothos 和 LoRa-SDR 目录位于 /home/jernej/ 文件夹中。

我必须将 POTHOS_INCLUDE_DIR 设置到哪个路径,还是必须做其他事情?

0 投票
1 回答
770 浏览

raspberry-pi2 - Raspberry Pi 上的 GNU Radio 和 BladeRF(简单 FSK 系统)

我在将 GNU Radio 设置从 PC(Windows 10、USB3)移植到 Raspberry Pi 2 (USB2) 时遇到问题。我认为 USB 带宽和 CPU 应该不是问题(运行时利用率只有 30% 左右)。从本质上讲,RPi 在传输过程中似乎处于“暂停”状态,而 PC 则没有。在这两种情况下,接收器都在 PC 上运行。我包括一张我在 PC vs Pi 上运行发射器时在 FSK 解调后看到的图片(带圆圈的“暂停”区域),以及我的(诚然草率的)原理图的图片。非常感谢任何帮助/提示。gnuradio schem接收到的信号

编辑:看起来它实际上可能是处理限制。从 9400 波特切换到 2400 波特会使问题消失。如果有人有使用 GNURadio 的经验……我是在做任何效率低下的事情,还是应该降低通讯速率?

0 投票
2 回答
374 浏览

algorithm - 自动信道检测算法

我目前正在从事一个业余项目,使用 SDR 对无线电信号(更准确地说,我对 L 波段卫星频道感兴趣)执行自动调制分类 (AMC)。我希望它能够发现功率谱中的通道,以及它们的频率和带宽,这样我就可以将 AMC 应用到这一步的输出上。

我的第一个(天真的)方法相当简单:在每 N 个样本(比如 1024 个)应用一个窗口函数后,对最后一个 N 执行 FFT,计算功率谱的估计并应用一些指数平滑来减少噪声。然后,在平滑的功率谱中,找到最大和最小信号电平,根据两个电平的加权平均值计算某个阈值,并使用该阈值来确定哪些频率区间属于一个通道。

这在我的单元测试中效果很好(一个 QPSK 通道 + 高斯噪声)。然而,在现实生活中,我要么得到一些渠道,要么得到很多误报。当然,我可以通过微调阈值计算中的权重来解决这个问题,但它就不再是自动的了。

我一直在对 Google 进行一些研究,但也许我没有使用正确的搜索关键字,或者对这个主题没有真正的兴趣(这很奇怪,因为频率扫描仪必须以某种方式执行这项任务)。

我怎样才能找到平均权重的适当值?也许有比计算整个频谱的阈值更好的方法?

0 投票
1 回答
2045 浏览

python - 计算快速傅里叶变换中存在的频率

我的信号输出值由软件定义的无线电记录,其中心频率为 162.550 MHz,采样率为 1,000,000。现在为了分析频域中的数据,我计算了 FFT,这很简单。

因为对于幅度与频率图,我也需要计算信号中存在的频率。我为此使用了 Numpy fftfreq。

输出在 [-0.5 0.4999995] 的范围内。我很困惑如何解释这个结果,或者如何计算数据中存在的频率?

0 投票
1 回答
802 浏览

python - 在 Raspberry Pi 上播放 FM 收音机,无需重启即可更改频率

我正在播放 FM 收音机并尝试在流式传输时更改我的 Raspberry Pi 3 的 RTL-SDR 频率(即,无需关闭程序并重新启动)

它目前播放电台,我可以慢慢增加电台/频率。但是,如果我将其增加得太快,SDR 就会停止播放。

我在用着:

  • 树莓派 3,用 Python 2.7.9 编写
  • NooElec R820T SDR 和 DVB-T USB 加密狗
  • 旋转编码器输入所需频率
  • pi 编码器
  • rtl_fm接收和 sox 播放

我的代码目前是:

python子进程是否可以容忍这种使用?

是否有另一种方法(命令、方法、库)可以更顺畅、更快速地更改电台/频率,而不会影响播放或停止 SDR 播放?

0 投票
1 回答
691 浏览

linux - 播放正在写入的 MP3 文件

我正在使用 rtl_fm 和 sox 将调频电台保存到 mp3 文件中。rtl_fm 捕获信号,sox 将其转码为 mp3。

然后我尝试在第二个终端中播放该文件,因为正在使用以下方式编写 mp3:

问题是它只播放到 mp3 在调用播放命令时的时间。

我如何让它随着时间的推移播放附加的 mp3,而它正在被写入?

编辑:在 Raspberry Pi 3 (Raspian Jessie)、NooElec R820T SDR 上运行

0 投票
0 回答
1108 浏览

python-2.7 - Raspberry Pi 3 & PyAudio IOError: [Errno Invalid input device (no default output device)] -9996

我正在尝试让 PyAudio 在我的 Raspberry Pi 3 上运行 SDR (rtl_fm) 并从耳机插孔播放音频。除了 USB SDR 作为源 fm 音频外,我没有其他任何东西,其他一切都是库存。

我已经通过他们的网站按照有关如何安装和设置 PyAudio 的说明进行操作。(https://people.csail.mit.edu/hubert/pyaudio/

这是我当前的测试代码:

它尝试执行,我收到此错误:

我不知道如何处理 IOError。

我还认为 rtl_fm 和 pyaudio 设置可能存在设置不匹配,但我还是新手,不知道我在哪里不匹配,因为命名法略有不同。