5章 SDRプログラムを作る

 

1. 2節では,入手可能なSDR用プログラムの一部を紹介しました。どれも,デザイン・性能共に優れたもので,それらに近づくのはなかなか大変ですが,Pdを使えば比較的簡単に,それなりのソフトづくりが楽しめます(図5.1)。本章では,IQミキサ(クアドラチャ・ミキサ)の出力を,パソコンで直接検波する(図5.2),ダイレクトコンバージョンタイプのSDRソフトの作り方を紹介したいと思います。

 

5.1 Pdで作ったSDRソフトの一例

 

5.1 SDRソフトに必要な機能

 

最初に,必要な機能ついて整理しておきましょう。

伝統的なダイレクトコンバージョン受信機では,RF信号を一気に可聴域まで落とし,狭帯域のBPFもしくはLPFで不要部分をカットし,AF増幅するという段取りになっています。しかし,SDRの場合,パソコン側でいろいろな信号処理が行えるので,できるだけ広い帯域の信号を送り込めるよう,IQミキサのフィルタは広い帯域をもっています。たとえば,普通のパソコンに装備されている,オーディオ入力のサンプリング周波数はWindowsパソコンで48kHzMacでは44.1kHz[1]で,それぞれ24kHz22.05kHzの信号まで取り込めます。したがって,IQミキサにおけるLPFのカットオフ周波数は,この程度あれば良いことになります。たとえば,SoftRock-40 (http://www.amqrp.org/kits/softrock40/) では,カットオフ周波数は30kHzになっています[2]SDRのソフトウェアでは,この広い帯域の中から一定の狭い帯域の信号を取りだして受信します。したがって,局部発振器の周波数を変えなくても,周波数の異なる複数の局が受信可能となりますが,SDRソフトの方に,特定の信号のみを選択するチューナー機能が必要になります。

後述することになりますが,IQミキサを使った受信機では,IQ両成分の信号レベルが同じで,位相の違いがキチンと90°に保たれていないと,信号の再生や逆サイドバンドの抑圧が上手く行えません。広く使われているIQミキサは,90°移相のためにディジタルICを使ったタイプが多いので,位相の違いが問題になることは,まず無いでしょう。しかし,信号レベルに関してはアナログ処理なので,調整ズレなども起こりやすいと思われます。したがって,ソフトウェア側にレベル調整機能を備えておく必要があります。また,パソコンにおけるオーディオ入力回路の,左右どちらのチャンネルにIもしくはQ信号が供給されたかを,いちいち配線を追跡して確認するのは大変です。さらに,パソコンによっても,物理的な左右チャンネルと,ソフトウェア内部での左右チャンネルの対応が異なる可能性があります。したがって,I/Qの入力を左右切り替える機能も必須でしょう

 

5.2 クアドラチャ・ミキサ(図1.4再掲)

 

IQミキサから入力される信号は,広い帯域にわたっています。したがって,周波数解析を行えば,どの周波数に,どれくらい強い信号があるかを示す,バンドスコープを実現できます。これは,チューニングを容易にするので,是非欲しい機能です。

検波についての少し詳しい説明は後で行いますが,たとえば,パソコンに入力された2つの信号成分IQからSSBを復元するには,I成分の位相をさらに90°進める必要があります。その方法の1つがIQミキサで,SDRソフトにはこの機能も必要です。あと必要な最低限の機能は検波だけですが,SメータやAGC,受信音の表示(オシロ機能)や録音・再生などの機能も,あると便利でしょう。

以上, SDRを構成する機能について簡単に述べましたが,概略は図5.3のようになるでしょう。この図では,実線の矢印は信号の流れを,また点線の矢印は制御の流れを現しています。以下の節では,図に示された機能と,その他の付随的な機能について説明します。

 

5.3 SDRのブロックダイアグラム

 

5.2 I/Q切り替えと入力バランス

 

5.4が入力バランス調整用サブパッチ(左)balancer.pdと,入力の左右入れ替え用サブパッチ(右)I-Q_Switch.pdです。

 

5.4 左右チャンネルの入力バランス調整(左)とI/Q切り替え(右)

 

balancer.pdにおける入力レベルの表示に関する部分は,4.6節の図4.30と基本的に同じです。異なる点は,env~計算のためのデータ数を大きくし,比較的長い時間の平均的なレベルを得るようにしている点です。デフォールトのままだと変化が速すぎて,調整に苦労します。

入力レベルを調整する部分に,exprというオブジェクトがありますが,これは,任意の計算式を表現するために使われます。計算式には変数と定数が使えます。変数の一般形は$i#$f#$s#で,最初から整数型,実数型(含む小数点),シンボル型の変数を示し,#は左端から123と順番付けされるインレットの番号を表しています。たとえば,expr $f1+$f2とすると,左から1番目と2番目のインレットから入力された実数値の和を,アウトレットから出力することになり,expr $f1+$f3とすると2番目のインレット入力を無視し,13番目の入力の和を求めることになります。この他にもオーディオ信号に関して計算するexpr~や,フィルタの定義などに用いられるfexpr~等もあります。詳細はPdのヘルプをご覧下さい。

 

5.5 左右チャンネルの増幅率とその比率の変化

 

さて,入力調整部では,HsliderProperty設定で,出力を-0.3+0.3の間に制限しています。この値を変数$f1に代入し,左チャンネルでは-$f1+1,右チャンネルでは$f1+1という計算をしているので,オーディオ信号に対する各チャンネルの増幅率は及びその比率は,図5.5のように変化します。なお,Hsliderの上に位置しているBangNumberは,Hsliderのツマミを中央に戻し0を出力するためのものです。これら2つのオブジェクトの代わりに,0を入力したMessageをクリックしても同じ働きをします。入力バランスの調整法については,SDRプログラムが完成した段階で説明したいと思います。パソコンのライン入力(ステレオ)にステレオ用のシールド・ケーブルを接続し,それを指で触ると,人体に誘導されている50もしくは60Hzのハムがパソコンに入力されるので,簡易のオーディオ入力になります。このような状態で,メイン・ウィンドウのcompute audioにチェックを入れると,balancer.pd(図5.4の左)の機能を確かめることができます。Hsliderの操作で,左右チャンネルの出力が変化することを確認しておいて下さい。

ラジオボタンによる左右チャンネルの入れ替えの様子を,図5.6に示しておきます。2つのポジションを持ったラジオボタンは,左側がクリックされたら0を,右側がクリックされたら1を出力します。したがって,図5.4(右)のようなパッチで左がクリックされたときは図5.6の左側と,また右がクリックされたときは図5.6の右側と等価になります。オーディオ信号乗算器の係数が0の場合は出力が0に,係数が1もしくは-1の時は入力が素通りするのと同じなので,図5.6の赤と青の矢印のように入出力を切り替えることができます。なお,係数が-1の場合は波形が反転しますが,左右チャンネル共に反転するのでチャンネル間の相互関係に変化はありません。

 

5.6 ラジオボタンによる左右チャンネルの入れ替えの様子

 

5.3 各種フィルタ

 

5.3に示されているように,計画しているSDRソフトでは,BPF1BPF33つのフィルタを使う予定です。

 

5.7 BPF1のサブパッチ(片チャンネル分)

 

パソコンで処理可能なオーディオ信号の上限周波数は,サンプリング周波数の1/2です。Macの場合,サンプリング周波数が44.1kHzなので,上限周波数は22050Hzです。これ以上,あるいは可聴域以下の信号は無駄だし,あるとノイズも増えるので,カットすることにします。数十Hzから20kHz強までの信号で十分でしょう。とはいっても,BPF1結構広い帯域をカバーしなければなりません。そこで, BPF1としては,カットオフ周波数が21050Hzのハイパスフィルタと,50Hzのローパスフィルタを組み合わせたものにしました(5.7BPF1.pd)。両方ともチェビシェフタイプの3次のフィルタで[3],補間時間(interpolation time)200 msです。このオブジェクトの書式はlp#_cheb~ fc tiです。lpはローパスフィルタ(ハイパスならhp)を表し,次の#はフィルタの次数です。その後のアンダースコア(_)に引き続き,フィルタのタイプであるcheb~が続きます。その次の数字がカットオフ周波数,最後が補間時間(ms秒単位)です。カットオフ周波数と補間時間は,それぞれ第2および第3インレットから入力することもできます。

interpolation timeを補間時間と訳しましたが,まだ,このパラメータの十分な解説をヘルプの中に見つけることができていません。この時間を長くすると,入力される周波数の変化や,自身のカットオフ周波数変化に対する,フィルタの応答が遅くなります。このパラメータはデフォールトのままでもよく,特に設定する必要はないようですが,サンプルパッチでは200ms程度の設定をよく見かけたので,そのようにしています。

 

5.8 AMBPF2のサブパッチ(片チャンネル分)

 

BPF2は, BPF1の帯域に含まれる信号の中のから,受信したい周波数で,受信モードに合わせたサイドバンドを適切な帯域幅で抽出するフィルタです。図5.8(BPF2.pd)は,AM用のBPF2です。AMでは両サイドバンドを抽出したいので,中心周波数とバンド幅を指定できる,2次のバンドパスフィルタbpw2~を使用しました。中心周波数は,チューニング操作によって変化する受信周波数に対応しているので,インレットから与えるようにしています。またバンド幅も変えられるように,インレットから与えるようにしています。図5.8では,代表的なバンド幅をプリセットできるようにも,連続可変できるようにもしてあります。また,このパッチには,midfil….というMessageがありますが,これは,メイン・パッチにPropertyreceive-symbolmidfilになったcanvasがあり,そのlabelにバンド幅を表示させる予定があるので,このようにしています(4.1.2参照)。なお,bpw2~の箱の中に記されている数値200は,補間時間です。

5.13に示されているように,AMSSBではBPF2の帯域幅や中心周波数が異なります。さらにSSBの場合は,サイドバンド切り替えの操作が容易で,逆サイドバンドの抑圧も十分に行え,通過帯域内ではできるだけフラットな特性であり,ノイズもできるだけ押さえたいと,少し欲張りな希望がありました。そこで,SSBBPF2の実装に際してはbpw2~ではなく,高次のチェビシェフ型ローパスおよびハイパスフィルタを使うようにしました。詳細は図5.32や,LSB_Prot2.pdUSB_Prot2.pd中のBPF2サブパッチをご覧下さい。基本的には図5.75.9と同じ構造をしていることが,おわかりいただけると思います。

ところで,図5.8では,中心周波数を入力するインレットとbpw2~の間にabsという,絶対値を返すオブジェクトが挟まっています。なぜ,このようなものが必要なのでしょうか?それは,bpw2~が中心周波数として正の値しか受け付けないからです。にもかかわらず,ミキサに使われる局部発振器の信号に連動して,負の値も入力されることがあるので,そのような場合でもフィルタが機能するように,absを入れています(5.4節参照)。

 

5.9 BPF3のサブパッチ(片チャンネル分)

 

BPF2で選択された信号と局部発振器の信号をミキサで混合し,AGC,検波を経た後の信号をBPF3(図5.9BPF3.pd)に通し,ノイズ成分などができるだけ除去された聞きやすい音にします。用いたフィルタのタイプや構成は基本的にはBPF1と同じですが,キレをよくするために,ハイパス,ローパスとも5次にしています。また,デフォールトとして通過帯域を3002600Hzとしていますが,受信音質を変化させる自由度を上げるために,カットオフ周波数のインレットにメイン・パッチからも入力できるよう,inlet オブジェクトを付けています。ここにsliderを取り付けると受信帯域を高域側と低域側で,独立に変えることができます。また,siliderPropertyno initボタンをクリックしてinitに変えて保存すると,再び開いたときも,自分の好みの帯域になっています。

 

 

5.4 バンドスコープとチューニング

 

4章の図4.214.22と図5.10を比べてみて下さい。非常によく似ていると思います。相違点の1つは,実数成分と虚数成分を入れ替えたFFTが,並行して行われているところです。これによって,パソコンのサンプリング周波数が44.1kHzであるにもかかわらず,外付けのIQミキサの局部発振周波数fLを中心とする,±22050Hz,都合44.1kHzの帯域が見渡せるようになります。また,これに対応して,図5.3のミキサに注入する局部発振器の周波数を±22050Hzの範囲で変化させれば,fL±22050Hzの信号が受信できることになります。

 

5.10 バンドスコープ用サブパッチ(BandScope.pd)

 

FFTの結果は,tabsend~ FFT_Ltabsend~ FFT_Rというオブジェクトによってグラフ表示されるので,FFT_L FFT_Rという名前のArrayを,メイン・パッチに準備しておく必要があります。tabsend~tabwrite~と異なり,グラフ更新のためのbang信号は不要です。したがって,図4.19のサンプルパッチのようにmetroを用いてはいません。

 

5.11 バンドスコープのシミュレーション(BS_Main.pd)

 

5.11は,図5.10の内容をサブパッチBSとして含む,バンドスコープシミュレーション用のパッチBS_Main.pdです。FFTの結果を表示する,2つのArrayの設定から説明しましょう。図5.10に示されているように,FFT512個のデータに対して行われるので,得られる周波数成分は直流成分+256257個です。したがって,配列サイズはFFT_LFFT_Rともにarray Property257に設定します。また,1ドットが1個の周波数成分に対応するように,描画領域canvasPropertyにおいて,size257に,またYの値は必ず正になるので,レンジは10にしました。IQ信号を入れ替えたFFTの結果は,直流成分を境にして一方は正の周波数スペクトルを,他方は負の周波数スペクトルを示します。したがって,一方のX軸の目盛りの取り方を0256,他方のX軸の目盛りを2560として,X=0の軸で2つのグラフ(canvas)が接するように,パッチ上に配置しておくと,-22050+22050の周波数解析の結果を,連続的に表示できるようになります。

そこで,局部発振周波数がfLであるIQミキサの出力を,サンプリング周波数44100HzA/Dコンバータで取り込み,FFTを行って,上に述べたようなグラフ表示を行うと,fL±22050Hzの範囲の信号を見ることができます。上に出てきた,負の周波数というのはイメージしにくいですが,fLと周波数が同じ信号の,ミキサによる変換後の周波数は0なので,その上下の周数が正,負で表現されると考えるとよいかもしれません。

いま,バンドスコープ(FFTのグラフ)のある点に,信号が存在しているとします。その点の周波数を中心とする適当な帯域で信号を切り出し,その周波数と同じ周波数のローカル信号と混合して検波すれば,音声が復元されます。この処理に相当するのが,図5.3FFT,チューニング,BPF2,ミキサ,検波等です。ここで最も重要なことは,信号の周波数を同定することですが,これは簡単です。FFT_LFFT_Rは横幅257ドットですが,それぞれ右端と左端の0のところで重なっています。したがって,2つ合わせて513ドットで,±22050Hzのスペクトルを表します。そこで,長さが513で最小値-22050,最大値+22050Hsliderを,このグラフと左右の位置を合わせて配置し,信号の位置にツマミを移動させます。そうすると,そのときのスライダの出力が信号の周波数ということになります。

5.11では,図4.19と同様,Hsliderの出力で2相発振器の周波数を可変しています。また,現実の信号に似せるため,その出力にnoise~というオブジェクトで発生した雑音を加え,周波数解析を行うサブパッチに供給しています。したがって,スライダのツマミを移動させると,それに合わせて,スペクトルが移動します。

 

5.12 チューニングとミキシング

 

5.12に示されているように,実際のSDRソフトでは,FFTのサブパッチへはオーディオ入力からのIQ信号が加えられ,2相発振器の出力はミキサへ供給されます。また,それと同時に,Hsliderの出力に合わせて,BPF2の中心周波数も変化します。なお,SSBの復調時には,図に示されているような2相発振器を使いますが, AMの復調には移相は必要ないので,90°の位相シフトは行いません。したがって,受信モードに応じて移相の有無を切り替えるような工夫が必要になります。

また,キャリアとサイドバンドの関係は,図5.13のようになっています。したがって,AMの受信時には,BPF2の中心周波数と発振器(図5.12phasor~)の周波数の絶対値は同じで構いません。しかし,SSBの場合には,図5.13のようにシフトさせる必要があります。この他にも,チューニングやミキシングに関しては,注意すべき点があります。それは,ミキサ(オーディオ信号乗算器)に入力する,発振器とBPF2からの出力のレベルです。たとえば,発振器の入力レベルを上げれば受信音量も大きくなりますが,ノイズも増加します。したがって,実際のソフトの作成に際しては,これらのレベルを調整できるようにしておく方がよいでしょう。

 

5.13 BPF2の中心周波数

 

5.5 AGCSメータ

 

5.14の右側が,AGC用サブパッチ(AGC.pd)の片チャンネル分です。このパッチでは,エンベロープフォロワenv~を用いていますが,その入出力関係はというものでした(4.6参照)。env~の次のdbtormsというオブジェクトは,yからxを,つまりdBからRMSを求めるオブジェクトです。こういう操作をするのは,アンプの動作は和ではなく積なので,対数尺度をリニア尺度に戻す必要があるからです。さて,このようにして得られた信号レベルを,ユーザーが設定したAGCレベル(01で割ります。たとえば,信号レベルが0.6AGCレベルが0.3だとすると,得られる値は2になります。オーディオ信号除算器を使って,入力信号をこの値2で割れば(0.6÷20.3),希望する信号レベルが得られます。なお, Pdでは,発振器の出力はデフォールトでピークが1RMS)に設定されており,これは十分に大きな音量なので,AGCレベルも01でよいであろうと考えられます。

5.14の左側は,AGCの機能をテストするためのパッチです(AGCtest.pd)。ブルーの楕円で囲まれた数値は,信号のピークが0.707,したがって,RMS0.499であることを示しています。一方,右側の緑色の楕円で囲まれた数値は,AGCレベルであり,0.283RMSに設定されています。左側の緑色の楕円で囲まれた数値は,出力された音のRMS値であり,設定されたAGCレベルと同じであることが見て取れます。信号レベルを変えるための上側のHsliderを,動かしてみて下さい。AGCが利いているので音量も,グラフの波高も変化しないはずです。なお,env~のハニング窓のサイズはデフォールトでは1024ですが(4.6参照),AGCの応答を速めるため,AGC.pdおよびAGCtest.pdでは256にしています。AGCについてもう1点付け加えておくと,実用に際しては,この機能をOn / Offするスイッチがある方が便利だということです。その方法については,設定の切り替えの節で説明します。

 

5.14 AGC用サブパッチAGC.pd(右側)の片チャンネル分と,テスト用パッチAGCtest.pd(左側)

 

私たちが受信機(SDRではなくて,Hardware Defined Radio)を自作する場合,SメータはAGC電圧で振らせることがほとんどでしょう。SDRの場合は,信号レベルを容易に知ることが出来るので,図5.15のように,ミキサの出力を直接表示する方が簡単です。このパッチは, 4.6節の図4.30と基本的に同じものです。1つ違う点は,expr~ ($v1+$v2)/2というオブジェクトでIQ信号の平均を求め,それに基づいて信号強度を計算しているところです。expr~というオブジェクトは,オーディオ信号に関する任意の計算式を表現するため使われます。expr~では,変数名は必ず$vで始まる必要があり,その後に数字が付きます。この数字はexprの場合と同様,左端から123と順序付けされるインレットの番号を表しています。

 

5.15 Sメータ用パッチ(SmeterUnit.pd)

 

ところで,Pd拡張版にはcompressor~というオブジェクトも準備されています。このオブジェクトは,左インレットから入力されたオーディオ信号に対して,右インレットから入力された-15の範囲のレベルに応じたコンプレッション処理を行い,アウトレットから出力します。したがって,場合によっては,AGCに類似した働きをします。図5.16 (compressor3.pd)は,compressor~の機能をテストするためのパッチで,オーディオ信号(800Hzの純音)のレベルを変化させ,compressor~を通過した音の波形や大きさ,聞こえ方が,コンプレッション・レベルによってどのように変わるかを観察できます。

 

5.16 compressor~のテスト(compressor3.pd)

 

VRというラベルのNumberの値を変化させたときの,オーディオ信号のレベルはRawという名前のNumberに表示され,compressor~を通過した信号のレベルは,CLというラベルのNumberに示されます。また,コンプレッション・レベルは水平ラジオボタンによって切り替えられます。図5.17は,compressor~への入出力レベルの関係が,コンプレッション・レベルによって変化する様子を示したものです。図から分かるように,コンプレッション・レベルが大きくなると,入力が変化しても出力はほとんど変化しなくなるので,AGC的な機能が期待できます。ただし,入力レベルに関係なく同様な働きをするので,大信号が入力されると音が歪んでしまいます。したがって,この機能を使う場合はcompressor~への入力レベルには十分注意する必要があります。

 

5.17 各コンプレッション・レベルにおける入出力レベルの関係

 

5.6 検波

 

本書では,当面の目標として,SSBAMが復調できる受信プログラムを目指すことにします。そこで,まず,これらが,ソフトウェア的にはどのようにしたら実現できるか,みてゆきたいと思います。ネット上でいろいろ探してみたのですが,残念ながら,私のレベルにあった分かりやすい説明はありませんでした。仕方ないので,埃を被った高校時代の数学の記憶をひっくり返しながら,理屈を考えてみました。したがって,正確でないところや間違っているところもあるかもしれません。しかし,考えた理屈に従って作ったプログラムで復調できれば,理屈そのものも,そんなに見当はずれではないだろうという,お気楽アマチュアモードで取り組んでみました。

 

5.6.1 AM

5.18をご覧頂くと,IQミキサの2つの出力に対してという計算を行えば,AM波は復調できそうです。

 

5.18 AMの復調原理

 

キャリアが,変調信号がとすると,AM波は以下のようになります。

 

 

この変調信号に,位相が90°ずれた局部発振器からの信号を乗じると,以下のような結果が得られます。

 

 

*も高周波であり,しかもIQともにオーディオ帯域のローパスフィルタを通過します。したがって,カットオフ周波数以下ののみが取り出されることになります。これをI’Q’とします。

 

 

両者を二乗して平方根をとると,以下のようになります。

 

 

この式の第2項は定数,すなわち直流成分なので,これをカットすれば,変調信号が得られます。ただし,ミキサに到来する信号の中にはさまざまな*のものがあり,ミキサのローパスフィルタの帯域も広いので,パソコンへは複数の信号が送り込まれることになります。その中から,特定の信号を選ぶには,図5.12のようなチューニングをおこないますが,後述するSSBとは異なり,Q成分をさらに90°移相する必要はないので,図5.19のようになります。

 

5.19 チューニングとAM検波

 

5.6.2 SSB

IQミキサを使ったUSB / LSBの復調原理については,Campbell (1993)に比較的詳しい図が載っていました[4]。これを参考にしながら,何とか原理を納得しようと格闘した結果が図5.20です。この図は,局部発振周波数よりだけ周波数が高いUSBと,だけ低いLSBIQミキサに入力されたとき,Q成分をさらに90°移相したものとI成分を加算もしくは減算することで,LSBあるいはUSBが復調されることを示しています。したがって,実際のパッチでは,図5.19の検波部をexpr~ $v1+$v2あるいは,expr~ $v1-$v2とすればよいことになります(図5.21参照)。なお,LSBUSBでは0Hzを中心にしてスペクトルが反転するので,図5.21BPF2に入力されるIとQを両者間では入れ替えてやる必要があります。

 

5.20 SSBの復調原理

 

5.21 チューニングとLSBの復調

 

5.7       ノイズ除去

 

5.7.1 ノッチ・フィルタ

Pdにはbsw2~という拡張オブジェクトがあります。これは,そのままノッチ・フィルタとして使えるので,ビート音の除去などに役立ちそうです。インレット,アウトレットの役割は図5.21のとおりです。

 

5.22 ノッチ・フィルタ

 

5.7.2 denoiser

ノイズ除去用のパッチとして,Magnusさんによってdenoise.pdというものが公開されています。これサブ・パッチの形式で提供されており,4つのインレットと1つのアウトレットを持っています。アウトレットは処理されたオーディオ信号の出力で,インレットは左から,オーディを入力,ノイズ処理のタイプ指定,閾値(信号とノイズの境界)の設定,pitchednoisyかの指定になっています。処理タイプの指定は0から4までの数値で行い,ノイズ処理をしない場合は0を入力します。最後のインレットは0でpitched,1でnoisyになります。前者では雑音がピュルピュルと言う音で聞こえ,後者の場合はザーッ,シャーッというような,まさに雑音らしい音で聞こえます。

 

5.23 denoise.pdのテスト(DeniseTest.pd)

 

5.23は,denoise.pdをテストするために作ったパッチで,サブパッチの中にdenoise.pdが入っています。Webブラウザで前述したURLを開き,denoise.pdという名前で保存します。これをPdで開いて全てを選択し,コピーします。次に新しいパッチを開いてpd denoiserというオブジェクトを作り,そこに,先ほどコピーしたものをペーストします。これでdenoise.pdが使えるようになります。
このページの最後に示しているSDRソフト"GIYEMON-C-0W2.pd"にも,Magnusさんの許可を得てdenoise.pdが組み込まれています。

 

5.7.3 noise smoother

ある信号を連続的にサンプリングしたとき,それが,規則性をもたないランダムな雑音であれば,サンプル間には関係がない(無相関)ので,連続する複数のサンプルを多数回足し合わせて平均すれば(移動平均),+方向と−方向が全体として相殺され,振幅は0になります。したがって,雑音と規則性をもった音声が重畳した信号に対して移動平均を実施すれば,雑音を低減させることが出来ます。

 

5.24 移動平均の原理(10個のサンプルを平均する9次の移動平均の場合)

 

5.25 移動平均の例

 

5.24は移動平均の原理図です。また,図5.25には,サイン波にランダム雑音が重畳した信号から,移動平均によって雑音成分が低減する様子が示されています。この図を見れば分かるように,移動平均によって,急激な変化の雑音成分が除去され,ゆったりとしたサイン波が復元されています。したがって,移動平均はローパスフィルタと考えることが出来ます。

5.26は移動平均の効果を確かめるための,サンプル・パッチnoisesmoother.pdです。初期状態では移動平均処理がOFFになっているので,DSP処理をONにすると,雑音と600Hzの純音が加算されたものが聞こえます。そこで,移動平均のラジオ・ボタンをONにすると,雑音が低減された音が聞こえるようになります。

5.24をご覧になれば分かるように,移動平均では時間的にずれた(遅れた)データの平均を取ります。この遅れを作り出すのが,図5.26中の「z~」というオブジェクトです。このオブジェクトの正式な書式は「z~+半角スペース+数値」で,最後の数値で何サンプル分遅らせるかを指定します。デフォールトは1なので,何も指定しないと1サンプルの遅れとみなされます。図5.269つのz~の後に,1から9の数値を入れておくと,通常の9次の移動平均になります。しかし,このパッチでは Hsliderによって,この数値を17の範囲で変化できるようにしています。もしHsliderの値が2ならば,遅れが024,・・・19のサンプルで移動平均が行われることになります。信号の状態によっては,通常の移動平均よりも,聞きやすくなることがあったので,このようにしてみました。なお,図5.26では各サンプルを単純に足し合わせていますが,各サンプルに重みを付けて(定数を掛けて)足し合わせることも出来ます。これが,いわゆる,FIR (Finite Impulse Response:有限インパルス応答)フィルタで,フィルタ特性と定数の関係などに興味がある向きは,ディジタルフィルタ関係の書籍などをご覧になるとよいでしょう。

 

5.26 移動平均のパッチ(noisesmoother.pd)

 

5.8 設定の切り替えと諸情報の表示

 

ここまでで,SDR用ソフトウェアに必要な基本的機能については,ほぼ説明が終わりました。後は図5.3に示されているような順番で,各機能をつないでゆけば出来上がりです。ただ,ハードウェアを実装する時もそうですが,いくつかの機能をまとめてブロック化するとか,半固定抵抗などはケース内部に隠すように,使用頻度の低いコントローラ類はサブパッチ内に含めるなど,蜘蛛の巣配線にならないような事前の計画も必要です。そこで,先ず,どのようなコントローラ類や表示が必要か,まとめておきましょう(図5.27)。

 

5.27 SDRを構成する各機能に必要なコントローラと設定情報の表示

 

少しでも見た目の良いSDRソフトを作ろうと思えば,コントローラと表示器だけをフロントパネルに出し,後は全てサブパッチの中に隠してしまう必要があります。図5.1は,そのような例の1つです。しかし,最初からこのようなものを作るのは,間違いも起こりやすいと思います。そこで,先ず,見栄えはあまり気にせず,基本的な機能だけを備えたものを作り,それを徐々に発展させるという方法を採りたいと思います。

 

5.9 AM受信機

 

5.28は最も簡単なAM受信機のパッチです。SメータやAGC,ノイズ除去機能もありませんし,周波数や受信モードの表示もできません。見てくれが良くないところは,昔のラジオ少年が作っていたシャーシむき出しの「ラヂオ」と同じでしょう。しかし,ちゃんとチューニングもできるし,NHKやその他の民間放送を良い音で受信できます。生意気にバンドスコープ機能もついています。全体的な機能や感度はこちらの方が,ぐんと上だと思います。といっても,何も特別なことをしているわけではありません。これまで,個別に説明してきた機能を,素直につなぎ合わせただけです。図中に参照すべき箇所を示しているので,サブパッチをクリックして開き,参考箇所と比べると簡単に理解できると思います。ただ,ミキサの前のGain_&_ATTというサブパッチだけは,これまでに説明していなかったので,この節で解説しておきましょう。

 

5.28 AM受信機のパッチ(AM_Prot2.pd)

 

5.29が,サブパッチGain_&_ATTの内部です。水平ラジオボタンGain_&_ATTから送られた06の数値は,先ず,このサブパッチ内にあるメッセージ受信オブジェクト(図4.3参照)で受け取られます。この数値は,2つの処理を受けます。1つは,”expr 5*$f1-30”という数式で-30から0まで5ステップで変化する数値に変換され,この値を左下のMessageオブジェクトに入力して,receive-symbolプロパティがinputlevelになっているCanvasのラベルを,この数値に変えるという処理です(図4.5参照)。この処理は,このサブパッチのゲインをdB表示するために用意したものですが,メイン・パッチにそのようなCanvasを用意していないので,実際には表示されません。

 

5.29 サブパッチGain_&_ATTの内部

 

もう1つの処理は,上述したdB値(対数尺度)をリニアな尺度に変換するというものです。-30から0の値を数式”expr 6+$f1/10”3から60.5ステップの数に変換し,それを累乗オブジェクトであるpowの右インレットに入力します。このオブジェクトの左インレットには,数値10を送り出すMessageオブジェクトが繋がっています。このMessageオブジェクトは,その上の数式の出力を受け取るたびに10を出力します。その結果,powからは103から106の値が出力され,左右のインレットから入力された信号が10001000000倍されることになります。つまり,1000-30dBに,10000000dBに対応しているわけです。したがって,このdB値というのは絶対値ではなく,倍率の相対的関係を表しているに過ぎません。なお,サブパッチBandScopeで行われるFFT処理へ入力される信号の増幅率を,FFT_Magという水平ラジオボタンで決める際にも,上述したのと同じような処理を行っています。

AM受信機のパッチには,あとkeycominというサブパッチがあります。図5.30に示されているように,その中にはさらに2つのサブパッチが含まれています。1つはkeycomというサブパッチで,パソコンのキーボードから入力された文字列を,シリアルポート経由で局部発振器(図2.7)に送るために使われます。第2章で紹介した局部発振器では,コントローラのシリアルポートへ,F(もしくはf)+8桁の数列+Return(もしくはenter)が入力されると,それはHz単位で発振周波数が入力されたものと見なします。したがって,最上位の桁は十MHzの単位になります。たとえば,500KHz等のように上位の桁は必要なくても,00500000のように,0を入力するようにして下さい。またFの代わりにS(もしくはs)が使われると,ロータリーエンコーダの1クリックで変化する周波数と見なされます。ただし,この場合は,不必要な上位桁は入力しなくて結構です。

もう1つのサブパッチはkeyinで,キーボードから入力された局部発振器の周波数に基づき,チューニング用のスライダーの変化に合わせて,現在の受信周波数を表示するために使われます。ただし,図5.28のパッチでは受信周波数表示の機能はまだインプリメントされていないので,このサブパッチは無くても構いません。このサブパッチの働きを見たい場合は,FfescenterDelなどのキーを押してみて下さい。そうすると,もし図5.30に何か表示されていたら消去されるはずです。また,数字を入力すると,に表示されます。に示された数値が局部発振器の発信周波数であり,チューニング用スライダが中心位置にあるときの受信周波数になります。この機能は本書で作るSDRソフトの最終バージョンにインプリメントしたいと考えています。

 

5.30 サブパッチkeycominの内部

 

5.28AMSDRソフトと,第2章で紹介したミキサ(図2.3)と局部発振器(図2.7を用いて受信実験を行ってみました。手順は以下のとおりです。

①局部発振器に使われているUSB−シリアル変換モジュールのための,仮想COMポート・ドライバがインストールされていることを確認する(2.3.2参照)。

②図5.30の左上部分に示しているように,USB−シリアル変換モジュールとMacの接続はポート5と仮定してパッチを作っています。しかし,接続ポートが異なればポート番号は変わるので,4.8節で述べた方法で確認し,その結果に合わせてポート番号を書き換え,保存しておく。

③図2.14のようにミキサ,局部発振器,パソコンを接続する(プリセレクタ,アンプ未使用)。

④図5.28のパッチを起動し,右端のBangをクリックして信号処理を開始する。

HsliderのツマミをFFTスコープの中央の線に一致させる。

⑥たとえば,567KHzを受信したいとすると,f00567000とキーボードから入力し,シフトキーを押しながら,Hsliderのツマミを左右どちらかに数十Hz移動する[5]。これで,音声信号が再生される。この若干の周波数シフトを行わないと,パッチ内の局発の周波数が0となるので,うまく検波できない。

⑦上で述べた⑤,⑥の代わりに次のようにしてもよい。

・受信したい周波数の近傍の値をキーボードから入力する。

FFTスコープに受信信号が表示されるので,Hsliderのツマミを,信号のピークの近くまで移動させる。微調整は,シフト+ドラッグで行う。

以上で,音声信号がキレイに再生されるはずです。

受信実験の結果,NHK,民放を問わず中波のAM放送が大変良く受信できました(上述したように,プリセレクタは使用していません)。8階建ての集合住宅の5階に住んでいるので,ベランダからグラスファイバー製の釣り竿を2.5mほど突き出し,その中間にペットボトルにビニール線を密巻きにしたローディングコイルを付け,その前後に全体で10m程のビニール線を巻き付けたものをアンテナとして使用しています(アースは5m10m2本のビニール線を,ベランダに這わせています)。現在,日本で入手しやすいソフトウェア・ラジオの基板は,アマチュアバンドの受信を目的としたもののみではないかと思います。中波受信に関しては,伊藤さんがご自身のホームページで紹介されています(http://cba.sakura.ne.jp/sub04/jisaku31.htm)。なお,本書のAppendix 3でも,CQ付録のSDR基板と組み合わせて使う中波帯と3.5MHz,および7MHz帯の受信を可能にするコンバータを紹介しています。

 

5.10 SSB受信機

 

LSB受信機のパッチはLSB_Prot2.pdUSB受信機のパッチはUSB_Prot2.pdです。これらとAM受信機のパッチ(図5.28)を比較すると,OSC_&_MixBPF2と検波部のサブパッチが異なることが分かると思います。以下,それぞれの違いを具体的に見てゆきましょう。ただし,検波部はどのモードも非常に簡単です。したがって, 5.6節で述べた以上に付け加えることはありませんし,各パッチの検波部を比較するだけで,違いは十分理解できると思われるので,説明を繰り返すことは避けたいと思います。

さて,図5.31は,AM受信機のOSC_&_Mixサブパッチです。5.6節で述べたように,AM検波の場合は,クアドラチャ・ミキサのQ成分をさらに90°移相する必要はないので,青枠で囲まれたオブジェクトを追加することで移相を0°にしています。一方,SSBでは90°の移相が必要なので,この部分が不要になります。

 

5.31 AMSSBOSC_&_Mixサブパッチの違い

 

5.32は,AMLSBUSBそれぞれのBPF2を示したものです。5.4節で述べているように,BPF2の中心周波数とサイドバンド,あるいはOSC_&_Mixサブパッチ内の発振器(phasor~)の周波数との関係は,図5.13のようになっています。それぞれのモードのBPF2は,図5.13に示されている仕様を満たすように作られたものです。SSBの場合は,サイドバンド切り替えの操作が容易で,逆サイドバンドの抑圧も十分に行え,通過帯域内ではできるだけフラットな特性であり,ノイズもできるだけ押さえたいということで,高次のチェビシェフ型ローパスおよびハイパスフィルタが使われています。一方,AMの場合は,帯域も広いしSSBのようにサイドバンドの切り替えなども必要ないので,中心周波数とバンド幅を指定できる2次のバンドパスフィルタbpw2~1つ使うだけで,簡単にすませました。

なお,SSBBPF2には数式オブジェクト(色枠で囲まれた部分)や中心周波数inletの正負判断を行うオブジェクトもありますが,これらは,チューニング用スライダの動きや帯域幅に応じて,2つのフィルタのカットオフ周波数が適切に設定されるよう設けてあります。数式オブジェクトにNumber オブジェクトを接続し,チューニング・スライダを動かしてみて下さい。その働きが,よく実感・理解できると思います。

 

5.32 AMLSBUSBBPF2の違い

 

最後に,LSBUSBにおける,オーディオ入力からのI信号とQ信号の入れ替えについて見ておきましょう(図5.33)。これは,5.6.2 SSBで述べたように,LSBUSBでは0Hzを中心にしてスペクトルが反転するので,これに対応するためです。

 

5.33 LSBUSBにおけるIQ信号の入れ替え

 

5.11 AM/SSB受信機1

 

次に,AM/SSB受信機のパッチ(SDR_Prot2.pd)を示しておきましょう。このパッチはAMLSBUSBの受信が可能であり,5.9節と5.10節で解説したモード毎の機能や接続の違いが,モード・スイッチによって切り替えられるようになっています。BPF2OSC_&_MixDETECTの各サブパッチに”r mode”というメッセージ受信オブジェクトがあり,一方,モード切替ラジオボタンのsend-symbolプロパティがmodeになっています。各サブパッチでは,このラジオボタンから送られてくる数値(0:左端USB1:中LSB2:右端AM)に応じて,機能や接続を切り替えています。

 

5.34 AM/SSB受信機のパッチ1(SDR_Prot2.pd)

 

LSBの受信テストは7MHzで行いました。5.9節で述べたような,かなりいい加減なアンテナでも,7MHzは一日中よく受信できます[6]USBの受信テストは,14MHz以上のハムバンド,およびグァムから5.765MHz(夜間)で放送されている,米軍放送のAFN (American Forces Network)を利用しました。両方とも,問題なく受信できました。ただ,これらは,7MHzのハムバンドほど安定していつでも聞こえるわけではないので,調整用の信号源としては,それほど使い勝手がよくありません。そこで,CQ誌の過去の記事などを参考に[7],手持ちのパーツを使って,図5.35のような簡易型のUSBジェネレータを製作し,これも併用しました。1KHzの低周波発振器にクロックジェネレータを使っていますが,AFの信号源は何でも構わないでしょう。実際に確かめたわけではありませんが,雑誌記事によれば,TA7358APAF INにコンデンサマイクを接続しても,十分変調がかかるようです。また,この回路では,キャリアバランスを崩すことでAMCWも発生できるようにしています。

 

5.35 USBジェネレータの回路図

 

5.36は,図5.35の出力を自作のπ型50Ωアッテネータを経由して図2.3SDRに入力し,自作SDRソフトでスペクトル表示させたものです。図5.35に示されているように,このUSBジェネレータのキャリア周波数は,11.0408MHzです。図5.36上のCWのスペクトルから,この周波数が分解能の範囲で,正確に示されていることが分かります。また,図5.36下のUSBのスペクトルは,キャリアより1KHz上に,1KHzの低周波信号があることを示しており,右下のオシロ画面にはその信号波形が表示されています。この図から,ハードウェア,ソフトウェアを合わせたシステム全体として,このSDRが比較的うまく動作していることが見て取れると思います。

5.36 CWUSBのスペクトル

 

5.12 AM/SSB受信機2

 

5.12.1 各部分の働き

前節までの受信機パッチには,アクセサリ回路は何も含まれていませんでした。また,信号や制御のための配線がむき出しの,いわばバッラクセットのような状態でした。この節では,アクセサリ回路を付加し,表面には操作のためのスライダやスイッチだけを出した,少しは見かけのよいパッチを紹介したいと思います。

 

5.37 AM/SSB受信機のパッチ2 (GIYEMON-C-0W2.pd)

 

5.37AM/SSB受信機用パッチのスクリーン・ショットです。以下,図に付された番号にしたがって,機能を説明しましょう。

①入力信号の周波数解析結果が,ここに表示されます。サイズは左右とも512ピクセルなので,サンプリング周波数を44.1KHzとすると,1ピクセルあたりの周波数分解能は約43Hzということになります。

②このHsliderの操作によって,何かが変化することはありません。たとえば,強い信号の位置を覚えておきたいときなどに,ツマミをその位置まで動かしておくというような使い方をします。

③受信周波数を変化させる,チューニング用スライダーです。ここから出力される値は,最上位サブパッチSDR Main(⑮)に含まれるサブパッチFreqDisp内のFine_TuneというNumberオブジェクトに渡されます。この値の引き渡しはreceiveオブジェクトではなく,Numberオブジェクトのreceive symbolプロパティを使っています。

④上記①のスペクトル表示を適切なレベルにするための,倍率切り替え器です。この値はサブパッチBandScope内の” r fftmag”というreceiveオブジェクトに渡されています。

⑤サブパッチSDR Main(⑮)内の右下部分にある,”tabwrite~ AF_Level”というオブジェクトから検波された音声信号の波形が送られてきて,ここで表示されます。

⑥右端は,DSP処理ON/OFFスイッチです。ここから送られるメッセージは,SDR Main(⑮)内の右下部分にある,”r pow”というreceiveオブジェクトに送られます。

残りの3つは,左から受信信号の録音開始,録音/再生ストップ,再生ボタンで,これらからのメッセージは,SDR Main(⑮)内のサブパッチRec&Playにあるreceiveオブジェクトに送られます。録音されたファイルは常にtest.wavという同じ名称で,このソフトと同じ階層に保存されます。したがって,連続して異なる録音を行うときは,前に録音したファイルの名称を変更しておいて下さい。録音の度に,ファイル名称を問い合わせるようにすることもできます。しかし,録音したいのは,大抵,緊急の場合が多いので操作をスピーディーにすることを優先しました。

⑦低周波増幅器のボリュームに相当するもので,スライダーの値は,SDR Main(⑮)内の” r AFBAR”オブジェクトに送られます。

Sメータです。信号のrms値は伸縮する棒グラフとして,ピーク値は上下に移動する横線として現されます。前者は,SDR Main(⑮)内のサブパッチSmeterにある,” s slevel”というsendオブジェクトから送られてきます。ピーク値は,一旦,” s peak”というオブジェクトから,Toggle(図5.37(c))オブジェクトに送信され,そこから,VUオブジェクトの右インレットへ入力されています。このようにしたのは,VUオブジェクトが,2つのreceive symbolプロパティを持っていないためです。

⑨この点線で囲まれた部分は,受信(局部発振)周波数を変更するための機能を持っています。

Band_SW:左端のバンド・スイッチは左から567KHz(札幌NHK1),747KHz(札幌NHK2),1287KHzHBC),1440KHzSTV),3.55MHz3.7505MHz3.798MHz7.065MHz14.225MHz18.139MHz21.3MHz24.96MHz28.6MHにプリセットしてあります。この水平ラジオ・ボタンをクリックすると,その場所に対応したプリセット周波数の4倍波が,局部発信回路からIQミキサへ入力されます。したがって,サンプリング周波数が44.1KHzだとすると,プリセット周波数±22.05KHzが受信可能となります。プリセット周波数は,それぞれ,NHK1NHK2HBCSTV3.5M13.5M23.5M37M14M18M21M24M28Mというサブパッチに書き込まれています。Findメニューでこのサブパッチ名を検索すれば,簡単に見つけることができます。その中を見れば,セットすべき周波数の書式は容易に理解できるでしょうが,以下に簡単に書いておきましょう。

1) Fもしくはfで始まり,キャリッジ・リターン(CR)およびライン・フィード(LF)で終了する。

