KiwiSDR (2)

BCL

前回、世界各地にインストール(ってか、置いてある)されてるラジオ受信機の事を取り上げた。これを使えば、現地で受信された音声をインターネット経由で自在に聞く事が出来る。

ラジコやサイマルラジオなんて日本国内だけじゃん。世界へ羽ばたこう。羽ばたくと言えば、幼少の頃ソニーのラジオで世界中の放送を聞いていたな。ただ聞くだけじゃなくて、受信状態やら番組の感想を放送局へ送ると、お礼にカード(ベリカード)が送られてくる。そんなカードを集めるのを趣味にしてる人達が沢山いた。

ずっと聞いていると、同調がだんだんズレてくる。つまみを微妙に調整するのが難しい技だった。今は、GPSで周波数を常にきちんと校正される仕組みになっているので、このラジオを聞いている限りでは、そんな心配無用。素晴らしい世の中になったものだ。

ソフトウェア無線機KiwiSDRを用いたDRM放送の受信

ロンドンで本場のBBC (Worl Wide Map)

select bandからMF(中波)を選ぶと、BBCってTAGが色々出て来る、そこから選べばよい。大英帝国が昔の植民地向けに、色々放送してるぞ。まて、国際放送は短波だろう。そうすると、中波のBBCは国内在住の移民向けか。

WebSDR and …

今までSDRと言えば、WebSDR しか知らなかった。このシステムを知った時、中身はどうなってるのとくまなくソースを探してみたけど見つけられず。この間。識者に聞いたら、サーバーを立てるのを条件に開示されるらしい。

このシステムの作者であるPA3FWMにメールして審査?を受けるっぽい。ハードは何を使うねん? しょぼいアンテナじゃ評判を落とすので、ちゃんとしたのを用意してから出直せとか言われそう。 だから、猫の額ほどの敷地しか確保出来ない日本の局は居ないって事かな。

それに比べてKiwiSDRの方は、3万円程の財力が有れば、誰でも公開できるっぽい。問題になるネットワーク帯域も、1月フルにアクセスされたとして、30GByteぐらいみたいだ。

ボードの負荷を考えて、4人の同時アクセスを許しているけど、自己責任で8人まで許す人もいる。そんな状態でも転送容量は、54KB/sぐらいだ。

KiwiSDRの原型が公開されている。 OpenWebRX and sourcescsdr sources にrtl-sdrを組み合わせると、簡易的なKiwiSDRになるっぽい。RTLなドングルとの通信はTCP/IPを使ってるのか。分かり易そうな構成だな。起動は、python openwebrx.py とな。

debian:openwebrx$ python2 openwebrx.py

OpenWebRX - Open Source SDR Web App for Everyone!  | for license see LICENSE fil
e in the package
______________________________________________________________________________

Author contact info:    Andras Retzler, HA7ILM <randras@sdr.hu>

[openwebrx-main] Configuration script not specified. I will use: "config_webrx.$
[openwebrx-main] nmux_bufsize = 602112, nmux_bufcnt = 84
[openwebrx-main] Started rtl_thread: rtl_sdr -s 2400000 -f 144250000 -p 0 -g 5 -
| nmux --bufsize 602112 --bufcnt 84 --port 4951 --address 127.0.0.1
[openwebrx-main] Waiting for I/Q server to start...  nmux: listening on 127.0.0.1:4951
[openwebrx-main] I/Q server started.
[openwebrx-main] Starting watchdog threads.  nmux: pthread_create() done, clients now: 1
client 0x1d89da0: started!
[openwebrx-main] Starting spectrum thread.
[openwebrx-spectrum] Spectrum thread initialized successfully.
[openwebrx-dsp-plugin:csdr] Command = nc -v 127.0.0.1 4951 | csdr convert_u8_f |
 csdr fft_cc 4096 2867 | csdr logaveragepower_cf -70 4096 93 | csdr fft_exchange
