初试 SDR(软件无线电)

  既然今天是世界电信和信息社会日,那我就来谈一些通信相关的话题。
  上周末 @lonepig 同学送我了一个基于 RTL2832U+e4000 解决方案的 DVB-T+DAB+FM 电视棒。这是他最近发现的一件神器,也是近几个月来国内外一些 HAM 热衷研究的小玩意。这个电视棒神在哪里呢?原来是一位 Linux 驱动开发者 Antti Palosaari 在分析 RTL2832U 芯片时,发现这款原本只公开了 DVB-T 等接收功能的芯片其实可以输出原始的 I/Q 采样,且接收频段较宽(64-1700MHz),因而可以用做 SDR(软件无线电)接收机。由于 RTL2832U 相关产品廉价且易购(十多美元或几十人民币,eBay 和淘宝上很多),这引起了一些 SDR 爱好者的关注(如[1][2]),很快有人为之开发了 Linux 或 Windows 下的驱动和接口程序(如[3][4]),以便通过诸如 GNU Radio 之类的 SDR 软件对其进行编程使用。
  我在前人研究基础上,照猫画虎地把这套基于 RTL2832U + GNU Radio 的 SDR 搭了起来,成功地接收了 FM 广播和 U/V 手台的信号。另外简单测试了 GNU Radio 中一些名称看得懂的模块——发现本科时学的那些老三论忘得差不多了。在 Windows 下,使用解调功能现成、界面友好的 HDSDR 进行接收相对简单一些,但可定制性也比能够灵活编程的 GNU Radio 差一些。 Read More

  既然今天是世界电信和信息社会日,那我就来谈一些通信相关的话题。
  上周末 @lonepig 同学送我了一个基于 RTL2832U+e4000 解决方案的 DVB-T+DAB+FM 电视棒。这是他最近发现的一件神器,也是近几个月来国内外一些 HAM 热衷研究的小玩意。这个电视棒神在哪里呢?原来是一位 Linux 驱动开发者 Antti Palosaari 在分析 RTL2832U 芯片时,发现这款原本只公开了 DVB-T 等接收功能的芯片其实可以输出原始的 I/Q 采样,且接收频段较宽(64-1700MHz),因而可以用做 SDR(软件无线电)接收机。由于 RTL2832U 相关产品廉价且易购(十多美元或几十人民币,eBay 和淘宝上很多),这引起了一些 SDR 爱好者的关注(如[1][2]),很快有人为之开发了 Linux 或 Windows 下的驱动和接口程序(如[3][4]),以便通过诸如 GNU Radio 之类的 SDR 软件对其进行编程使用。
  我在前人研究基础上,照猫画虎地把这套基于 RTL2832U + GNU Radio 的 SDR 搭了起来,成功地接收了 FM 广播和 U/V 手台的信号。另外简单测试了 GNU Radio 中一些名称看得懂的模块——发现本科时学的那些老三论忘得差不多了。在 Windows 下,使用解调功能现成、界面友好的 HDSDR 进行接收相对简单一些,但可定制性也比能够灵活编程的 GNU Radio 差一些。

初试 SDR(软件无线电)

  这只是最初步的用法。国外一些 SDR 发烧友已经开发了针对这个芯片的扩频模块,使之可以接收短波。时间和精力有限,我就先不实验这些了,静观老外折腾。
  看过了新鲜,别忘了这个电视棒的原本功能——看电视。之前我不是测试过 CMMB 和 DAB/DMB 制式的数字无线电视吗?有了这个电视棒,又可以测试欧洲标准 DVB 制式了。北广传媒集团在 794MHz 上发送 4 套 DVB 电视节目,分别是公交、地铁、城市(楼宇)移动电视和转播的 CCTV-1。由于应用场合的差异,其分辨率是 768x576,大于面向掌上终端的 CMMB 和 DAB/DMB;延时在亚秒级到秒级,也优于 CMMB 和 DAB/DMB。电视棒附带的 Windows 客户端 BlazeVideo HDTV 还是比较好用的,只是其 DAB 模块貌似只能解码 DAB 音频,不能解码 DMB 视频。我亦测试了 RTL2832U 的 Linux 驱动,并使用 VLC 实时解码播放,效果也不错。不过我工位附近的 DVB 信号明显比 CMMB 和 DAB/DMB 信号差,只有在室外或窗口附近才能看到稳定的视频。当然,这有可能是因为天线的差异。