2)10MHzの位からHzの位まで途中(MHzと百KHzおよびKHzと百Hzの間)に小数点を挟みながら,数字を並べる。

3)上述の数字,小数点,アルファベットおよびCRLFなどは,アスキー値に変換してMessageオブジェクトに書き込む。

どのサブパッチも同じ構成なので,数値(に対応したアスキー値)を変更するだけで,プリセット周波数を簡単に変更できます。

Step:この水平ラジオ・ボタンの右隣のUpDownBangもしくはロータリーエンコーダのクリックによって,局部発振回路の出力周波数を上下することができます。このラジオ・ボタンでは,そのときの1クリック当たりの変化幅を選択します。プリセットされているステップ周波数は,左から1Hz10Hz100Hz1000Hz10000Hzです。これらの値を局部発信回路に送るためのサブパッチはstepfreqという名前なので,”pd stepfreq”で検索し,さらにその中の1Hz10Hz等のサブパッチ内部をのぞいてみて下さい。Band_SWの場合と類似の書式で,周波数がセットしてあるのが分かると思います。書式を簡単にまとめると,以下のとおりです。

1) Sもしくはsで始まり,キャリッジ・リターン(CR)およびライン・フィード(LF)で終了する。

2) セットしたい周波数をHz単位で現す。

3) 上述の数字,アルファベットおよびCRLFなどは,アスキー値に変換してMessageオブジェクトに書き込む。

