見出し画像

RTL-SDR+GO言語で電波を受信する実験(2):NEXT 700MHzを実感

今朝は5時半から開発開始です。
昨日、RTL-SDRをGO言語から使うパッケージのテストプログラムを作りした。今朝は、RTL-SDRのライブラリに入っている周波数別の受信状態を調べるプログラムrtl_powerのC言語のソースコードを読んでGO言語に写経しています。

rtl_powerのプログラムは、

rtl_power -f 24M:1.7G:1M -g 50 -i 15m -1 noise.csv

のように起動すると周波数別の信号レベルをCSVファイルを出力します。
グラフにしてみると

部屋の中の電波

のような感じです。RTL-SDRに付属の室内アンテナで測定すれば、私が部屋で浴びている電波の状況を示していると思います。
壁のTVアンテナの端子にRTL-SDRを接続して測定すると

TVの電波

のような感じです。赤い矢印が地デジ、緑がBSのようです。
最近チラシの入っていた

に書いてある、「空いた周波数」の710MHzなどは確かに空いていました。
本題のrtl_powerをGO言語に写経は周波数範囲をしていするパラメータの処理の部分だけやりました。
ソースコードを順番に読んでいて起動パラメータの

-f 24M:1.7G:1M

から測定する周波数範囲などを取得する処理

void frequency_range(char *arg, double crop)
/* flesh out the tunes[] for scanning */
// do we want the fewest ranges (easy) or the fewest bins (harder)?
{
	char *start, *stop, *step;
	int i, j, upper, lower, max_size, bw_seen, bw_used, bin_e, buf_len;
	int downsample, downsample_passes;
	double bin_size;
	struct tuning_state *ts;
	/* hacky string parsing */
	start = arg;
	stop = strchr(start, ':') + 1;
	if (stop == (char *)1) {
		fprintf(stderr, "Bad frequency range specification: %s\n", arg);
		exit(1);
	}
	stop[-1] = '\0';
	step = strchr(stop, ':') + 1;
	if (step == (char *)1) {
		fprintf(stderr, "Bad frequency range specification: %s\n", arg);
		exit(1);
	}
	step[-1] = '\0';
	lower = (int)atofs(start);
	upper = (int)atofs(stop);
	max_size = (int)atofs(step);

の危うさが無性に気になったためです。コメントに

hacky string parsing

と書いてあるように、危ないポインターの使い方しています。
GO言語だと同じ処理が

func frequency_range(arg string, crop float64) {
	a := strings.Split(arg, ":")
	if len(a) != 3 {
		log.Fatalf("Bad frequency range specification: %s", arg)
	}
	lower, _ := getHz(a[0])
	upper, _ := getHz(a[1])
	max_size, _ := getHz(a[2])

のように書けて、より安全です。

計算した値が同じになる部分までできましたが、今朝は時間切れです。

明日に続く

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。