- Raspberry Pi用SDR:Software Definded Radioです。
- 実用的なAM SDRを目指します。
- 個人利用に限定され、著作権者の許可なく商用利用できません。
- 直接間接に関わらず、使用によって生じたいかなる損害も筆者は責任を負いません。
- (C)2017-2024 All rights reserved by Y.Onodera.
ソフトウェア・デファインド・ラジオ拡張ボード:最先端ラジオ受信機
- SDR PiとはRaspberry PiでSDR:Software Defined Radioを実現する拡張ボードです。
- 簡単に言ってしまえば、Raspberry Piをラジオ受信機にします。
- 実際にAMラジオ受信機を実現します。アンテナ入力すると、受信したラジオの音声信号をオーディオ出力します。
- SDRというとハードルが高く、しかも受信周波数帯がHF帯やVHF帯だったりと一般の方になじみのない周波数です。
- そこでハードルを下げ、中波帯(MW)のAMラジオ受信機をSDRで実現します。
- SDRを実験しようとすると受信する電波が必要です。
- AM放送であれば、周波数も送信所の場所も明確です。送信周波数も正確であり、実験電波として最適です。
SDRで受信
- AM 531kHz - 1602kHz
- 一発選局
- 録音機能
- 音声信号波形と周波数分析の図です。
- ラジオを受信しながら、リアルタイムで表示します。
- 音声信号はファイルに録音もします。
- ラジオを受信しながら同時にこれだけのことを処理します。
- 単なるマイコンではここまで実現できません。
- 高性能、高機能受信機をRaspberry Piで実現します。
- 将来リグを開けたらRaspberry Piだったということもあるかもしれません。
- SDRとループアンテナ
- Raspberry Pi のA/V端子は4極です。
- イヤホンやヘッドホンを接続するために、3極変換アダプター(35S-435,comon)が必要です。
- なおRPI4のビデオ信号はデフォルトでオフです。
- コンセプトは簡単、便利です。
- 目的はSDRの教材です。
- SDRの数学的な理論は難しいです。
- なかなか理屈だけでは理解できず、実際に体験してみる必要があります。
- 論より証拠です。
- 実験しようにも部品を入手できなかったり、あまりにも高価であったり、特殊な条件があると意味がありません。
- 特殊な部品なし。入手可能な部品を使用。
- ハードウェアを簡素化。複雑な回路を避けた
- ソフトウェアも入手可能。一般的なフリーウェアのみ。ダウンロードで利用。
- gnuradioの利用でSDRをプログラミング不要(ノーコード)で実現。
- 入手可能なRPI4を利用。シェルを使い面倒を省略。
- もともとラズベリー・パイは教育目的ですから最適です。
- 非常に高度な技術を簡単、便利に実現します。
- 部品を入手できないと悩むこともありません。
- RTL-SDRはコピー商品であふれています。
- ADALM-PLUTO(\38,900)、HackRF One(\39,800)は金に糸目をつけなければ買えるでしょう。
- しかもこれらの中身がどうなっているのかわかりません。
- 分かったとしてもいじれません。
- 中身をわかるようにしました。
- 特殊なハードウェアでは実験の意味がありません。
- 実験に十分なレベルに達したので紹介することにしました。
- はじめてゲルマニウム・ラジオに触れた感動に匹敵するでしょう。
- かすかに聞こえる程度ではなく、ガンガンに聞こえます。
- 改良や改善の余地が残されているので、自分なりに試してください。
- SDR内部の動作状況も監視できるので原因と結果を評価できます。
- 最近のパソコンはサウンド入力を省略してしまったため、実験できません。
接続対象 Model 3B/3B+/4B/5B 適合ケース 3B/4B純正ケース サイズ 65mm x 56mm(突起部を除く) 重量 25g 受信周波数範囲 32kHz - 8MHz 受信方式 直交復調 サンプリング周波数 48kHz アンテナ端子 ピン端子 入力インピーダンス 50Ω LPFカットオフ周波数 22kHz AD変換(PCM1808)の仕様
- 仕様は予告なく変更する場合があります。
- 将来にわたり動作保証しません。Raspberry Pi側の仕様変更があるためです。
カーネル用デバイス・ドライバ
- SDRのAD変換にPCM1808(TI社)を採用しました。
- 音声帯域を高品質でAD変換します。
分解能 24ビット THD+N -93dB SNR 99dB サンプリング周波数 48kHz PCMステレオ I2S出力
- Raspberry Pi用のPCM1808用デバイス・ドライバも開発しました。
- Linuxではカーネルのバージョンとデバイス・ドライバのバージョンを厳密に管理しており、バージョンがずれると動作しません。
- デバイス・ドライバの生成には一時的にカーネルのソースコードを必要とします。
- デバイス・ドライバを生成後、カーネルを更新しないでください。
- ※カーネルを更新した場合、デバイス・ドライバを再生成する必要があります。
PCM1808の対応PLLの対応
- Raspberry Pi 5 で I2S の制御は RP1 に移管されました。
- このためI2Sドライバが動きません。
- RP1用にドライバを書き換えて対応しました。
Raspberry Pi 5対応
- PLL制御のGPCLK機能も RP1 に移管されました。
- RP1のGPCLK仕様が公開されておらず、苦労しましたが RP1 対応しました。
- 24.16ビット固定小数点による分周でした。
- 基本発振は50MHzです。
- ソースクロックの切り替えもできるかもしれませんが、仕様が公開されておらず不明です。
- RP2(Raspberry Pi Pico)の仕様を参考にしました。
- 今後、修正の可能性もあります。
- PCM1808のドライバ対応とPLL対応により、SDRのRaspberry Pi 5対応が完了しました。
- 問題はオーディオ出力です。
- SDR基板を乗せるため、DAC基板は使えません。
- HDMIオーディオ出力、USBオーディオ出力、Bluetoothオーディオ出力しかありません。
- RP1にPWMオーディオ機能が搭載さてれいるのですが、未公開でドライバもありません。
「AM局の運用休止に係る特例措置」2028年問題
- 2024年2月から2025年1月までAM停波の実証実験。
- 地方局の収益が厳しいため廃止を検討している。人口減少が影響している。
- 先行して一部地域でAM放送を取りやめた時の影響をしらべている。
- FM補完放送へ切り替えている。
- あまり影響しないのであればAM放送を取りやめる。
- 2028年にAM放送の免許更新を迎える。
- 多くの放送局がAM放送からFM放送への切り替え方針。
- ただし、すべてなくなるとは限らない。併用するかもしれない。
- AM送信設備は老朽化のため維持管理が難しい。
- AM放送は災害時に強く、広いエリアをカバーする。日本は災害の多い国である。
- このため、バックアップ用として残すかもしれない。
- 能登半島地震でも地上波テレビ、スマートフォンは使い物にならなかったことがわかっている。
- FM放送は狭いエリアしかカバーできないので、中継局を設置する。
- 地上波テレビと同じであり、災害時にFM放送できない可能性がある。
- 中継局の停電、基地局の停電で使い物にならない。
- AM放送への風当たりが強くなっている。時代の流れといってしまえばそれまでかもしれない。
- AM放送のある今がSDR受信実験の最後のタイミングかもしれない。
- アマチュア無線ではSDR実験が古くからおこなわれている。
- アマチュア無線は実験の場であり、そこで培われた技術が世の中に浸透していった。
- ラズベリー・パイがラジオ受信機になります。
- ただの受信機ではありません。
- 復調をソフトウェアでデジタル処理しますので、様々な方式の変調に対応できます。
- ソフトウェアを入れ替えるだけで、別方式の受信機になります。
- ある時はAMラジオ受信機、ある時はFMラジオ受信機になります。
- ※PLLの制限で日本のFM放送を聞けません。
- 従来のハードウェアで実現するアナログ式ラジオは専用の復調回路がないと改良できませんでした。
- さらに性能もソフトウェアの構成次第で向上します。
- 例えば、AGC自動利得制御もあとで追加できます。
- 聞きやすいようにバンド・パス・フィルタも追加できます。
- 面倒なソフトウェアを記述する必要もありません。
- GUI上で積み木のようにモジュールを組み合わせるだけです。
- 面倒なソフトウェアを記述する必要もありません。
- モジュールの組み合わせで様々な方式のラジオに変身します。
(1)SDRの全体構造
- SDRの数学的な理論はさておき、どのようにして実現するのか解説します。
- 数学的な理論を知りたい方はこちら直交復調の解説で解説しています。
- ※数学的な理論と実際の回路を解説している記事をネットで探しても見つかりません。
- ※理論と現実は異なります。貴重な解説になるでしょう。
(2)直交混合
- まず、SDRの全体的な構造を解説します。
- アンテナで受信したRF(Radio Frequency)信号を入力とします。
- 小さいRF信号では処理できないので、高周波増幅しておきます。
- RF信号に直交信号を混合し、同相(In-phase)信号と直交位相(Quadrature)信号を生成します。
- その後I信号とQ信号をローパス・フィルタします。
- そして2つのIQ信号をAD変換してRaspberry Pi側に取り込みます。
- そのため、ステレオ(2チャンネル)で取り込む必要があります。
- 取り込んだIQ信号をgnuradioというソフトウェアを使って復調します。
- 復調とは変調の反対の作業です。
- ラジオの電波は搬送波に音声信号を乗せるために変調を行います。
- 復調とは変調された信号から音声信号に戻す作業です。
- 復調された音声信号をRaspbery Piからオーディオ出力します。
(3)PLL発振器
- どうして直交混合になるのかは後述します。この説明をネットで探してもみつかりません。
- フリップ・フロップ回路を使って90度位相を持つ2つのクロックを生成します。
- この元になるクロックに生成する直交クロックの4倍の周波数が必要です。
- 例えば、500kHzの直交クロックを生成するためには、2000kHzのクロックが必要です。
- これにより、RF信号に直交混合が行われIQ信号になります。
- このときRF信号が直接音声帯域まで下げられて変換されます。
- それゆえ、ダイレクト・コンバージョン方式とも呼ばれます。
- スーパー・ヘテロダイン方式のように中間周波数へ変換しません。
- RF信号の周波数Aに直交クロックの周波数Bを混合すると周波数A±Bが生成されます。
- この低い方のA-Bを取り出すために、ローパス・フィルタを通します。
- すでに音声帯域まで周波数が下がっていますので、簡単なLPFで十分です。
(4)直交クロック
- さて直交クロックの元になる可変の正確なクロックが必要です。
- この基準になるクロックはRaspberry Pi から供給します。
- あまり知られていませんが、Raspberry Pi のGPIO4はPLL Clock出力としても使えます。
- PLL:Phase Locked Loopとは位相同期回路で任意の周波数を発生させることができます。
- つまりPLLがRaspberry Piに内蔵されています。
- ソフトウェアで任意の周波数を指定でき、ハードウェアで実現するので、CPU負荷がかかりません。
- PLLクロックは調整部で位相ずれを検出し、ジッタ(Jitter、揺れ)を発生しますが、ラジオ受信機では問題になりません。
- 十分な精度の任意の周波数を生成します。
- 予備実験したところ1Hz単位の実用範囲は128kHzから32MHzくらいです。
- 1Hz単位でなければもっと高い周波数(125MHzまで)も可能です。
- さてこの結果からSDRとしての受信周波数範囲は4分の1の32kHzから8MHzです。
- 長波、中波から短波の一部までをカバーします。
- AM放送は531kHzから1602kHzですから受信できます。
- 標準電波JJY(40kHz,60kHz)も受信できるかもしれません。
- Raspberry PiにPLL機能があることを知ったのが、SDR Pi製作のきっかけでした。
長波 LF(low frequency) 30kHzから300kHz 中波 MF(medium frequency) 300kHzから3MHz 短波 HF(high frequency) 3MHzから30MHz 超短波 VHF(very high frequcncy) 30MHzから0.3GHz (5)アナログ・スイッチ
- フリップ・フロップ74AC74を利用した直交クロック生成回路です。
- 3.3V電源で74AC74は95MHzまで利用できます。
- 74HC74は25MHzまでです。
- もっと高い周波数(125MHz)が必要なら74VHC74を利用します。
(6)ローパス・フィルタ
- アナログ・スイッチ74HC4066を使った直交混合です。
- 3.3V電源で74HC4066は20MHzまで利用できます。
- もっと高い周波数(40MHz)が必要なら74VHC4066を利用します。
- 74HC4066で扱えるアナログ電圧は0VからVdd=3.3Vまでのため、バイアス電圧をかけます。
- バイアス電圧を中心に交流信号を扱います。
- L1を通してDCバイアスをかけます。
- 高い周波数の交流にとってL1は高抵抗として働くため、入力信号にあまり影響を与えません。
- さらに単電源オペアンプもバイアスを中心に動作させます。
(7)AD変換
- 見えないローパス・フィルタ(直交混合で解説)とオペアンプNJM2732Dを使ったローパス・フィルタがあります。
- ローパス・フィルタの時定数はR1(3.3k)とC1(2200pF)で決まります。
- 今回はサンプリング周波数48kHzでAD変換するため、カットオフ周波数を半分の約22kHzとしました。
- なぜ半分かはサンプリング定理からです。
- ローパス・フィルタ以外に反転増幅器としても機能します。
- 増幅度はアナログ・スイッチのオン抵抗RonとR1(3.3k)で決まります。
- Ronはアナログ・スイッチを並列に使用しており、約50Ωです。利得は約66倍(36dB)です。
- アンテナの入力インピーダンスも約50Ωです。
- RF信号を十分高周波増幅し、さらに出力インピーダンスを下げてください。
- 単電源で使用するため、中点電圧が必要です。
(8)レギュレーター
- ADコンバータにTI社のPCM1808を搭載しました。
- サンプリング周波数48kHzでIQ信号を取り込みます。
- ※gnuradioの制限から48kHzが上限です。
- ラズベリー・パイとPCM1808はI2S接続します。
- ラズベリー・パイがI2Sスレーブ、PCM1808がI2Sのマスターです。
- カーネル・ドライバでラズベリー・パイ側のI2Sのマスターとスレーブを切り替えるため、信号の衝突防止用の抵抗を入れています。
- PCM1808の動作に必要なクロック24.576MHzはCMOSインバーター発振を使用します。
- アンバッファーの74HCU04を使います。
- 発振回路では反転増幅としてバッファーのないインバーターを使います。
- バッファーのある74HC04を使いません。
(9)gnuradio
- ラズベリー・パイの電源はノイズの多いことで知られています。
- ノイズは音声に回り込みます。
- そこでレギュレーターでノイズ除去します。
- 5V用のレギュレーターの代わりに4.7Vのレギュレーターを使います。
- 低ドロップアウト電圧のため機能します。
- 高リップル除去比(PSRR)のレギュレーターを選択します。AP7375は優秀です。
- ドロップアウト電圧 PSRR LP2950-3.3V 380[mV] 40[dB] LP3985-IM5-4.7 100mV[mV] 50[dB] AP7375-33 350[mV] 85[dB] NJM2863F-33 100[mV] 75[dB] NJM2866F-33 100[mV] 75[dB] - LP3985IM5-4.7を入手できないと嘆く必要はありません。
- 3.3Vのレギュレーターをかさ上げして代用します。
- ダイオードの順方向電圧0.45V(電流が小さいので順方向電圧も小さい)でかさ上げし、4.2Vを得ます。
(10)セラミックコンデンサ
- Raspberry Pi上のソフトウェアgnuradioで復調処理をします。
- IQ信号をAD変換で入力し、信号を処理して元の音声信号に戻します。
- 音声信号をRaspberry Piでオーディオ出力します。
- GUI上で、復調するためのラジオのコンポーネントを組み合わせて構成します。
- この組み合わせ次第で様々な方式のラジオ受信機になります。
- 積み木のように必要な機能モジュールを組み合わせ、信号を接続するだけです。
- 非常に簡単な操作です。
- ラジオ受信機を構成するツールをgnuradio-companionと呼びます。
- 構成したラジオ受信機はPythonのシェル(プログラム)として出力します。
- ラジオを受信したいときはこのPythonを起動するだけです。
- まさにソフトウェアでラジオを実現します。
- ※gnuradio 3.10.5のDC blockerとRMSにバグがあり、出力が発散します。
- ※gnuradio 3.10.7で解決してます。
- 電界コンデンサはサイズが大きく、容量抜けするため、排除しました。
- セラミックコンデンサを使用することで長寿命にします。
- できるだけ表面実装部品を使用しません。
- 表面実装部品を使用すれば小型化できますが、組み立ての難易度が上がります。
型番 数 部品番号 備考 AE-PCM1808PWR 1 U1 ADC LP2950-3.3 1 U2 3.3V,100mA LP3985IM5-4.7 1 U3 4.7V,150mA TC74HCU04 1 U4 CMOS,インバーター NJM2732D 1 U5 オペアンプ TC74HC4066 1 U6 CMOS,アナログスイッチ TC74AC74 1 U7 CMOS,フリップフロップ 3.3k 4 R1,R2,R3,R4 カーボン被膜抵抗,1/6W 100 3 R5,R6,R7 カーボン被膜抵抗,1/6W 1M 1 R8 カーボン被膜抵抗,1/6W 2200pF 2 C1,C2 積層セラミック(5%),5mm 1uF 6 C3,C4,C5,C6,C7,C8 積層セラミック,5mm 0.1uF 4 C9,C14,C15,C16 積層セラミック,5mm 10uF 1 C10 積層セラミック,5mm 100uF 1 C13 積層セラミック,5mm 20pF 2 C11,C12 セラミック,2.5mm 24.576MHz 1 X1 HC-49/S AL0307-101K 1 L1 マイクロインダクター100uH 20x2 1 P1 40ピンソケット
- 主要部品は34個です。
- SDR Pi基板は試験的に配布しています。
補足
- フリップ・フロップ回路とアナログ・スイッチで直交混合になるとは不思議に思うかもしれません。
- 直交混合とは信号に正弦波(sin)と余弦波(cos)をそれぞれ掛け合わせてI信号とQ信号を作り出すことです。
- 元の信号にsinとcosの重みづけをすると考えます。
- 大雑把にいえば正弦波と余弦波を矩形波(振幅=±1)とみなし、信号を切り出すのと同じです。
- 90度ずらして信号を切り出します。
- sinとcos
- 疑似sinと疑似cos
- 数式
- 信号f(t)に1を掛け算するとf(t)、信号f(t)に-1を掛け算すると-f(t)です。
- フリップ・フロップ回路で90度ずれた矩形波を2つ作ります。
- この矩形波を使ってアナログ・スイッチを制御し、信号を切り出します。
- I信号もQ信号も半波長分の信号を捨てます。半波混合です。
- 完全な直交混合ではなく、疑似的に直交混合を行います。
- 高速に切り出すので(非常に短い間隔)、近似的に(誤差を許せば)直交混合とみなせます。
- 微分積分の考えが根底にあります。
- アナログ・スイッチのオン抵抗は一定ではありません。
- 制御電圧によっても変動します。
- 中間電圧付近が高く、両端が低い傾向にあります。
これを具現化した回路です。
- この方法の起源を探してみたのですが、わかりませんでした。
- 私が知った時にはすでに世の中に知られており(公知の事実)、誰の発明かわかりません。
- 直交変調や直交復調の原理は数学的に古くから知られていました。
- ただ実現には半導体の発展やコンピュータの発展を待たねばなりませんでした。
- フーリエ変換と同じです。
- 原理は古くから知られていたのですが、技術が追いつくまで実現できませんでした。
- ※初のSDRは米国国防総省と契約していたRCAの技術者が1982年に開発したようです。軍事技術でした。
- ※その後も空軍でSpeakEasyというプロジェクトで開発を進めました。DSPとしてTMS320C40を使いました。懐かしい。
フリップ・フロップ回路の真理値表
(1)中点電圧が必要
- 回路図から同じ信号があります。
- (1)「GPIO4」=「AのCK」=「BのCK」
- (2)「AのD」=「BのQ」
- (3)「BのD」=「AのQ」
- 結果としてI=「AのQ」、Q=「BのQ」となります。
- 回路図から同じ信号があります。
- 位相が90度ずれます。
- これをアナログ・スイッチの制御に使用します。
- そしてIQの4倍の周波数が必要な理由です。
(2)アナログ・スイッチにDCバイアス電圧が必要
- 単電源オペアンプによる反転増幅器を追加しています。
- 単電源オペアンプの動作に中点電圧が必要です。
- R2で中点電圧を生成します。
(3)アナログ・スイッチ出力にコンデンサが必要
- アナログ電圧は電源電圧範囲になければなりません。
- そこで中点電圧をDCバイアス電圧としても利用します。
- 高周波の回り込みを防止するため、アナログ・スイッチ入力部にインダクターLを介してDCバイアス電圧を供給します。
問題点
- アナログ・スイッチがオフのとき、アナログ出力電圧が不定になるため、コンデンサによるサンプリング・ホールドが必要です。
- 同時にスイッチのオン抵抗R(100Ω)とコンデンサC(0.1uF)によるLPFも構成します。
- 直交混合は後段にLPFを必要とするからです。
改良版直交混合
- 半波混合とスイッチオフ時の電圧不定による弊害があります。
- (1)半波混合のため誤差(ひずみ)が大きい
- (2)アナログ・スイッチがオフの時の電圧不定をコンデンサで処理しているため精度が悪い
- アナログ入力とアナログ出力のDCバイアス電圧もずれます。
- 動作原理を理解すると問題点も浮かび上がってきます。
- そして「知っている」と「理解している」の違いです。
- 単に知っているだけでは改良できません。
- 理解していれば応用でき、改良できます。
- そこで改良した直交混合回路の考案です。
- (1)全波混合にして誤差(ひずみ)を小さくする
- (2)アナログ出力を不定にしない
- 回路図は有料記事で提供予定です。
- ひずみが小さくなり非常に良好な結果を得られました。
- オリジナル回路であり、ネットで調べてもありません。
- 優れた科学者は見通しを立てるのが上手です。
- アインシュタインやファインマンは問題点を鋭く直感的に指摘したといわれています。
- これ直感ではなく、大雑把に考えたからです。
- 数学や物理に共通するのですが、問題を見たとき、どの法則や定理を組み合わせれば解答にたどり着くかその見通しを立てます。
- これが見えた段階で勝負は決まります。やみくもに解いているのではありません。
- 法則や定理を論理的に組み上げたとき、自ずと答えが導かれるのです。これが論理的思考力です。
- あとは計算間違いしなければよいだけです。計算なんてものはコンピュータにやらせておきましょう。
- 筆者は買い物するとき、大雑把に考える習慣があります。
- お弁当390円に消費税、飲み物120円に消費税。
- これを大雑把に考えると、お弁当約400円、飲み物約100円とします。合計大体500円前後だなと予測します。
- 1円単位なんて切り捨てて考えます。
- もし500円前後を外れていれば、何か間違っていると判断できます。異常を指摘できます。
- 大体これくらいだなと予測しているのです。予想の範囲内に収まれば1円単位もあっているだろうとします。
- 計算なんてレジにやらせておけばよいのです。
- 大雑把に考えれば異常を検出できますし、支払い額も前もって準備できます。
- たとえ消費税の1円単位の切り上げや切り捨て処理の違いで「ずれ」があっても誤差の範囲であり気にしません。
- 大きく外していなければ「よし」とします。
- 細かい計算は後でじっくりとすればよいだけです。
- sin関数とcos関数を疑似矩形波として大雑把にとらえれば、この直交混合を理解でき、細かい誤差はあっても大体あっていると判断できます。
- ※根拠なく「見立て」を行うと、自分に都合の良い(思い込み)ストーリーになる。自分たちのストーリーに当てはめてしまう。
- ※捜査でこれを行うと、誤認逮捕やえん罪事件になる。
- ※事実に基づかず、思い込みによる間違った結論。これを論理的な思考とは呼ばない。数学的にも間違った論理展開。
- ※「何々したことに間違いない」こんな供述をしない。結果ありきの「調書」を作る。事件処理しやすいように当てはめる。
- ※あとは裁判の判決までベルトコンベアー方式の流れ作業になる。
- ※原因と結果の順序が逆。結果ありきで原因(証拠)を当てはめてはいけない。
- ※名探偵ポアロは「秩序と方法(order and method)」を重んじている。順序を壊してはいけない。
- プログラミングの世界でははじめに全体像をとらえ、細かい部分に分解して記述していく方法をトップダウン方式と呼びます。
ステップ1
- 無計画な組み立ては失敗のもとです。
- まずは完成写真をよく確認しましょう。
- 背の低い部品から取り付けます。
- ケースへ収納のため、部品に高さ制限があります。
ステップ2
- 抵抗(R1〜R8)とL1をハンダ付けします。
ステップ3
- コンデンサ(C1〜C16)をハンダ付けします。
ステップ4
- X1をハンダ付けします。ショート防止のため念のため基板から約1mm浮かせます。
ステップ5
- モジュール(U1〜U7)をハンダ付けします。向きに注意してください。
ステップ6
- 40ピンソケットとJ1を基板の裏にハンダ付けします。
- ソルダージャンパーをハンダ付けします。
- 通常はSJ1=オープン、SJ2=オープン、SJ3=ショートです。
SJ1 フォーマット Open I2S Short Left-justified
SJ2 SJ3 サンプリング周波数 Open Open Slave mode Open Short 48kHz Short Open 64kHz Short Short 96kHz
- ※動作確認日 2023-11-30(bookworm)
- ※SDR-Pi専用のマイクロSDカード(16GB)を用意してください。
- 他の実験を行ったOS上で設定を行うと機能競合して動作しません。
- 手間を省くためにsetup.shファイルを用意しました。
- $ cd
- $ wget http://einstlab.web.fc2.com/SDR/SDR.tar
- $ tar xvf SDR.tar
- $ cd SDR
- $ ./setup.sh
- リブートして終わりです。
- Linuxオーディオの基礎知識を解説します。
- LinuxのオーディオはALSAという仕組みで構成されています。
- ALSAに組み込まれている標準的なコマンドを使います。
- aplay 再生コマンド
- arecord 録音コマンド
- amixer ミキサーコマンド
- 入出力先はカード番号とデバイス番号で識別します。
- 再生コマンドの出力先を確認します。
$ aplay -l **** List of PLAYBACK Hardware Devices **** card 1: b1 [bcm2835 HDMI 1], device 0: bcm2835 HDMI 1 [bcm2835 HDMI 1] Subdevices: 4/4 Subdevice #0: subdevice #0 Subdevice #1: subdevice #1 Subdevice #2: subdevice #2 Subdevice #3: subdevice #3 card 1: b1 [bcm2835 HDMI 1], device 1: bcm2835 HDMI 1 [bcm2835 HDMI 1] Subdevices: 1/1 Subdevice #0: subdevice #0 card 2: Headphones [bcm2835 Headphones], device 0: bcm2835 Headphones [bcm2835 Headphones] Subdevices: 3/4 Subdevice #0: subdevice #0 Subdevice #1: subdevice #1 Subdevice #2: subdevice #2 Subdevice #3: subdevice #3ラズベリー・パイの出力先がわかりました。 HDMI端子=card 1, device 0 HDMI端子=card 1, device 1 ステレオミニ端子=card 2, device 0 aplayコマンドでステレオミニ端子に出力する例です。 -Dオプションでカード番号とデバイス番号を指定します。 $ aplay -D hw:2,0 WalkOn.wavamixerコマンドで再生ボリュームを制御します。 まずはボリューム状態を確認します。 -c オプションでカード番号を指定します。 ボリューム=100%=4dBを確認できます。 100%は0dBではありません。 $ amixer -c 2 Simple mixer control 'PCM',0 Capabilities: pvolume pvolume-joined pswitch pswitch-joined Playback channels: Mono Limits: Playback -10239 - 400 Mono: Playback 399 [100%] [3.99dB] [on]set PCM 50%オプションでボリュームを設定します。 dB指定もできます。 $ amixer -c 2 set PCM 50% Simple mixer control 'PCM',0 Capabilities: pvolume pvolume-joined pswitch pswitch-joined Playback channels: Mono Limits: Playback -10239 - 400 Mono: Playback -4919 [50%] [-49.19dB] [on] $ amixer -c 2 set PCM 0dB Simple mixer control 'PCM',0 Capabilities: pvolume pvolume-joined pswitch pswitch-joined Playback channels: Mono Limits: Playback -10239 - 400 Mono: Playback 0 [96%] [0.00dB] [on]set PCM offオプションでミュートします。 set PCM onオプションでミュート解除します。 $ amixer -c 2 set PCM off $ amixer -c 2 set PCM on録音コマンドの入力先を確認します。 $ arecord -l **** List of CAPTURE Hardware Devices **** card 0: pcm1808codec [pcm1808_codec], device 0: PCM1808 pcm1808-dai-0 [PCM1808 pcm1808-dai-0] Subdevices: 0/1 Subdevice #0: subdevice #0ラズベリー・パイの入力先がわかりました。 入力端子=card 0, device 0 arecordコマンドで録音する例です。 $ arecord -D hw:0,0 -c 2 -d 60 -r 48000 -f S16_LE test.wav Recording WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo-Dオプションでカード番号とデバイス番号を指定します。 -c 2 でチャンネル数(ステレオ)を指定します。 -d 60 で録音時間(秒)を指定します。 -r 48000 でサンプリング周波数を指定します。 -f S16_LE でWAVファイルの形式を指定します。 録音を終了するとtest.wavが生成されます。 aplayコマンドで再生すると音を確認できます。 ※LinuxのオーディオシステムはPulseAudioに統合の方向で進んでいます。 ※ALSAがなくなるわけではなく、PulseAudioを中心(server)にしてアプリとALSAを連携します。 ※paplay, parecord, pactl, pacmd コマンドが用意されています。 ※オーディオも階層化が行われました。 ※下層にALSA、上層部にPulseAudioの構造です。
- SDRを実現するソフトウェアを紹介します。
- 公式ページはこちらhttps://www.gnuradio.org/です。
- これを使ってAMラジオ受信機を実現します。
- ※gnuradio 3.10.8で動作確認しました。
- gnuradioをインストールします。
$ sudo apt-get install gnuradio起動方法 $ gnuradio-companion起動したら、構成済みのAMCUI.grcファイルをオープンします。 これをフロー・グラフ(flow graph,流れ図)と呼びます。 AMCUIは最小限のAMラジオ構成です。 通常はこれを自分で構成します。 各項目を解説しします。 各項目はダブルクリックすると編集できます。
(1)Options フロー・グラフの属性を記述します。 IDに自由な名前を付けます。これは識別子です。 Generate Optionsは生成するPythonをGUIかCUIか決定します。 GUIが不要でコマンドのみとして起動したいときはNo GUIを選択します。
(2)Variable フロー・グラフ内で利用する共通のグローバル変数です。 samp_rate=48000と定義します。
(3)Audio Souce オーディオ入力モジュールです。 入力デバイスを設定します。 ここではALSAのhw:0,0を指定します。カード番号=0,デバイス番号=0です。 2チャンネル必要なので、Num outputsに2を指定します。2つのFloatを出力します。
(4)Float To Complex 後段で複素数を必要とするため、型変換を行います。 2つのIQ信号を1つの複素数に変換します。
(5)AGC 自動利得制御モジュールです。 なくても動きますが、あると自動的に最適な音量へ調節します。
(6)AM Demod AM復調モジュールです。 Channel Rateにサンプリング周波数を指定します。 Audio Decimation はデータの間引きを指定します。ここでは間引きなしの1を指定します。 Audio Passはフィルタの帯域を指定します。 Audio Stop はフィルタの枠を指定します。 このフィルタ特性で音質と選択度が決まります。 フィルタを広くすると音質が良くなりますが、選択度が下がります。 AMでは5kHz前後で調節します。 AM復調されると音声信号がFloatで出力されます。
(7)DC Blocker SDRのAM変調はその原理上DCを出力します。 そこでDCをカットします。これにより聞きやすくなります。
(8)QT GUI Frecuency Sink 周波数解析のツールです。 FFTを行い周波数解析します。 AM Demodで指定したフィルタ特性を確認します。 GUIを必要としないときはこのモジュールを削除します。
(9)QT GUI Time Sink オシロスコープのツールです。 音声信号を確認します。 GUIを必要としないときはこのモジュールを削除します。
(10)Wav File Sink 音声信号をWavファイルに録音します。 Fileにam.wavを指定します。 N Channelsに2を指定し、ステレオで録音します。 Sample Rateに48000を指定します。 Bits per Sampleに16を指定し、16ビットデータで録音します。 録音を必要としないときはこのモジュールを削除します。
(11)Audio Sink オーディオ出力モジュールです。 音声信号をALSAのhw:2,0に出力します。 カード番号=2、デバイス番号=0です。 必ずNum Inputsに2を指定してください。さもないとset_channelsエラーを発生します。
実行 gnuradio-companionの実行ボタン(Excute the flow graph)を押すとPythonのシェルamcui.pyを生成します。 一度生成すれば、gnuradio-companionは不要です。 直接amcui.pyを起動するだけです。 Pythonを知らなくても、ラジオのモジュールを構成するだけで、自動的にPythonのプログラムを生成してくれます。 これを「ノーコード開発」と呼びます。 プログラミングなしにプログラム開発を行います。
新規でフロー・グラフを作成する方法 ステップ1 メニューFile->Newを選択します。 右側のリストからラジオに必要なモジュールを探し、ドラグ&ドロップします。 各モジュールを接続しやすいように並べます。
ステップ2 各モジュールのOUTとINを左クリックして、接続します。 このとき、データの型に注意してください。 同じ型でなければなりません。 場合によってはモジュール内部でデータ型を変更できることもあれば、型変換モジュールを利用することもあります。 データの型はINとOUTの色で判別します。
ステップ3 各モジュールの内部プロパティを適切に設定します。 例えば、サンプリング周波数や低音カットオフ周波数を指定します。 各モジュールの内部設定と接続が完了しないとPythonを生成できません。
- Raspberry PiのGPIO4をPLLクロック出力するためのソフトウェア(pll.c)をC言語で記述しました。
- 実行は直交クロックの周波数を引数に指定するだけです。
- 指定した周波数の4倍のPLLクロックを出力します。
- 使い方 954kHzの例
$ sudo ./pll 954000これが選局でもあります。 SDRでは指定した周波数を受信します。 選局に必要なシェルを用意いました。 nhk1.sh NHK第1=594kHz nhk2.sh NHK第2=693kHz afn.sh AFN=810kHz tbs.sh TBS=954kHz joqr.sh 文化放送=1134kHz直接レジスタを制御します。 (1)GPIO4にALT0を割り当て GPIOにPLL出力機能を割り当てます。
(2)クロックソースにPLLDを割り当て PLLDは500MHzです。RPI4の場合750MHzです。
(3)分周比を計算 発振させる周波数fとPLLDから分周比divを計算します。 divは固定小数点形式(整数部12ビット、小数部12ビット)です。 小数部の12ビットを桁上げするため、4096を掛け算して整数にキャストします。 div = (PLLD / f)*4096
(4)分周比を設定 分周比を設定してPLL発振を有効にします。
レジスタ操作に共用体を利用し、ビット操作を行います。 同時に可読性もよくなり、何をしているのかわかります。 ビット操作にシフトを用いる方法もありますが、何をしているのかわかりません。 プログラムの再利用や修正を考えた場合、読みやすさは重要です。 利便性のためラジオ受信機と選局を行うプログラムsdr.cを用意しました。 プログラムに登録したラジオ局を選局します。 チューナーを起動します。 $ ./sdr
- AM放送をコマンドベースで受信してみましょう。
- (1)選局
- 選局用のシェルを起動します。tbs.shを実行するとTBSを受信します。
- (2)ラジオを起動
- amcui.pyを実行します。
参考までに最良時のRF信号強度です。相対値です。
NHK1 -15dB NHK2 -10dB AFN -3dB TBS 0dB JOQR -8dB
- ラジオと選局を統合したam.pyを用意しました。いくつかの工夫をしています。
- (1)外部コマンドの呼び出し
- 選局するためには外部コマンド(pll)を呼び出さなければなりません。
- グローバル変数(Variable)を設定するときにPythonの関数を呼び出すことができます。
- そこでPython Moduleに外部コマンドの呼び出し関数を定義します。
- QT GUI Chooserで選択した周波数freqをグローバル変数stationに受け渡すときに外部コマンドを呼び出して選局します。
- グローバル変数の設定に介在して外部コマンドを起動します。
- (2)音量調整
- Multiply Const で音量調整します。
- QT GUI Range でvolume変数を設定し、Muliply Const に渡します。
- (3)録音のオンオフ
- Wav File Sink でファイルに録音できますが、オンオフ機能がありません。
- 長時間録音はディスク容量を圧迫します。
- そこでSelectorを利用してオンオフを行います。
- QT GUI Check Box でswitch 変数にBoolean を設定し、Selector の Enabled に渡します。
- これによりオンオフを実現します。
- (4)長時間録音
- 長時間録音を実現するためにサンプリング周波数を下げてファイル容量を削減します。
- AM放送の音声帯域(5kHzから9kHz)は狭いため、サンプリング定理による倍の12kHzで十分と言えます。
- Rational Resamplerで間引き(decimation)を行いサンプリング周波数48kHzを12kHzに変換します。
- 8ビットで量子化します。
- これにより、1秒あたりのデータ容量は
- 12kHz x 1 channel x 1 byte =12kB
- です。1時間なら43.2MBです。
- (5)タブ表示
- 表示面積を削減するため、グラフをタブ切り替え表示にしました。表示がすっきりしました。
- なお、表示内容の配置は GUI Hintで指定します。
- 行,列を指定します。
- 十分大きなRF信号があれば、聞こえるでしょう。
- 安定した受信を行うにはやはりアンテナと増幅器が重要です。
- どんなに優れたSDRであってもRF信号が弱ければ性能を発揮できません。
- そこで安定した受信のため、AM用アンテナと高周波増幅回路(プリアンプ)を作成します。
- 中波をカバーするため広帯域である必要があります。
- 磁界型ループアンテナを使います。
- 広帯域アンテナとするため同調しないので厳密な長さやインダクター値はありません。
- 非金属、非磁性体のプラスチック・ケースに電線を5回から10回、平行巻きします。
- ループアンテナは巻き数よりも面積を大きくすると感度が上がります。
- 綿棒のケース(直径9cm)に10回巻してループアンテナとしました。
- このアンテナからの信号をオペアンプで差動増幅します。
- この差動増幅に意味があります。
- 外来ノイズである同相信号は除去されます。
- Raspberry Piが発生するデジタルノイズを除去しながら、受信信号を増幅します。
- SDR側にAGCがあるため、厳密な増幅度である必要もありません。
- 増幅度は100倍(40dB)です。
- さらにボルテージ・フォロアで出力インピーダンスを下げます。
- ボルテージ・フォロアがないとせっかく増幅しても出力電圧が下がってしまいます。
- オペアンプにはNJM2137Dを使用します。
- このオペアンプのGB積は約200MHzあり、中波をカバーします。
- 両電源オペアンプなので、2本の電池を使います。
- 電源は±1.35V以上で動作します。
- 消費電流が小さいので、長期間使用できます。
- 単4アルカリ電池なら約一カ月使用できるので、電源スイッチを省略します。
- NJM2137Dをうまく活用すればAM用ループアンテナを簡単に作れます。
型番 数 部品番号 備考 NJM2137D 1 U1 オペアンプ 1k 2 R1,R2 カーボン被膜抵抗,1/6W 100k 2 R3,R4 カーボン被膜抵抗,1/6W BH-411-4D 2 単4ボックス AAA 2 単4電池 AWG28 1 耐熱ビニル電線3m ローノイズ・ループアンテナの開発
- 使い方はSDR Piに接続するだけです。
- ループアンテナに指向性があるので、送信所に向けます。
- ※ループアンテナ付近に金属物を配置しないでください。
- ※アンテナのインダクタンスが変わったり、ノイズの原因になります。
抑圧
- ループアンテナでノイズも拾っていることが発覚し、ローノイズ化を図りました。
- 広域アンテナなのでノイズを拾ってしまうのは仕方ないとあきらめていましたが、オリジナルのアイデアがありました。
- これが大きな効果をもたらします。
- SN比(シグナルとノイズの比)の改善に成功しました。
- ローノイズ・ループアンテナ回路図は有料記事で提供予定です。
- 強い放送局があると、抑圧を受け混信状態になります。
- アンテナの方向を変えることで混信を避けられますが、たまたま同じ方向に放送局が重なるとこの手を使えません。
- SDRを実験してみないとこうしたことがわかりません。良い経験になります。
- RF信号が強すぎ、クリップ(頭打ち)すると音割れします。過度な増幅を避けましょう。
- Raspberry PiでSDRを実現しました。
- 実際に理論を実現してみると、実感がわいてきます。
- 理論通りに動作していることを確認できます。
- 例えば直交周波数を掛け合わせると、音声帯域まで周波数が下がることを確認できました。
- AGCの効果は大きいです。
- 従来はラジオ受信機をハードウェアでしか実現できませんでしたが、ソフトウェアで実現するので、ハードウェアのシミュレーションを行っているとも言えます。
- 十分実用性のあるSDRに仕上がりましたが、新たな改良のアイデアを試してみましょう。
- 工夫してみましょう。最強のAMラジオに改造してみよう。
- ※改良、改造は自己責任です。当方は一切関知しません。
- (1)電波が弱いときに消音するスケルチ機能
- (2)ノイズリダクション機能
- 改良したフロー・グラフは有料記事で提供予定です。
- SDRの開発に長い時間を費やしました。
- 先人の知恵には感謝します。
- 一方で最先端技術であるため、参考になる事例はありません。
- 自分で開拓していくしかありませんでした。
- なかなかうまくいかず、試行錯誤の連続でした。
- 直交復調の理論の理解から、実際の直交復調の成功までに何年もかかりました。
- 簡単そうにみえますが、苦労の連続でした。どこか1か所でも間違いがあると動きません。
- 理論は難しいのですが、原理は簡単です。
- シンプルな回路であるがゆえに、手を抜くとすぐに影響がでます。
- 各部を一つ一つ動作確認しました。オシロスコープで確認したり、プログラムを修正しました。
- それ以前に直交復調の理論を確認しました。
- 90度の位相差を使うというのは自然界の原理に通じるところがあります。
- 電磁波は電界と磁界が90度の位相差を保っています。
- 原子構造だったり、あらゆるエネルギーが90度の位相差を保っています(絡まっています)。量子のもつれも90度の位相差です。
- ラジオがSDRにたどり着いたのも偶然ではないでしょう。
- 筆者が電気の世界に足を突っ込むきっかけはゲルマニウムラジオでした。
- SDRはそれに匹敵する感動があります。周波数同士をぶつけ合うと受信するとはなんとも不思議です。
- 簡単なハードウェアだけで、これがラジオとは思えません。
- 世界的にAMラジオ放送は廃止の方向に進んでいます。
- 日本でも廃止の話がありますが(NHK2は廃止予定)、災害時にAMラジオしか使えないためその意義、価値が見直されています。
- 日本は災害の多い国です。
- 災害時、停電でテレビやスマートフォン(基地局)は使えません。インターネットも使えません。FM放送は受信範囲が狭いです。
- (災害現場で)唯一使えたのは、AMラジオです。情報の入手手段がこれしかありません。
- もちろん被害地の外ならスマートフォンを使えます。災害時に最先端技術は使い物になりません。
- 情報を入手できないと何が起こっているのかわかりません。震源地はどこか。被害状況はどの程度か。救助の来る見込みはあるのか。
- 安否確認どころの話ではありません。すべての情報が遮断されます。
- gnuradioとの出会いも偶然とは思えません。
- なんとgnuradioの創設者は同じ会社に勤めていました。
- こんなことがあるのでしょうか。