初试 SDR(软件无线电)

  最后说一句实验体会,这也是 @lonepig 同学想说的:要有好天线呀!


原文链接:http://blog.linjian.org/articles/try-sdr/,作者:林健
本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。
如何您认为本作品有价值,可以向作者捐款以表支持。
(Digital fingerprint: 993d4981d6d552510db9a08493b2dbec)

相关文章

发表在 HAM, SDR, 无线, 电子与无线电, 电视 | 留下评论

vim(gvim)支持对齐线

前段时间有朋友在微博上@我推荐了一款vim的插件,用来显示对齐线,感觉效果不错,就给大家推荐一下.
下载链接: Indent Guides Read More

前段时间有朋友在微博上@我推荐了一款vim的插件,用来显示对齐线,感觉效果不错,就给大家推荐一下.
下载链接: Indent Guides

截图如下:

1

一. 安装
不用多说,直接解压放到vimfiles or .vim下

二. 配置
基本可以不用配置,不过由于默认的对齐线宽度太宽,不太美观,所以我改成1了,如下

1
let g:indent_guides_guide_size=1

详细的配置,可以参看他的文档,这里不再多说

三. 使用
默认的键盘映射是

1
<mapleader>ig

OK,插件就介绍到这里,其实如果只是单纯的介绍插件,就不用写这篇文章了。
我在用这个插件的时候,又发现了另一个需求,即标尺的功能。vim7.3里面默认提供了colorcolumn,例如执行:

1
:set cc=80

就可以高亮第80列,效果如下:

1

但是有时候我们想看一下几行的字符是不是在同一列上时,手工去输入列数实在太麻烦了,所以我就单独写了一个函数,来满足这个需求:

1
2
3
4
5
6
7
8
9
10
map ,ch :call SetColorColumn()<CR>
function! SetColorColumn()
    let col_num = virtcol(".")
    let cc_list = split(&cc, ',')
    if count(cc_list, string(col_num)) <= 0
        execute "set cc+=".col_num
    else
        execute "set cc-=".col_num
    endif
endfunction

按下,ch 就可以将当前光标下的列高亮,再按下一次,取消高亮;并且可以同时多列高亮。

这两个工具搭配在一起使用,相信会取得更好的效果。

OK,就是这样~

发表在 colorcolumn, Indent Guides, Vim, vim-indent-guides, vim对齐, vim对齐线, 对齐线 | 留下评论

2012年五一

五一回学校了,毕业三年第一次回去,高兴的不得了,走在校园里一点儿都不陌生,就是天天生活的环境一样。 Read More

五一回学校了,毕业三年第一次回去,高兴的不得了,走在校园里一点儿都不陌生,就是天天生活的环境一样。

哥哥去买山东杂粮菜煎饼,那阿姨竟然还认识他,哥哥说:上大学最重要的就是有回忆。哥哥很少这么感性…… 我也觉得有回忆的生活才是好的。

又回家看爸爸妈妈,他俩特高兴,希望以后我可以常常抽时间回去陪他们待两天。

 

发表在 小生活 | 留下评论

发布一个查看PHP opcode的扩展模块及Web服务

