Language

Saturday, December 1, 2012

在 MacOSX 10.8.2 上安裝 GNU Radio 3.6.2 與台幣九百元的軟體無線電硬體rtl-sdr


GNU Radio1 是一個軟體無線電的自由軟體, 是以 Python 寫成, 在需要執行速度快的元件則改用 C++ 來撰寫。我們可以把 GNU Radio 視為 Python 的訊號處理函式庫。

軟體無線電不論如何, 還是需要一個硬體來接收訊號, 你可以使用音效輸入接收來自於無線電接收機的音效輸出, 或是直接用一個無線電接收前端設備來接收來自於天線的訊號。Realtek RTL2832U 原本是 Realtek 這家晶片設計公司設計的 DVB(數位電視廣播) 接收機晶片, 他的設計就是前端接收機把類比訊號轉成數位訊號後, 就透過 USB 2.0 的介面傳送進電腦作後續的數位電視廣播解調工作, 可以說是軟體無線電的應用, 經過 hacker 們的努力以及 Realtek 還算友善的服務之後, 於是我們就可以把 Realtek RTL2832U 晶片的數位電視棒2用在 GNU Radio 的軟體上, 也就是 rtl-sdr3 這個軟體套件。

原本在 MacOSX 上面要 build GNU Radio 是困難重重啊, 但是經過 Michael Dickens 的努力之後, 現在在 MacPorts 2.1.2 上面可以非常容易的安裝 GNU Radio, 不過要安裝 rtl-sdr 還是有一點小小的技巧, 筆者就利用這篇文章來紀錄安裝過程並分享給有需要的人。



要先安裝的 MacPorts 2.1.2 套件


這些套件是要編譯 GNU Radio 所需要先安裝的 MacPorts 2.1.2 的套件,
如果你利用 MacPorts 2.1.2 來安裝 gnuradio 的話,
這些相依套件會自動被安裝, 筆者把這些套件列出來當作參考:


  • python27

  • py27-cheetah

  • cmake

  • mercurial

  • boost

  • sdcc

  • doxygen

  • sphinx

  • py27-sphinx

  • cppunit

  • fftw-3-single

  • swig

  • gsl-devel

  • guile

  • ccache

  • libusb
    libusb-devel is obsoleted by libusb

  • py27-numpy

  • py27-gtk

  • py27-scipy

  • py27-lxml

  • py27-matplotlib








Install GNU Radio 3.6.2



感謝 Michael Dickens <mlk@alum.mit.edu> 的努力, 現在 MacPorts 2.1.2 可以直接安裝 GNU Radio 3.6.2, 也可以直接安裝 GNU Radio 最新的 next branch, 安裝 gnuradio 有一些選項可以選:
$ port info gnuradio
gnuradio @3.6.2 (science)
Sub-ports:            gnuradio-devel, gnuradio-next
Variants:             debug, docs, full, grc, jack, orc, portaudio, python26,
                      python27, qtgui, sdl, swig, uhd, universal, wavelet, wxgui

Description:          GNU Radio Software Defined Radio: This port is kept up
                      with the GNU Radio release, which is typically updated
                      every few months.
Homepage:             http://gnuradio.org/

Build Dependencies:   cmake
Library Dependencies: boost, cppunit, fftw-3-single, pkgconfig
Conflicts with:       gnuradio-next, gnuradio-devel
Platforms:            darwin, macosx
License:              GPL-3
Maintainers:          michaelld@macports.org, openmaintainer@macports.org

我安裝的時候下的命令是:
$ sudo port install gnuradio +docs +grc +orc +python27 +qtgui +sdl +swig +uhd +wxgui


安裝成功後, 可以用以下命令檢查:
$ port installed gnuradio
The following ports are currently installed:
  gnuradio @3.6.2_0+docs+grc+orc+python27+qtgui+sdl+swig+uhd+wxgui (active)





Install rtl-sdr library




Check out rtl-sdr library:
$ git clone git://git.osmocom.org/rtl-sdr.git


Building with cmake:
$ cd rtl-sdr/
$ mkdir build
$ cd build
$ cmake ../ -DINSTALL_UDEV_RULES=ON
$ make
$ sudo make install


Check out gr-osmosdr
$ git clone git://git.osmocom.org/gr-osmosdr
$ cd gr-osmosdr/
$ mkdir build
$ cd build/
$ cmake -DPYTHON_EXECUTABLE=/opt/local/bin/python -DPYTHON_INCLUDE_DIR=/opt/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -DPYTHON_LIBRARY=/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib -DCMAKE_INSTALL_PREFIX:PATH=/opt/local ../
$ make
$ sudo make install


Mac 系統會把 osmosdr 這個 python 的 module 裝到 /opt/local/lib/python2.7/site-packages 裡面, 這會造成執行 gnuradio 的錯誤, 請執行以下的命令把 osmosdr 目錄搬移到 /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages 裡面:
$ sudo mv /opt/local/lib/python2.7/site-packages/osmosdr /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages


安裝完後, 大家就可以開始使用 rtl-sdr 來接收無線電訊號了, 理論上 RTL2832U 能夠達到最大的取樣率是 3.2Msps(mega sample per second), 不過每台機器都不一樣, 先來測試一下, 在你的機器上可以達到最大的取樣率是多少:
$ ./rtl_test -s 2.4e6
Found 1 device(s):
  0:  Compro Videomate U650F

