Funpack第五期-ADI PLUTO-FM播放器-用GNU Radio编写一个基于ADALM Pluto的SDR FM收音机
拓展了ADALM-PLUTO的频段,达到70MHz到6GHz。通过GNURadio实现FM调频广播的解调以及上位机界面。增加了立体声调制功能,实现了音量调节、固定频点选择、频域上的频率瀑布图、时域上的幅度波形图上位机界面功能拓展等。
标签
嵌入式系统
FPGA
网络与通信
都市木头
更新2021-02-20
1137

Funpack第五期活动报告

第一部分 活动任务完成情况

我选择的是第一个题目FM播放器,一方面软硬件是第一次用,这个题目相对比较容易实现;另一方面,GNURadio其实是可以玩很久的东西,想认真研究下,所以就做了这个先保底一下,后面有时间再拓展学习。

首先,按照官网和活动视频提示,实现了题目的基本要求,拓展了ADALM-PLUTO的频段,将AD9363拓展成AD9361,使其达到70MHz到6GHz;同时替换了ADALM-PLUTO天线,我先是找了一根拉杆天线,发现接口不匹配,后来找了一根不用的网线,把其内的双绞线扯出来一根,线芯在不剥掉绝缘层情况下(前端露出点铜芯)刚好能塞进去,当FM天线效果非常好,随便绕在在窗帘拉绳上,还可以每天通过升降拉绳调节高度,一举两得,没有现成天线时可以临时用用。关于FM收音机的功能,我主要是在windows下通过GNURadio实现的,实现了至少从87~108M频段的FM调频广播的解调,以及上位机界面,通过上位机实现调频功能。

同时,我还增加了立体声调制功能,实现了音量调节、固定频点选择、频域上的频率瀑布图、时域上的幅度波形图上位机界面功能拓展等;我还尝试在Linux下安装了GNURadio,我选择的是国产的deepin20系统,虽然应用商店里内置了GNURadio,但是因为没有安装PLUTO驱动以及相关模块,我还是通过参考wiki.analog.com上的文档通过命令行完成了安装。具体效果展示见我上传的视频《用GNU Radio编写一个基于ADALM Pluto的SDR FM收音机》,我在B站上也上传了同名视频,账号是“都是_木头”。

 

第二部分 各功能对应的主要代码片段

因为GNU Radio可以直接通过图形化编程实现的,没有自己增加代码,因此我这里主要就有些关键模块的参数设置进行简单说明:

第一步,完成最基本的功能,就是说接收一个电台并发声。

文件名为ADALM PlutoSDR fm_demod_easy.grc

我们数据的流向是:PlutoSDR_Source->Rational Resampler->FM Demod(或者WBFM Receiver)->Audio Sink. 按照这个顺序连接好这些模块,通过修改相应的参数,来解决调试中出现的报错。我们按相反顺序看:

Audio Sink模块用起来很简单,它接收输入信号并通过扬声器播放。只有一个速率设置,最常见的就是48kHz,我们就用这个速率。

Audio_sample_rate:48kHz

FM Demod是解调模块,这里仅仅需要设置两个参数:输入的速率以及抽取值,其它参数默认就可以了。其中Channel Rate即输入的速率,就是Rational Resampler的输出速率,抽取成Audio_sample_rate;抽取速率是可以自己设定,我们设置成8,这将和插入速率一致起来就可以了。

  Channel Rate: Audio_sample_rate * Audio_Decimation = 48kHz * 8 = 384kHz

  Audio Decimation: Audio_Decimation = 8

Rational Resampler查了一下称之为合理重采样多相FIR滤波器,简单讲就是通过抽取和插值来改变信号采样率,以调整数据流的速度,以方便后端处理。我们这里因为进来的基带信号还是以初始采样速率2.8M输出的,相对20khz以下的音频信号来说还是比较高,为了便于音频端数据处理,我们这里对采样后的数据进行降采样。同时,设置抽取数值的时候要将采样率转换为整型(模块自动取整),为了简单点就不要插值了,即设Interpolation为1。

Interpolation:1

Decimation:int(samp_rate / Channel Rate )= int(2.8M / 384kHz) = 7

其余的参数,默认就可以了。

关于这块,其实实现起来还是有很多选择的,既可以根据需要调整参数,也可以选择其他模块,只要具有采样调整功能的低通滤波器都可以实现上述功能,差别就是参数设置不同而已。

