有用功:3GPP提案下载太烦了,怎么破?

每次开会,都会跟踪几个研究方向。通信汪的日常,需要在会前做contribution review。

5G的饼越画越大,汪们无比激动,提案数目成倍增长。每次开会动辄上千篇提案,提案的编号都要升一位才能解燃眉之急。

Screenshot

看着翻了N屏还没到头的TDocList,汪同学的内心是崩溃的,眉头拧成了疙瘩。

下载需要看的提案,在3GPP的FTP上都不知道要翻多少遍,想到这些,汪同学不禁在心中又使劲骂了一遍:

“这哪儿是人干的活计!”

“看提案才是你汪该干的事儿,下载这种粗鄙的工作,就应该让那电脑干,反正咱也不用交电费!“”

码农斯基似乎洞悉了汪同学的小心思,探头过来搭话。

二人对视,会心一笑。

如果只是做Contribution Review,通过下面这个简洁的Work Flow和一个有效的工具,就可以把想看的内容单独收集起来。

Workflow的内容很简洁:收集、批量下载、自动保存。需要人做的事情就是收集阶段,从TDocList中筛选出提案号。而剩下的工作就交给3GPPFTPDownloader来做了。

下载地址在这里,区分系统哦。

Step 0:启动程序

系统上需要安装JRE。对于Windows系统,双击jar文件就可以启动;对于Mac,拜教主和厨子所赐,需要在终端中启动:


  java -XstartOnFirstThread -jar xxx.jar

程序启动后的主界面如下:

  • FTP Server:FTP服务器的url或者ip
  • Meeting Type:3GPP工作组
  • Meeting Name:某个工作组下的具体某次会议
  • Remote URL:FTP文件路径
  • File List:需要下载的文件的名称

Step 1:选择工作组

通过下拉菜单选择3GPP的某个工作组。之后,程序会自动更新这个工作组内的所有会议名称信息。

Step2:选择会议

Step3:添加提案号并下载

添加需要下载的提案号,每行一个。之后点击Download便开始下载。文件会自动保存在”程序所以在目录下/会议名称/当前日期和时间” 目录下。

Tips:

  1. 通过点选Manual,可以手动编辑ftp服务器和文件路径。
  2. 目标路径并没有指定到服务器的Docs路径上,因此,可以下载某次会议目录下的所有文件。例如,想要下载某次会议的meeting report或者其他zip文件,只需要选择某次会议后,输入会议报告的zip文件的名字(去掉.zip),就可以直接下载了。这和前面介绍的下载提案的方法一样。
  3. 通过修改程序目录下的meeting_path_cfg.cfg,可以自己定制需要呈现的工作组。格式:工作组的名字@ftp服务器上的路径,例如:SA2@/tsg_sa/WG2_Archd;增加、删除都可以,例如增加一行:LTE@/tsg_ran/WGs_LongTermEvolution
  4. 如果你偏爱脚本,可以尝试我以前写的一个shell脚本,没有GUI那么方便,但是体积小巧。

 

动手玩 :RTL-SDR FM Radio Walk Through

 

写在前面

自从在OSX上装好GNU Radio之后,我一直在想能不能搞点有意思的刺激的东西。但是,饭总要一口一口吃,大的计划也要脚踏实地地从一些基础工作开始做起。在开始自己写代码前,最好用现成的东西先来一遍,看看标准的代码长什么样。俗话说,老司机给带带路呗。所以,这次我们就利用GNU Radio已经提供的blocks,搭建一个FM收音机出来。

准备工作

硬件方面,我依然钟情于40块钱的RTL,像X310这种板子,用来当背景什么的最合适了 XD。 其实最主要的原因是,万一玩儿脱了,也就40块钱,要是把X310烧了……呸呸呸

软件方面,在前一次配置GQRX的过程中,我们已经在利用macport 在OSX中搞定了GNU Radio的安装,但是为了稳妥起见,还是用macport把各种乱七八糟的东西更新一下。如果和我一样,有些组件已经给玩坏了,还可以强制重新安装一遍。

1.sudo port selfupdate2.sudo port update installed

如果更新过程中,收到这样的提示:

