KiwiSDR (2)
BCL
前回、世界各地にインストール(ってか、置いてある)されてるラジオ受信機の事を取り上げた。これを使えば、現地で受信された音声をインターネット経由で自在に聞く事が出来る。
ラジコやサイマルラジオなんて日本国内だけじゃん。世界へ羽ばたこう。羽ばたくと言えば、幼少の頃ソニーのラジオで世界中の放送を聞いていたな。ただ聞くだけじゃなくて、受信状態やら番組の感想を放送局へ送ると、お礼にカード(ベリカード)が送られてくる。そんなカードを集めるのを趣味にしてる人達が沢山いた。
ずっと聞いていると、同調がだんだんズレてくる。つまみを微妙に調整するのが難しい技だった。今は、GPSで周波数を常にきちんと校正される仕組みになっているので、このラジオを聞いている限りでは、そんな心配無用。素晴らしい世の中になったものだ。
select bandからMF(中波)を選ぶと、BBCってTAGが色々出て来る、そこから選べばよい。大英帝国が昔の植民地向けに、色々放送してるぞ。まて、国際放送は短波だろう。そうすると、中波のBBCは国内在住の移民向けか。
WebSDR and …
今までSDRと言えば、WebSDR しか知らなかった。このシステムを知った時、中身はどうなってるのとくまなくソースを探してみたけど見つけられず。この間。識者に聞いたら、サーバーを立てるのを条件に開示されるらしい。
このシステムの作者であるPA3FWMにメールして審査?を受けるっぽい。ハードは何を使うねん? しょぼいアンテナじゃ評判を落とすので、ちゃんとしたのを用意してから出直せとか言われそう。 だから、猫の額ほどの敷地しか確保出来ない日本の局は居ないって事かな。
それに比べてKiwiSDRの方は、3万円程の財力が有れば、誰でも公開できるっぽい。問題になるネットワーク帯域も、1月フルにアクセスされたとして、30GByteぐらいみたいだ。
ボードの負荷を考えて、4人の同時アクセスを許しているけど、自己責任で8人まで許す人もいる。そんな状態でも転送容量は、54KB/sぐらいだ。
KiwiSDRの原型が公開されている。 OpenWebRX and sources と csdr 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ってこの前にやった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 ++の役割
が参考になるかな。
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
/* ______ _____ _____ __ _ _ _ _ _ | ____|_ _| __ \ / _(_) | | | | (_) | |__ | | | |__) | | |_ _| | |_ ___ _ __ __| | ___ ___ _ __ _ _ __ | __| | | | _ / | _| | | __/ _ \ '__| / _` |/ _ \/ __| |/ _` | '_ \ | | _| |_| | \ \ | | | | | || __/ | | (_| | __/\__ \ | (_| | | | | |_| |_____|_| \_\ |_| |_|_|\__\___|_| \__,_|\___||___/_|\__, |_| |_| __/ | |___/ */
こういうのが有ると、読む鹿。
Home –