UpDown:このBangによって局発周波数を上下させるとき,その変化幅は,上述したラジオ・ボタンで選択された周波数でなければなりません。したがって,UpDownBangからのメッセージを受けて処理を進めるサブパッチup&downerでも,Step水平ラジオ・ボタンからの値を受け取るようになっています。この受け取りは,” r stepfreqsw”というreceiveオブジェクトによってなされています。また,上述したサブパッチはstepfreqでもStep水平ラジオ・ボタンからの値を受け取るので,そこにも,” r stepfreqsw”というreceiveオブジェクトはあります。” r stepfreqsw”というキー・フレーズで検索を行うと,サブパッチstepfreq内のものが表示されます。そこで,FindメニューのFind Againを実行すると,今度は,UpDownBangに関連したup&downer内の,r stepfreqswオブジェクトが表示されます。ステップ周波数に関する機能を変更する場合は,これら2つの”r tepfreqsw”オブジェクトに関連した部分を,共に修正する必要があります。

Key_OFFまたはKey_ON:このBangはトグル・スイッチになっており,クリックする度にKey_OFFKey_ONが交互に表示されます。これから出力されたメッセージは,最上位サブパッチSDR Main(⑮)に含まれるkeyonoffswというサブパッチ内の1番上に位置しているToggleに渡されます。Key_ONのときは,キーボードから局発周波数やステップ周波数を設定できます。入力の書式は,F(もしくはf)+8桁の数列+Return(もしくはenter)が入力されると,それはHz単位で発振周波数が入力されたものと見なします。したがって,最上位の桁は十MHzの単位になります。たとえば,500KHz等のように上位の桁は必要なくても,00500000のように,0を入力するようにして下さい。またFの代わりにS(もしくはs)が使われると,UpDownBangもしくはロータリーエンコーダの,1クリックで変化する周波数と見なされます。ただし,この場合は,不必要な上位桁は入力しなくて結構です。なお,Key_ONの状態では,UpDownBangが機能しないようにしているので,設定終了後はKey_OFFの状態にして下さい。