1.Warning: A file belonging to the 'xxxx_port_name' port is missing or unreadable. Consider reinstalling it.

这说明这个已经安装的包(xxxx_port_name)有文件挂了。这时候直接install 和 update,不能解决这个问题,最好强制re-build一下:

1.sudo port -n update --force xxxx_port_name

至此,准备工作已经完成了。

Let’s do it!

FM收音机工作原理

注意哦,这里是FM收音机工作原理,不是FM工作原理。FM的原理自己回去翻通原去吧。大体上,一个简单的FM收音机是这个样子的:

这几个部分的工作流程是这样的:

  1. RF电路把中心频点调到某个频率,天线接收信号
  2. 对接收到的模拟信号进行ADC,采用频率为
  3. 将ADC后的数字信号经过一个数字低通滤波器,剃掉一些没有用的高频噪声。
  4. 滤波器输出信号按照FM进行解调
  5. 将解调后的数字信号转换成适当的电平通过扬声器播放

大致了解了FM收音机工作原理和工作流程后,我们就可以开工了。

啊?这就开工了?

接上电源,打开电脑,找到苍老师……XD,瞬间小岳岳附体了。

接下来请出我们的主角。

GNU Radio Companion

GNU Radio 提供了一套可视化的搭建平台,这既是GNU Radio Companion(以下简称GRC)。如果你以前接触过Matlab的Simulink,你会发现GRC已经把搭建系统这件事情,简化到了“傻瓜级”的水平。 从GRC的角度看,基本操作就4个:

  1. 选择需要的功能模块
  2. 根据设计配置模块参数
  3. 把模块连起来
  4. 不满意?用自己写的模块啊(out-of-tree modules)

怎么样,简单吧?在这里,我就不给GRC做广告了,只额外再多说两句:SDR是engineering + coding 的结合。一方面,攻城狮们在通信原理、DSP、还有电路硬件方面的知识构成了任何一个SDR系统的backbone;另一方面,程序猿们的优化和扩展则是SDR的精髓,是真正让SDR与众不同的灵魂。

不扯这些,现在我们还是小学生,先学走路。

模块及参数配置

用MacPort 安装了GNURadio之后,就默认安装了GRC。不需要额外的配置,直接就可以用:

1.gnuradio-companion

GRC的默认界面是这个样子的(我这边MacPort提供的GRC版本使用的GUI是基于QT的):

模块的基本操作简答提一下:

  • 添加模块:从右边的列表里选中需要的模块,拖到左边的空白处;
  • 配置参数:在模块上双击或者右键点Properties。一般都会有Documentation Tab,没事儿多看看。
  • 链接:单击模块a的输出(out),再单击另模块b的输入(in),就会自动完成把模块a的输出数据作为输入送入模块b的操作。而对于变量,可以通过”Variable”模块或者GUI输入的各种输入模块进行变量ID声明和变量赋值,在其他模块中利用变量ID名进行引用。
  • 取值:可以直接输入值、引用变量ID,也可以是python运算表达式。
  • 简单调试:如果框图中有错误,Error按钮就会变亮,点击后可以看到模块级的出错信息。
  • 其他操作:看右键菜单。

RTL-SDR Source

RTL-SDR Source是RTL-SDR USB dongle的驱动接口,通过它我们可以完成对信号接收和ADC(前面提到到步骤1 和 2),还可以配置增益控制。

参数配置很直白,就不一一介绍了,拣几个重要的说:
Sample Rate:我用的RTL2382U理论上最高支持3.5Msps的采样率,但是无损的采样率最高为2.56Msps。采样率过低会导致最后音频解调失真,但是过高又会造成处理速度下降。因为FM Radio有效的带宽也就撑死了100kHz,所以这个数值我设在1-2Msps之间,例子中是1.28e6sps。
Ch0: Frequency:中心频点的位置。如果我们打算收听帝都交通台FM1039就调到103.9e6
Ch0: Freq.Corr:设备的频偏修正。在前一篇文章在测量GSM基站频点的时候,测过我这套RTL2382U+R820T的频偏修正大约为-28ppm。每套设备修正值都不同,但是对于FM收音来说,偏个几十KHz都没问题,所以0也可以。