最近花了大约一星期的时间写了一个PHP扩展模块Opdumer,并封装成了Web服务(点击这里访问)。这个模块的主要内容是输出PHP代码对应的opcode。其实之前已经有一些用于查看opcode的扩展模块,如比较有名的vld。之所以重新实现一个这样的模块,主要是因为vld不支持PHP_FUNCTION API,也就是说vld只能用于CLI形式,而Opdumer同时拥有CLI API和PHP_FUNCTION API,另外,也想借助编写这个模块的机会学习Zend Engine中opcode的编译和执行机制。个人打算后面专门针对opcode的编译执行机制写一篇文章,而本文主要描述Opcode的使用方法及对应Web服务的使用。 Read More

最近花了大约一星期的时间写了一个PHP扩展模块Opdumer,并封装成了Web服务(点击这里访问)。这个模块的主要内容是输出PHP代码对应的opcode。其实之前已经有一些用于查看opcode的扩展模块,如比较有名的vld。之所以重新实现一个这样的模块,主要是因为vld不支持PHP_FUNCTION API,也就是说vld只能用于CLI形式,而Opdumer同时拥有CLI API和PHP_FUNCTION API,另外,也想借助编写这个模块的机会学习Zend Engine中opcode的编译和执行机制。个人打算后面专门针对opcode的编译执行机制写一篇文章,而本文主要描述Opcode的使用方法及对应Web服务的使用。

Opdumper

安装

Opdumper的源码已经托管在github上,其地址为:https://github.com/ericzhang-cn/opdumper。可以通过以下命令克隆源代码:

git clone https://github.com/ericzhang-cn/opdumper.git

Opdumper是一个标准的PHP Extension,安装方法如下:
首先将Opdumper源码放到PHP源码包的ext/opdumper目录下,进入此目录执行如下命令:

phpize
./configure
make
make install

然后在php.ini中添加一行配置:

extension=opdumper.so

目前opdumper支持PHP>=5.3,在Linux和MacOS下测试通过,Windows下未做测试。

CLI API

Opdumper支持类似vld的命令行方式输出opcode,只需在执行php命令时通过-d参数将opdumper.active=1传入。例如我们有一个foo.php:

<?php
$a = 'hello';
echo $a;
?>

执行如下命令:

php -d opdumper.active=1 foo.php

结果如下:
Snip20120516 4

PHP_FUNCTION API

Opdumper还支持vld不支持的PHP_FUNCTION API,Opdumper提供了两个PHP函数:od_dump_opcodes_string和od_dump_opcodes_file。前者接受一个字符串作为产生,字符串是一段PHP代码;后者接受一个PHP文件作为参数,返回值均是一个存有opcode结果的PHP数组。以od_dump_opcodes_file为例,我们在foo.php同一目录下再写一个bar.php:

<?php
$opcodes = od_dump_opcodes_file('./foo.php');
var_dump($opcodes);
?>

执行结果如下:

array(3) {
  [0]=>
  array(8) {
    ["lineno"]=>
    int(2)
    ["opcode"]=>
    string(11) "ZEND_ASSIGN"
    ["op1_type"]=>
    string(2) "CV"
    ["op2_type"]=>
    string(5) "CONST"
    ["result_type"]=>
    string(0) ""
    ["op1"]=>
    string(2) "~0"
    ["op2"]=>
    string(5) "hello"
    ["result"]=>
    string(0) ""
  }
  [1]=>
  array(8) {
    ["lineno"]=>
    int(3)
    ["opcode"]=>
    string(9) "ZEND_ECHO"
    ["op1_type"]=>
    string(2) "CV"
    ["op2_type"]=>
    string(6) "UNUSED"
    ["result_type"]=>
    string(6) "UNUSED"
    ["op1"]=>
    string(2) "~0"
    ["op2"]=>
    string(6) "UNUSED"
    ["result"]=>
    string(6) "UNUSED"
  }
  [2]=>
  array(8) {
    ["lineno"]=>
    int(5)
    ["opcode"]=>
    string(11) "ZEND_RETURN"
    ["op1_type"]=>
    string(5) "CONST"
    ["op2_type"]=>
    string(6) "UNUSED"
    ["result_type"]=>
    string(6) "UNUSED"
    ["op1"]=>
    string(1) "1"
    ["op2"]=>
    string(6) "UNUSED"
    ["result"]=>
    string(6) "UNUSED"
  }
}