⑩これは,5.7.2で紹介したdenoiserそのものです。ラジオ・ボタンの左端がOFFで,後はdenoiseのタイプを決め,上のHsliderはノイズ処理の閾値を調整します。これらが出力するメッセージや値は,SDR Main(⑮)内のサブパッチNoiseRedに渡されます。

⑪これは,5.7.3で紹介したnoise smootherです。ラジオ・ボタンやHsliderが出力するメッセージや値は,SDR Main(⑮)内のサブパッチchienに渡されます。

5.5節で解説したAGCを実装したもので,左はON/OFFスイッチ,Hsliderはレベル調整用です。これらが出力するメッセージや値は,SDR Main(⑮)内のサブパッチAGCに渡されます。

⑬検波後の音声信号の通過帯域を決める,ローパスフィルタとハイパスフィルタのカットオフ周波数を調整します。これらの処理を担当するのは,SDR Main(⑮)内のサブパッチはBPF3です。

⑭中波放送やアマチュア・バンドの周波数を記したメモで,クリックするとオープンします。

サブパッチなのにSDR Mainとはちょっと変な表現ですが,最も上位のサブパッチで,この中にいろいろな機能のサブパッチが含まれています(図5.38)。

 

5.38 サブパッチSDR Mainの内部

 

⑯いろいろな設定や,現在の状態を表示するパネル(Canvas)です。