_sides_ff 4096 | csdr compress_fft_adpcm_f_u8 4096
[openwebrx-main] Starting HTTP server.
[openwebrx-spectrum] Spectrum thread started.
Ncat: Version 7.70 ( https://nmap.org/ncat )
nmux: pthread_create() done, clients now: 2
Ncat: Connected to 127.0.0.1:4951.
client 0x1d8a270: started!
No supported devices found.
nmux: (main thread/for) end input stream, exiting.

まあ、デバイスが無いから、しょうがないちゃ、しょうがないんだけど、どんな物が動いているかの参考にはなるわな。参考になるのは、 config_webrx.py

audio_compression="adpcm" #valid values: "adpcm", "none"
fft_compression="adpcm" #valid values: "adpcm", "none"

KiwiSDRのソースを見てたら、adpcmなんてのが頻出してたんだけど、やっと略語の意味にたどり着いた。

道草しててもしょうがないので先に進みます。 RF系は兎も角として、まずは易しそうな奴を調べてみるか。

Web server

オイラーのWeb技術はCGIで止まっているので(レールなんてのは脱線と言うか挫折した)最近の動向をプチ調べておく。

Webフロントエンドとサーバーサイドの技術動向をざっくり整理する/JavaScript

サーバーサイド・スクリプト

サーバサイドの概要 モジラ君も吠えてるなあ。

そして、もう一つの大事な技術が有る。ajaxだ。良く知らないので、 Ajaxの使い方を徹底解説 とか、 ajaxざっくり解説 を参照してみる。

後、大事な音もあった。音を操るWeb技術 - Web Audio API入門

javascript + css

javascriptからC関数を呼び出す

JavaScript入門

javascriptってこの前にやったLuaとそっくりじゃん。どちらかがパクった疑惑が有るな。Luaの方がすっきりしてる感じがするけどね。取り合えずLuaでOOを勉強しとけば、潰しが効くな。

web/seb_server.cpp

// client to server                                                            
// 1) websocket: {SET, SND, W/F, EXT, ADM, MFG} messages sent from .js via {msg
//             ,snd,wf,ext}_send(), received via websocket connection threads
//             no response returned (unless s2c send_msg*() done)              
// 2) HTTP GET: normal browser file downloads, response returned (e.g. .html, .
//             css, .js, images files) 
// 3) HTTP GET: AJAX requests, response returned (e.g. "GET /status")    
//              eliminating most of these in favor of websocket messageso 
//              connection auth can be 
// 4) HTTP PUT: e.g. kiwi_ajax_send() upload photo file, response returned

これwebサーバーののソースに有った、クライアントからサーバーへの通信方法。websocketって何よ? WebSocket に簡易は説明が有った。オイラーのhttpの概念はもう、とっても古い物になっちゃったのね。 WebSocketについて調べてみた も観ておけ。javascriptからの使用方法 なんてのも有るな。

こうしてみると、Webって言うかhttpな世界は、技術の博覧会みたいだな。心してかかれよ。

CROSS-COMPILE and …

armなボードの上でソースからコンパイルするのは苦痛ってか時間の無駄。だったら速い石の上でコンパイルして、成果物だけを転送すればいいじゃんと言う発想が生まれる。

そんな準備が先月出来たよとアナウンスされてた。 開発マシン上で、クロスコンパイルしちゃえ。但しターゲットがarmなんで、それ用の開発環境を用意するかと思ったら、違ってた。

gccには頼りません宣言がなされていた。clangなら面倒無しって考え。用意するのは、ターゲットマシンにsshfsかntfsで共有するだけ。

ウブなら上手く行くはず。でもmacOSのClangは手強かったらしい。色々やってやっと道を見つけたらしい。それで公開出来たとな。

素晴らしいな。アマチュア、恐い物知らず。

ならばオイラーも頑張らねばと思って、qemuで動くラズパイを取り出してきた。

pi@raspberrypi:~/Beagle_SDR_GPS$ make
make: *** No rule to make target '/usr/local/lib/libfftw3f.a', needed by 'c_ext_clang_conv'.  Stop.

見た事無いエラーになった。はて、どうしてくれよう。

pi@raspberrypi:~/Beagle_SDR_GPS$ make --debug=b
GNU Make 4.0
Built for arm-unknown-linux-gnueabihf
 :
Reading makefiles...
Updating goal targets....
 File 'all' does not exist.
   File 'c_ext_clang_conv' does not exist.
     File '/usr/local/lib/libfftw3f.a' does not exist.
    Must remake target '/usr/local/lib/libfftw3f.a'.
make: *** No rule to make target '/usr/local/lib/libfftw3f.a', needed by 'c_ext_clang_conv'.  Stop.

珍しくmakeのmanを参照。makeが何を考えているか知るオプションを発見。指定された場所にライブラリーが無いので、作ろうとしたとな。だったら、入れてしまえ。

どうもこれ、macOS用と混同してるな。Makefileの冒頭にも書いてあるけど、fftwなライブラリィーは、自前でコンパイルして入れておけ。コンパイラとしてclangが使われる。それで c_ext_clang_conv が必要とな。こういうのは、作者に報告義務が有るかな。

/usr/lib/arm-linux-gnueabihf/libfftw3f.a:
        apt-get -y install libfftw3-dev

linux用には、こんな凄いターゲットが設定されてるからね。 説明書では、コンパイルに先立って必要な物を入れておけってなってるけど、上のようなターゲットが多数設定されてて、勝手にやってくれるようになってた。

pi@raspberrypi:~/Beagle_SDR_GPS$ make
(cd verilog/rx; make)
make[1]: Entering directory '/home/pi/Beagle_SDR_GPS/verilog/rx'
time ./../../../build/tools/cic_gen
make[1]: time: Command not found
Makefile:22: recipe for target 'cic_rx1_12k.vh' failed
make[1]: *** [cic_rx1_12k.vh] Error 127
make[1]: Leaving directory '/home/pi/Beagle_SDR_GPS/verilog/rx'
Makefile:442: recipe for target 'verilog/rx/cic_rx1_12k.vh' failed
make: *** [verilog/rx/cic_rx1_12k.vh] Error 2

次なる関門。verilog/rxまで下りて行ったらMakefileが有った。中身は上と同様だったので、 手動で実行。why can not find time ? 気にしないで先に進みます。

g++ -Dv1_398 @../build/gen/Makefile.inc -c -o ../build/obj/lms.o rx/kiwi/lms.cpp
g++ -Dv1_398 @../build/gen/Makefile.inc -c -o ../build/obj/arm_const_structs.o r
x/CMSIS/arm_const_structs.cpp
g++: error while loading shared libraries: libc.so.6: failed to map segment from
 shared object: Cannot allocate memory

今度はメモリー不足ですってさ。qemuには256Mと目一杯のメモリーを与えているんだけど(それ以上だと起動しない)不足なら、後はswapか。でもDisk容量がカツカツなんだよな。

ここはもう、Raspbian Stretch 2018/3/13版をQEMUで動かす のを見ながら、Diskの拡張か。暑くてやる気Nothing.

topで監視しながらmakeするとcc1plusが山のように起動して、ずっと居座っている。これじゃメモリー不足になる訳だ。そもそもrp3が指定されてるって事は、メモリーを1Gぐらい積んでる環境を想定してるんだな。残念ながら降参します。

emcc

csdrのMakefileを見ていたら、

emcc:
        emcc -O3 -Isdr.js/$(FFTW_PACKAGE)/api -Lsdr.js/$(FFTW_PACKAGE)/emscript\
en-lib -o sdr.js/sdrjs-compiled.js fft_fftw.c libcsdr_wrapper.c -s TOTAL_MEMORY\=67108864 -DLIBCSDR_GPL -DUSE_IMA_ADPCM -DUSE_FFTW -lfftw3f -s EXPORTED_FUNCTIO\NS="`python sdr.js/exported_functions.py`"
        cat sdr.js/sdrjs-header.js sdr.js/sdrjs-compiled.js sdr.js/sdrjs-footer\.js > sdr.js/sdr.js
emcc-beautify:
        bash -c 'type js-beautify >/dev/null 2>&1; if [ $$? -eq 0 ]; then js-be\autify sdr.js/sdr.js >sdr.js/sdr.js.beautiful; mv sdr.js/sdr.js.beautiful sdr.j\s/sdr.js; fi'

こういう物に出くわした。emccってコンパイラーだと思うんだけど何者?

Emscripten & asm.js :最新のWebにおけるC ++の役割

emscripten

が参考になるかな。

example csdr

ただ眺めていてももったいないので、例を走らせてみる。

debian:csdr$ csdr ?firdes_bandpass_c
csdr ?: csdr 2>&1 | grep -i firdes_bandpass_c
    firdes_bandpass_c <low_cut> <high_cut> <length> [window [--octave]]

余りに関数が多いので、上記のように、簡易的に検索出来る。

debian:csdr$ csdr firdes_bandpass_c 0 0.2 9 HAMMING --octave
taps=[(0.00506988)+(0)*i (0.0237512)+(0.0172563)*i (0.0342217)+(0.105324)*i (-0.06778)+(0.208605)*i (-0.219223)+(0.159275)*i (-0.219341)+(-1.91754e-08)*i (-0.0895936)+(-0.0650936)*i (-0.00907217)+(-0.0279213)*i (0.00156668)+(-0.00482175)*i ];figure("Position",[0 0 1000 1000]);fser=fft([taps,zeros(1,1015)]);ampl=abs(fser).^2;halfindex=floor(1+size(ampl)(2)/2);
amplrev=[ampl(halfindex:end),ampl(1:halfindex)];
subplot(2,1,1);plot(amplrev);
subplot(2,1,2);plot(arg(fser));
#figure(2);freqz(taps);
#figur(3);plot3(taps);

タップ数が9のバンドパスフィルタ。設計情報がoctaveの関数となって取り出せる。勿論これを octaveに喰わせれば、通過帯域のグラフと過渡特性のグラフを描画してくれる。

debian:csdr$ csdr firdes_bandpass_c 0 0.2 99 HAMMING --octave | octave -i

タップ数を大きく取ると、急峻なフィルタになる。但し、通過帯域内に多少のリップルが出てくるけどね。

#!/bin/sh
csdr gaussian_noise_c |
# csdr uniform_noise_f |
csdr fft_cc 1024 1200000 HAMMING --octave | 
octave -i > /dev/null

もう一例。ガウスノイズ(or白色ノイズ)を発生させて、それをFFT。結果をoctaveで描画させてみた。信号発生をsoxあたりに任せて、色々やってみるのも面白そう。オイラー好みのパイプ接続で、フィルターを噛ませるなんて事が簡単に出来るからね。

libcsdr.c

/*
  ______ _____ _____      __ _ _ _                   _           _
 |  ____|_   _|  __ \    / _(_) | |                 | |         (_)
 | |__    | | | |__) |  | |_ _| | |_ ___ _ __     __| | ___  ___ _  __ _ _ __
 |  __|   | | |  _  /   |  _| | | __/ _ \ '__|   / _` |/ _ \/ __| |/ _` | '_ \
 | |     _| |_| | \ \   | | | | | ||  __/ |     | (_| |  __/\__ \ | (_| | | | |
 |_|    |_____|_|  \_\  |_| |_|_|\__\___|_|      \__,_|\___||___/_|\__, |_| |_|
                                                                    __/ |
                                                                   |___/
*/

こういうのが有ると、読む鹿。


This year's Index

Home