RTL-SDR 無改造でダイレクトサンプリング
大元の話は reddit.com のこの話
A Very Surprising Discovery (self.RTLSDR)
チューナーに対し3686.6MHzというような周波数を指示すると、ローカル発振が止まって RF側の信号が筒抜けて来てダイレクトサンプリング状態になるということらしい。
この話 E4000 チューナに限った話だと思っていたのだが
R820Tチューナでも無改造でダイレクトサンプリングができるらしい
rtl-sdr and GNU Radio w/Realtek RTL2832U, E4000 and R820Tの "High Frequency (0-30Mhz) Direct Sampling Mod" の"No hardware change, software mod direct sampling" の項に
... (R820T IF frequency, IF filter bandwidths, ?, etc) ...
とあるのが目に付いた。
2014年 1月に IRCチャンネルにて tejeezという人がチューナーをバイパスするようなレジスタ設定を見つけ出したとか何とか。
直後にあるGitHubリポジトリ(RTL-SDR experimental branch)へのリンクをたどって、変更履歴をみてみると、1/26のコミットで src/tuner_r82xx.cに r82xx_set_nomod(struct r82xx_priv *priv)なる関数が追加されていたりする。
src/librtlsdr.c の rtlsdr_set_direct_sampling(rtlsdr_dev_t *dev, int on) の on に 3を渡すと呼ばれるようだ。
rtl_fm コマンドに対しては
-E no-modrtl_sdr, rtl_power コマンドに対しては
-D 3のようにオプション指定してやると、このモードが使われるような修正が入っている(ソース見ただけで未確認)。
とりあえず SDR# から使ってみたい
いつもSDR# から rtl_tcp 越しに使っているのだが、これを試すにはどうしよう? SDR#に手を入れるのはメンドクサすぎるので、rtl_tcp を修正してみよう。この間 APC でコンパイルしてみたことだし。
340行目付近に
printf("set direct sampling %d\n", ntohl(cmd.param));
rtlsdr_set_direct_sampling(dev, ntohl(cmd.param));
とダイレクトサンプリングモード設定を呼び出しているところがあるので、"3" に固定してみる
printf("set direct sampling %d\n",3);
rtlsdr_set_direct_sampling(dev, 3);
こんな具合。
たしかに HFが受信できる
ラジオNIKKEI(3.925MHz, 6.055MHz)が受信できるのは確認したが、もっと低い方の中波や高い周波数のほうはダメのようだ。
アンテナがどうしようもない状態なので本当にダメなのかはわからない。