受信周波数(最上段):③のチューニング用スライダーの移動および局発周波数に応じて変化します。この周波数はSDR Main(⑮)内のサブパッチFreqDispで計算され,一番下のmessageボックスによって,receive symbolmycanvasであるcanvasオブジェクトのラベルに書き込んでいます。

ATT(2行目):入力レベルを調整するラジオ・ボタン(⑰)の値を,サブパッチGain_&_ATTで受け,dB値を計算して,receive symbolinputlevelであるcanvasオブジェクトのラベルに書き込んでいます。このdB値は,相対的なものであり,値が物理量に対応しているわけではありません。

Mid_Fil(3行目):③のスライダーで選択した受信周波数に対して,帯域制限を行うサブパッチがBPF2です。帯域幅は,BPF2内の右下のmessageボックスによって,receive symbolmidfilであるcanvasオブジェクトのラベルに書き込まれます。なお,この帯域は半固定であり,また変更は,チューニング・スライダの次回の移動(受信周波数の変化)から有効になります。

LPFおよびHPF(4,5行目):⑬によって変更された,検波後の音声信号に対する,ローパスおよびハイパスフィルタのカットオフ周波数は,サブパッチBPF3内のmessageボックスによって,receive symbolがそれぞれlpfdspおよびhpfdspである,canvasオブジェクトのラベルに書き込まれます。