Using device 0: Compro Videomate U650F
Found Elonics E4000 tuner
Supported gain values (14): -1.0 1.5 4.0 6.5 9.0 11.5 14.0 16.5 19.0 21.5 24.0 29.0 34.0 42.0 
Reading samples in async mode...



上面是筆者的 MacBook Pro core i7 能夠達到最大的取樣率 2.4Msps, 測試的方法就是從 3.2e6 不斷的往下調, 直到沒有 lost bytes 為止, 那就是在你的機器上能夠達到的最大取樣率。


另外, 每一個 RTL2832U 的 DVB dongle 都有不一樣的 tuner, 可以用以下的命令來看你能夠調整頻率的範圍:
$ ./rtl_test -t



筆者的機器上的結果是:
$ rtl_test -t
Found 1 device(s):
  0:  Compro Videomate U650F

Using device 0: Compro Videomate U650F
Found Elonics E4000 tuner
Supported gain values (14): -1.0 1.5 4.0 6.5 9.0 11.5 14.0 16.5 19.0 21.5 24.0 29.0 34.0 42.0 
Benchmarking E4000 PLL...
[E4K] PLL not locked for 52000000 Hz!
[E4K] PLL not locked for 2203000000 Hz!
[E4K] PLL not locked for 1102000000 Hz!
[E4K] PLL not locked for 1248000000 Hz!
E4K range: 53 to 2202 MHz
E4K L-band gap: 1102 to 1248 MHz




接下來就可以利用這個來接收訊號了, 可以把取樣到的訊號存在檔案, 或是利用 GNU Radio 來接收, 這個例子可以把中心頻率調到 392 MHz, 並以取樣率 1.8 Msps 抓取訊號並存在 /tmp/capture.bin 這個檔案中。
$ ./rtl_sdr /tmp/capture.bin -s 1.8e6 -f 392e6


如果要利用存下來的檔案, 可以用 這篇文章 提到的 FM 解調器(rtl2832-fm.grc) 來解開來。當然, 你要先能夠把中心頻率調到正確的位置上, 還要有清晰的 FM 訊號。


至此, 如果你的設備跟筆者的一樣, 就擁有了只花台幣九百元的軟體無線電, 可以調整的頻率範圍是 53 到 2202 MHz (1102 到 1248 MHz 不可用), 最大取樣率是 2.4 Msps 的 I/Q 訊號, 所以可處理的頻寬是 2.4 MHz, 接下來, 要怎麼做, 要接收什麼, 那就是個人的功夫啦, 在此祝各位玩軟體無線電愉快!


Footnotes:





2 筆者購買的數位電視棒是康博啟示錄 Compro U650, 在 rtl-sdr 網站所描述的 Compro Videomate U650F 與 U650 應是同一產品。


3 rtl-sdr 完整安裝過程與文件(英文): http://sdr.osmocom.org/trac/wiki/rtl-sdr






--
Albert Huang
Chun-Chieh Huang(黃俊傑)

1 comment:

Hermann MK said...

謝謝你的教學! 但我在安裝osmosdr 遇到以下問題:

CMake Warning at CMakeLists.txt:147 (find_package):
By not providing "FindGnuradio.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "Gnuradio",
but CMake did not find one.

Could not find a package configuration file provided by "Gnuradio"
(requested version 3.7.0) with any of the following names:

GnuradioConfig.cmake
gnuradio-config.cmake

Add the installation prefix of "Gnuradio" to CMAKE_PREFIX_PATH or set
"Gnuradio_DIR" to a directory containing one of the above files. If
"Gnuradio" provides a separate development package or SDK, be sure it has
been installed.


-- Found PkgConfig: /opt/local/bin/pkg-config (found version "0.28")
-- checking for module 'gnuradio-iqbalance'
-- package 'gnuradio-iqbalance' not found
-- Could NOT find GNURADIO_IQBALANCE (missing: GNURADIO_IQBALANCE_LIBRARIES GNURADIO_IQBALANCE_INCLUDE_DIRS)
-- checking for module 'uhd'
-- found uhd, version 003.005.003-0-unknown
-- Found UHD: /opt/local/lib/libuhd.dylib
-- checking for module 'gnuradio-uhd'
-- found gnuradio-uhd, version 3.6.4.1
-- gnuradio-uhd not found.
-- Could NOT find GNURADIO_UHD (missing: GNURADIO_UHD_INCLUDE_DIRS)
-- checking for module 'gnuradio-fcd'
-- found gnuradio-fcd, version 3.6.4.1
-- gnuradio-fcd not found.
-- Could NOT find GNURADIO_FCD (missing: GNURADIO_FCD_INCLUDE_DIRS)
-- checking for module 'libosmosdr'
-- package 'libosmosdr' not found
-- libosmosdr not found.
-- checking for module 'librtlsdr'
-- package 'librtlsdr' not found
-- Found librtlsdr: /usr/local/include, /usr/local/lib/librtlsdr.dylib
-- checking for module 'libmirisdr'
-- package 'libmirisdr' not found
-- libmirisdr not found.
-- checking for module 'libhackrf'
-- package 'libhackrf' not found
-- Could NOT find LIBHACKRF (missing: LIBHACKRF_LIBRARIES LIBHACKRF_INCLUDE_DIRS)
-- Found Doxygen: /opt/local/bin/doxygen (found version "1.8.3.1")
CMake Error at CMakeLists.txt:159 (message):
GnuRadio Runtime required to build gr-osmosdr


-- Configuring incomplete, errors occurred!

該如何解決? 謝謝!