PlutoSDR Source,GNU Radio 内置了两个Pluto模块,一个信源一个信宿,PlutoSDR Source是信源,另一个当然是Pluto Sink,我们这里作为接收机只使用了PlutoSDR Source。Device URI是根据Pluto的ip地址来设置的,也就是说PC和Pluto是以网络接口互通的。LO Frequency就是本振频率,设成电台频率就可以了,采样率 Sample Rate刚才说了用2.8M;RF Bandwidth 配置RX模拟滤波器的带宽,说明上说限制在200kHz 和 52M之间,这应当与Pluto硬件指标有关,实际试了一下没有啥影响,低于200kHz也能用,不知是不是低于下限就默认200kHz了还没搞清楚。

其余的参数,默认就可以了。

这样执行后就可以听到广播了。

第二步,添加图形界面,并增加部分调整功能。

文件为:ADALM PlutoSDR fm_demod_GUI.grc

主要是增加了Qt gui frequency sink、Qt gui waterfall sink、Qt gui time sink这三个显示模块;另外增加了调整音量和调台功能,具体参数可以看源文件,需要注意一点是数据类型一定要统一起来,否则有些参数设置就无法实现。

其实用WX模块也可以,只不过是要全部换掉,个别名称和参数设置稍有不同,相比Qt显示要好看些,各有优长。

第三步,更换模块,改成立体声。

文件为:ADALM PlutoSDR WBFM_receive_PLL_Stereo.grc

最简单的办法就是把解调模块改成WBFM Receive PLL,这其实也是一个滤波器,当然还需要两个输出口各接一个multiply_const模块,同理,Qt gui time sink和audio_sink改成两个接收端。

 

第三部分 对本活动的心得体会

其实这个界面和功能还是比较初级的,SDRSharp等还有很多软件界面和功能更完美强大,虽然做的还是很粗糙,不过参加此次活动的确收获不少,至少有下面几个:

一是实现了三个第一次。第一次用了图形化编程工具GNU Radio,第一次用OBS Studio录制了视频,第一次(被迫)当了回UP主,尤其是前面两个软件都是开源的,功能非常强大,增加了对开源软件,尤其是专业性比较强的工具型开源软件的兴趣。如果没有参与这次活动估计难得有机会。

二是重温了通信原理和数字信号处理知识。虽然都学过这些专业课,但是过去学习时没有这么好的软硬件条件,纯理论学习,学完就很少碰它了。GNU Radio上面这些功能模块就是对理论概念的具体化,又是一个直观的仿真器,再加上Pluto的加持,就完成了实实在在的工程实现,可玩性大增,绝对是通信原理和数字信号处理课的极佳学习工具。那些既熟悉又陌生的名词,又把我拉回到教室里了。

三是发现了不少资源。无论是在硬禾、哔哩哔哩还是在CSDN、知乎等等,都找到了很多关于软件无线电的资源;还有活动群里大家分享的资料和讨论的问题,都能给我不少参考和启发;其实,GNU Radio和ADI官网提供的不少原文链接,许多示例讲得非常详细,许多模块的使用我就是在那里面找到的,认真研读其中的说明基本就够用了。

四是认识了不少大牛,在交流群里苏老师不用说了,还有热心的Frank、Lucia,视频分享的Teray、经验分享的圈圈、chris等等等等,虽未谋面,都值得我学习感谢。我在知乎上还关注到openWIFI作者“纸飞机”关于Pluto的有趣的论战分享,也是极其精彩,更加凸显了Pluto的高性价比。

还有很多收获无法一一例举,总而言之,激发了我学习探索软件无线电的兴趣,甚至引起对Matlab、Linux、Python、FPGA等等的兴趣,前两天还看到GNU Radio官网上说九月份有个大会活动不知道会有啥新玩意冒出来,持续关注中。

 

要说意见建议,就是觉得Pluto这个项目价格太高,估计劝退不少人,虽然后期增加了补贴,还是响应者寥寥,感觉有些可惜。另外,硬禾的活动都很好,对于有些人来说可能并不难,但对于初学者还是时间有点紧,特别是Funpack,周期太短,建议搞个类似回场活动,反响好的项目再推广一下。

 

最后还是要感谢硬禾所有老师们的努力付出!

 

附件下载
说明文档及grc文件.rar
说明文档及grc文件
团队介绍
都是木头
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号