バンド(6行目左):⑨のBand_SWによって,現在,どのバンドが選択されているかを表示します。選ばれたバンドは,サブパッチNHK1NHK2HBCSTV3.5M13.5M23.5M37M14M18M21M24M,および28M内のmessageボックスによって,receive symbolprebandであるcanvasオブジェクトのラベルに書き込まれます。

ステップ周波数(6行目左): ⑨のStepによって選択された局発周波数の変化幅を表示します(キーボードからの入力は,表示変更に反映されません)。選ばれたステップ周波数は,サブパッチ1Hz10Hz100Hz1KHz10KHz内のmessageボックスによって,receive symbolstepfreqであるcanvasオブジェクトのラベルに書き込まれます。

NS(7行目): ⑪のnoise smoother機能のOn/Offが,サブパッチchien内のmessageボックスによって,receive symbolnoiseblankerであるcanvasオブジェクトのラベルに書き込まれます。

モード(8行目左): ⑲によって選択された受信モードが, サブパッチmodesw内のmessageボックスによって,receive symbolrcvmodeであるcanvasオブジェクトのラベルに書き込まれます。

AGC[8](8行目中): ⑫のAGC機能のOn/Offが,サブパッチAGC内のmessageボックスによって,receive symbolagcswdspであるcanvasオブジェクトのラベルに書き込まれます。

