如何结识PLUTO和HDSDR



不久前,一时冲动地为儿童和青少年购买了可爱的SDR收发器-ADALM PLUTO。 令我遗憾的是,它可以与LINUX上的许多软件一起使用,但是我最喜欢的HDSDR不支持它。 我三思而后行,开始处理这个问题,结果如下:

ADI公司向学生介绍其PLUTO。 PLUTO的所有软件都是开放的,可以免费获得。 该公司的网站上有一个页面 ,您可以在其中找到有关PLUTO操作的几乎所有必要信息。 大多数软件是在Linux下编写的,建议学生使用GNU Radio,MATLAB等。

我对PLUTO有纯粹的业余无线电兴趣。 仅需150美金,SDR范围从70MHz到6GHz( 披露后)是一个奇迹。 可以做多少实验! 看看那里集成了多少东西:



显然,AD认为火腿本身应该为流行的程序编写驱动程序,因此直到最近,甚至SDR#都不被支持。 但是SDR#不适合我,因为我需要程序中良好的CAT支持以使频率与收发器同步。 我想通过将HDSDR连接到收发器的第一个中频来尝试将其用作全景接收器。 因此,只有一种方法-自己集成HDSDR和PLUTO。

使用Google,我很快发现要解决我的问题,我需要以Winrad格式创建一个特殊的ExtIO_.dll库。 该库充当HDSDR与所需SDR接收器之间的软件桥梁。 幸运的是,库接口已被很好地记录下来 。 另外,在github上有很多针对各种接收器的现成库实现:RTL_SDR, LimeSDR等。这里有个地方可以看到如何编写代码。 正如他们20年前写的那样,该库本身是一门古老的书,没有新技术,只有纯C89。 至少您不需要学习新的编程语言,这已经激发了人们对成功的希望。

本质上,ExtIO_.dll需要使用许多功能来实现,这些功能使您可以初始化SDR设备,启动和停止信号接收,保存和恢复指定的设置。 对我而言,最不可思议的时刻是接收机与HDSDR之间的流数据交换格式,但下面将进一步介绍。

现在出现了一个问题,即如何以编程方式控制PLUTO。 实际上有几个控制选项。 我发现至少两个:要么通过libad9361.dll库直接与芯片配合使用 ,要么通过IIO库与芯片配合使用。 后一种选择对我来说似乎更简单且描述得更好,所以我选择了它。 在该库中,所有设备设置都以某种XML结构的形式提供,可以通过属性的文本名称访问单个元素,这非常方便。 可以在这里找到该库的更详细描述。 该库的巨大优势在于它带有命令行实用程序,您可以随时使用它们来快速更改所需的接收器设置。 因此,您无需在HDSDR界面中实现所有SDR设置,只需最少的花费即可。 如果需要,可以从命令行完成一些特殊的FIR滤波器的加载。 IIO中的数据流:



通过编程,学习如何从HDSDR控制PLUTO非常快捷,容易。 在流数据中获得令人满意的结果要困难一些,特别是因为我以前没有使用SDR的经验。 在这里,您需要了解数据以I / Q / I / Q ... I / Q样本流的形式来自SDR接收器。 每个样本都是一个无符号的16位整数,其中只有12个低位是重要的。 同时,HDSDR有十几种接收数据流的选项。 对我来说,哪一个更方便更好。 结果,我决定使用该选项,在ExtIO中将其称为exthwUSBdata16,即 实际上,IOI库如何一对一地提供数据。
下一个问题是IIO接收缓冲区和HDSDR之间的数据传输。 后者以512字节倍数的块形式接收数据,并且IIO无法以这种格式输出数据。 我必须制作一个中间缓冲区并通过它传输流。 传输代码如下所示。

DWORD WINAPI GeneratorThreadProc( __in LPVOID lpParameter ) { int16_t iqbuf[EXT_BLOCKLEN * 2]; ssize_t nbytes_rx; char *p_dat, *p_end; ptrdiff_t p_inc; int iqcnt = 0; // pointer to sample in iqbuf while ( !gbExitThread ) { nbytes_rx = iio_buffer_refill(rxbuf); p_inc = iio_buffer_step(rxbuf); p_end = (char *)iio_buffer_end(rxbuf); for (p_dat = (char *)iio_buffer_first(rxbuf, rx0_i); p_dat < p_end; p_dat += p_inc) { iqbuf[iqcnt++] = ((int16_t*)p_dat)[0]; iqbuf[iqcnt++] = ((int16_t*)p_dat)[1]; if (iqcnt == EXT_BLOCKLEN * 2) { // buffer full iqcnt = 0; pfnCallback(EXT_BLOCKLEN, 0, 0.0F, &iqbuf[0]); } } } gbExitThread = false; gbThreadRunning = false; return 0; } 

使用指示的周期,可以实现4 MS / s的流传输,在此值之上,数据没有时间要发送,并且信号会出现卡顿现象,尽管熨斗似乎能够发送20 MS / s甚至更高。 增加了循环旋转到THREAD_PRIORITY_TIME_CRITICAL的线程的优先级,从而增加了缓冲区的大小。 没有结果 此外,当缓冲区增加到1 MB时,无法以最小流量正常接收。 这里更多并不意味着更好。 如果您有关于如何提高速度的想法,请在评论中分享。

我必须说4 MS / s足以满足我的需求,该频段比涵盖任何业余HF频段都多。 是的,并且在VHF和微波频段上足以完成大多数任务。 结果,库被写入,打开了用于接收的PLUTO的HDSDR窗口如下所示:



所有库代码都可以在github上找到 。 随意将其用于ADALM PLUTO的实验。

73 de R2AJP

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


All Articles