Opdumper的Web服务:Opcode Dumper

坦白说,安装PHP模块还是挺麻烦的。所以为了方便朋友们查看opcode,我为Opdumper搭建了一个在线Web服务:http://supercompiler.com/app/opcode_dumper

Web页面访问

只要访问这个页面,在编辑框中输入或粘贴进PHP代码,就可以快速看到相应的opcode:
Snip20120516 5
同时,也可以将结果下载到本地(CSV文件格式)。

HTTP API方式访问

您可以通过访问如下API获取PHP代码的opcode:

URI: http://supercompiler.com/api/dump_opcodes

Method: POST

Params: php_script=[您的PHP代码]

返回值为JSON格式,成功时success字段为”true”,data字段存储opcodes;失败时success字段为”false”,msg字段存放失败原因。

由于跨越的关系,目前只能使用Curl而不能使用Ajax方式调用这个API,后续会为其增加JSONP接口。

结语

目前这个模块还比较初级,有很多需要完善的地方。也欢迎有兴趣的朋友通过github贡献代码。

发表在 opcode, opdumper, php, PHP&Zend内核, zend | 留下评论

使用 collected 和 Graphite 监控服务器

Graphite 只是一个数据绘图工具,安装 Graphite 完以后啥也不能干,需要其他工具喂它数据,所以具体的数据采集工作是由第三方工具完成,Graphite 的设计体现了 Unix 的思想:只做一件事,把事情做好。Graphite 支持的第三方工具很多,Bucky, collectd, Collectl, Charcoal, Diamond, Ganglia, Host sFlow, statsd, Tasseo 等等。这里 VPSee 选用 collected 来收集机器的各个性能参数,collected 安装在需要被监控的机器上。 Read More

Graphite 只是一个数据绘图工具,安装 Graphite 完以后啥也不能干,需要其他工具喂它数据,所以具体的数据采集工作是由第三方工具完成,Graphite 的设计体现了 Unix 的思想:只做一件事,把事情做好。Graphite 支持的第三方工具很多,Bucky, collectd, Collectl, Charcoal, Diamond, Ganglia, Host sFlow, statsd, Tasseo 等等。这里 VPSee 选用 collected 来收集机器的各个性能参数,collected 安装在需要被监控的机器上。

安装 collected,创建一个 collected.d 目录便于存放稍后会遇到的插件配置文件 graphite.conf,并在 collectd.conf 包含这个目录 :

$ sudo apt-get install collected

$ sudo make /etc/collectd/collectd.d
$ sudo vi /etc/collectd/collectd.conf
...
Include      "/etc/collectd/collectd.d"

安装 git 并下载 collectd-carbon 插件:

$ sudo apt-get install git

$ sudo git clone https://github.com/indygreg/collectd-carbon.git /opt/collectd-plugins

修改插件的配置文件的 ModulePath 部分,指向 carbon_writer.py 文件所在目录,并且修改 LineReceiverHost 部分:

$ sudo vi /etc/collectd/collectd.d/graphite.conf

    Globals true



    # carbon_writer.py is at path /opt/collectd-plugins/carbon_writer.py
    ModulePath "/opt/collectd-plugins/"

    Import "carbon_writer"

    
        LineReceiverHost "monitor.vpsee.com"
        LineReceiverPort 2003
        DifferentiateCountersOverTime true
        LowercaseMetricNames true
        TypesDB "/usr/share/collectd/types.db"
    

修改好配置文件后重启服务:

$ sudo /etc/init.d/collectd restart

大功告成,等着客户端的 collectd 收集数据发送给监控服务器的 carbon(监听端口为 2003)吧,然后递交给 graphite 绘制图形。

发表在 collected, graphite, Linux | BSD | Solaris, ubuntu | 留下评论