NR(8行目右): ⑩のdenoiserの動作状態が,サブパッチNoiseRed内のmessageボックスによって,receive symboldenoiseであるcanvasオブジェクトのラベルに書き込まれます。

⑰入力レベルを調整するラジオ・ボタンで,選択された値は,サブパッチGain_&_ATT 内のreceiveオブジェクトG&Aに渡されます。

⑱既に5.1節で述べたように,パソコンに入力された2つの信号成分IQからSSBを復元するには,I成分の位相をさらに90°進める必要があります。そのための1つの方法は,90°の位相差を持つ信号で,2つの入力信号を周波数変換することです。ミキサへ入力される発振器からの信号レベルを調整するのが,このスライダーです。スライダーからの値は,サブパッチOSC_&_Mix内のreceiveオブジェクトosclevelへ渡されます。

⑲このラジオ・ボタンで,受信モードを選択します(左からUSBLSBAM)。選択された値は,modeという名称のreceiveオブジェクトに渡されます。受信モードによって変化させねばならないパラメータは1つではないので,このオブジェクトは,以下のような複数のサブパッチに含まれています。

サブパッチBPF2:③のスライダーで選択した受信周波数に対して,帯域制限を行うフィルタの帯域幅や中心周波数は,受信モードによって異なるので(5.3節,図5.13参照),必要になります。