在这个部分,我用变量samp_rate来设置采样率;用一个QT GUI中滑块来动态调整中心频率,实现调台(Turn!Turn!Turn!)

LPF

低通滤波器。基带信号有用的就那1-200kHz带宽有意义,因此在采样后利用LPF把高频信号全都滤掉。核心参数有两个:Cutoff Freq和Transition Width。两个参数的含义看了下面这俩图你就明白了。

因为我们并不知道广播电台FM信号的带宽具体是多少,所以用一个滑块来调节Cutoff Freq,从1kHz到200kHz步长1kHz。数字低通可以令LPF的边缘非常陡峭,代价就是引入一些毛刺,因此对Transition Width也做了一个滑块,用来控制LPF的形态。

你大概发现了,还有个Decimation咋没提呢?这里先留下,后面单独介绍。

WBFM

WBFM是WideBand FM模块,对应的还有一个NarrowBand FM(NBFM)。WBFM模块有两个参数需要配置:

  • Quadrature Rate:采用正交解调方法,我理解Quadrature Rate就是I/Q支路上的符号速率,这里我们设置为320e3(320k)
  • Audio Decimation:和前面Decimation一样,最后再说。

Rational Resampler

顾名思义,这个模块的功能就是数据流的速率。在这里顺带手吧前面一直说的Decimation来解释一下。

数据流的速率

所有的Block都有一个输入,很多(但不是所有)Block也都有一个输出。输入数据流的速率可以理解为函数传递参数的个数,例如,有的是320k(320e3)个,有的是2M(2e6)个。如果模块A的输入数据流的速度是,输出的数据流的速率是,模块A要把这个数据流作为输入送入模块B,那么至少要保证的个数与模块B中定义的输入数据流的速率是一样的。换句话说,我们要使模块A的输入数据流的速率,在经过模块A处理变成速率为的输出数据流时,满足

为了达到这个目的,最直接的方法就是在模块A上定义一组系数,在模块A上对输入数据序列进行抽取,使速率下降为原来的,之后再用内插数据点的方式,使输出的数据速率增加到倍。这么说可能有点别扭,用公式表示就简单了:

 

就比如我们这个框图吧:

  1. WBFM输出的数据流的速率是320K,这个数据流作为Rational Resampler的输入,即
  2. 如果我们希望经过Resampler之后的输出数据速率变为32K,那么就可以设置Decimation为10(),设置Interpolation为1(),这样输出的速率就变成:

前面几个模块中的Decimation也是这个意思,依此类推。

数据类型

这是一个没有显性说明的因素,在我们这个例子中:RTL-SDR Source只提供Complex(32bit)的输出;LPF、Rational Resampler支持Complex和Float,但是输入输出数据类型要相同;WBFM Recieve没有任何选项,但是实际上他要求输入必须是Complex,输出是Float。

从写程序传递参数的角度看,不同的数据类型占用的存储空间是不同的:一个Complex包含实部和虚部,因此至少是两个Float。因此在不同的模块之间传递的数据流,不仅仅要个数匹配(数据流的速率),数据的长度也要匹配(数据的个数 *每个数据的长度)。这点在配置的时候要注意。

现在你可以思考的问题是:为什么WBFM模块在做FM解调的时候,输入输出为什么一定是从Complex类型到Float类型呢?Hints:WBFM把复信号解调成实信号输出。

Audio Sink

这个模块的作用是把数字信号转成模拟信号通过声卡播放出来。类似前面RTL-SDR Source中的采样率,这里需要一个采样率来进行DAC。

效果

除了上面提到的几个模块,我在LPF后面接了一个示波器;在Audio Sink前接了一个乘法运算模块和滑块作为音量调节。你也可以不加这两个模块。最后,把所有模块连接起来,整体的流程图是这个样子:

运行

通过调节Freq滑块进行频率调整,找到你想要收听的广播电台。调节LPF的两个滑块调节LPF的Cutoff和Transition宽度,调整送入WBFM的FM信号带宽,从而改变最后的解调出来的声音效果。

d(˙v˙)b

Enjoy!