サブパッチmodesw:⑯のパネル(Canvas)で,受信モードを表示するために必要です。

サブパッチOsc_& _Mix:パソコンに入力された2つの信号成分IQからSSBを復元するには,I成分の位相をさらに90°進める必要があります。しかし,AMの復調には移相は必要ないので,90°の位相シフトは行いません(5.1節,5.4節参照)。したがって,受信モードに応じて移相の有無を切り替えるような工夫が必要になります。そのために,このサブパッチでも,modeという名称のreceiveオブジェクトで受信モード情報を受け取っています。

サブパッチDETECT:検波信号処理を受信モードに応じて変更するため,receiveオブジェクトmodeによる,受信モード情報の受け取りが必要になります。

(a)チューニング用スライダー(③)は,クリックされるとそこへツマミがジャンプするように,プロパティが設定されています。したがって,受信したい周波数へ一足飛びに移動できますが,周波数のジャンプ幅が大きい場合などに,受信音がとぎれてしまうことがあります。その場合には,ツマミ位置をもう一度クリックすれば,回復します。ただ,ツマミ位置のクリックは,僅かですが,受信周波数ズレを生じることがあります。それを避けたいときには,ここをクリックして下さい。ここのクリックで生じたbangは,サブパッチkeycomin内のサブパッチkeyinを経由して(receiveオブジェクトfreqresetsendオブジェクトfreq_set),サブパッチFreqDispで受け取られます。

(b) チューニング用スライダー(③)のツマミを,中央に戻すbangオブジェクトです。ここから出されたbangは,SDR Main内のbangオブジェクトへ渡され,そこから0というメッセージがチューニング用スライダーへ渡されます。その結果,このスライダーは,0を中心に±22050の範囲の値を出力するように設定されているので,ツマミが中央に戻ることになります。

(c) Sメータ(⑧)の項で説明したように,信号のピーク値をSメータへ中継するための役割を担っています。ピーク値は,一旦,サブパッチSmeter” s peak”というオブジェクトから,このToggleオブジェクトに送信され,そこから,VUオブジェクトの右インレットへ入力されています。

 

5.12.2 調整

5.39は,Weaver方式と呼ばれるSSB復調装置の,ブロックダイアグラムです。フィルタのカットオフ周波数や帯域など,細部は異なりますが,本書では,ハードウェア,ソフトウェア合わせて,この図のような方法でSSBの復調を行おうとしています。ハードウェアで点線よりも左側を実現し,パソコンには,図の点線より右側の機能を実装しています。両者の上側と下側の信号ラインが,図のようになっていないと(すなわちクロスしていると),正常な復調が出来ません。これら2つの信号は,パソコンのライン入力の左右チャンネルから取り込まれますが,ハードウェア側の左右チャンネルへの信号の割り当て方によっては,ハード側とパソコン側で信号ラインがクロスすることもあり得ます。そのような場合にも,パソコン側で信号ラインの入れ替えが出来るようにしています。

 

5.39 Weaver方式のSSB復調装置のブロックダイアグラム[9]

 

SD Mainサブパッチ内のBLK1を開くとI-Q-switchというサブパッチがあります。この中にI/Q_Switchという水平ラジオ・ボタンがあり,これで信号ラインの左右入れ替えが可能です。FFT画面(図5.37の①)に信号は表示されているのにうまく復調できないときには,使用してみて下さい。なお,次回の使用の時にも変更結果を生かしたい場合には,変更後に,プログラムをsaveしておいて下さい。これは,他の変更の場合も同様です。

 

5.40 I/Q入力の切り替え

 

Weaver方式でSSBの復調を行う場合,2つの入力レベルが等しくなければなりません。SD Mainサブパッチ内のBLK1を開くとbalancerというサブパッチがあります。この中にあるBalanceというHsliderで,左右入力のバランス調整が可能です。本来,入力レベルの調整はハードウェア側で行うべきものですが,パソコン内部のバランスがよくないものもあります。そのような場合は,安定した信号を受信しながら(あるいは,図5.35のような治具を用いて),2つのVUオブジェクトのレベルが等しくなるように,Balanceスライダーを調整してみて下さい。なお,Resetという名称のBangオブジェクトをクリックすると,デフォールトである中央に,Balanceスライダーのツマミがセットされます。

 

5.41 I/Q入力のバランス調整
脚注



[1] OSに付属しているアプリケーション「Audio MIDI 設定」で,サンプリング周波数を33kHzもしくは48kHzに変更できる機種もあります。

[2]この値は,回路図を元に計算したものです。DR2BSoft66について同様の計算をしてみたところ,前者では70kHz程度,後者では90kHz程度でした。

[3]チェビシェフタイプは通過帯域にリップルがあるといわれていますが,カットオフ特性が急峻なので採用しました。Pdでは,その他にもベッセルやバターワース特性のフィルタも利用できます。詳しくは,http://umatic.nl/workshop/objects.txtを参照して下さい。

[4] Campbell, R. 1993 (January) High performance single signal direct conversion receivers. QST, 32-40. http://www.arrl.org/tis/info/pdf/9301032.pdf

[5] シフトキー+ドラッグで,ツマミを0.01ピクセルずつ移動できるので,周波数のファインチューニングが可能になる。

[6] 3.53.821MHz帯の受信もこのアンテナで行っていますが,14MHz帯はうまく受信できませんでした。そこで,5m1/4波長)ほどのビニール線を,ベランダから2mほど突き出した釣り竿に巻き付けて,14MHz用のアンテナとして使っています。アースは7MHz用アンテナと共用です。

[7]たとえば,以下の記事。

今井栄 50MHz DSBポケット・トランシーバの製作,CQ ham radio, 2006, 10, 96-101.

[8] AGCは,信号状況やパッチの複雑さ(複雑であるほど,信号の遅延が長くなる)で効果に差が出てくるようです。このプログラムに実装したような方法では限界があり,無いよりはましといった程度です。もっと工夫の余地があるので,後の楽しみに取っておきましょう。

[9] Zavrell, R. J. (1997). New low-power single sideband circuit. Philips Semiconductor, AN1981. http://www.nxp.com/acrobat_download/applicationnotes/AN1981.pdf