スペアナ制御ツール

先日,アンリツのスペアナMS2661Aを中古で入手した.
9kHz~3GHzの帯域で,RBWの最小は30Hz(オプション付)と
性能的には納得して購入したが,測定データの保存方法で悩んでしまった.

20181010_061554

メモリインターフェースオプションが付いていて,
PCカードメモリにデータを保存できるようだが,
今時PCカードメモリなど入手困難なので,SD用PCカードアダプタを使ってみた.

結果は残念ながら,”メモリタイプが異なる”とのメッセージが出てNGだった.
このスペアナが作られた時代にはSDは無かったのかもしれない.

仕方がないので,GPIBかRS232Cポート経由で,
データをPCに転送して表示・保存することにした.
ただ,プログラムを作る必要があるので少々面倒だ.
(なので,できればメモリインターフェースを使いたかった)

測定器といえばGPIBというところだが,
PC側にもGPIBインターフェースが必要になり,面倒なのでRS232Cを使うことにした.
ただ,通信速度が9600bps と,今時としてはかなり遅い感じがするのは否めない.

簡単なプログラムを作って試したところ,うまい具合にデータの取得・表示ができた.

42641369_1386471288151860_1717727983411658752_n

42727699_1386471231485199_1732282193058725888_n

必要な人は他にはおそらくいないと思うが,Windows10で動作するMS2661A用の
データキャプチャソフトをこちらに置いておく (  MS2661A.exe ) 

センター,スパン,スタート,ストップ周波数に関しては,
このソフトからリモートコントロールできる.
通信速度が遅いので,データの取得には  3, 4秒かかる.
これが速ければ,リアルタイムでPCに波形表示ができるのだが・・・

FT817ND   433MHz とその第2高調波
FT817_430M

433MHz拡大
FT817_433.000MHz

 

FIRフィルタ

前回AF PSNを複素係数のFIRフィルタで作成したが,その係数を変えれば任意の周波数特性を持ったフィルタが作れることはいうまでもなく,AF PSN はその一例にすぎない.

FIRフィルタの係数は,周波数特性を逆フーリエ変換すれば得られるので手間はかからない.とはいえ手計算できるものでもないので,AF PSN 作成の際に,係数を求めるために作ったツールをここにUPしておいた(Calc_Coeff_of_CPLXBPF.m).

これは,拡張子mが示すようにMATLAB,GNU Octave 上で動くスクリプトである.
GNU Octave はフリーウェアでこちらから入手でき,Windows の場合,octave-4.4.0-w64_1-installer.exe ならインストールは容易かと思う.

スクリプト内でパスバンドの周波数を書き換えて実行すれば,その特性を実現する係数を定義するヘッダファイルが自動生成される.
これをincludeしてコンパイルすれば,設定どおりのパスバンドを持ったBPFが実現できる.
複素係数フィルタであるが,実数部のみ使用すれば普通のフィルタと同じである.

 

さて,前回製作したAF PSNであるが,パスバンド内のリップルとパスバンド外の減衰特性が気になった.周波数特性を求めたところ下図のようになった.

Rect

理由は,窓関数を使用していなかった(=矩形窓)ためである.
そこで,フィルタ係数に窓関数を掛けてみた.
(窓関数はスクリプト内で指定できるようにしてある)

 

Hann 窓
han

Hamming 窓
hamming

Blackman 窓
blackman

Bartlett 窓
bartlett

使用する窓関数としては Hamming か Blackman になるだろう.
Blackman のほうが減衰特性がなだらかであるが,それでも十分急峻な減衰特性なのでこれがよいと思う.
(ヘッダファイルとCソースファイルを更新しているので,日付を確認の上ご利用願います)

AF PSN

PSN方式でSSBを発生させるためのAF PSNを試作した.01
PSN方式のSSBジェネレータは上図のような構成であるが,大概AF PSNの実現がネックとなる.

アナログ回路でAF PSNを実現する方法としては,ナガード型PSN,多段のオールパスフィルタ,PPSNなどが知られている.
これらは,性能が十分でなかったり,回路規模が大きい,部品定数の精度が要求される,など少々難しいところがあり,さらにアナログであるが故,環境(周囲温度など)の変化による特性の変化にも気を付ける必要がある.

そこで今回はAF PSN をディジタル信号処理で実現することにした.これは近年よく見かけるSDRと同様なものである.

まず,SSBの発生方法から確認していく.SSBの生成方法はシンプルに考えれば下図のとおりである.
02
周波数シフトは,AF PSNの後の直交変調器で行われるので,
結局AF PSNとは,AF信号の負(あるいは正)の周波数成分を除去するものである.

ならばバンドパスフィルタ(BPF)で実現できそうだが,通常フィルタの周波数特性は,下図の上段に示すように,正の周波数領域と負の領域で対称なものしか実現できない(実係数フィルタの場合).

03

しかしながら,フィルタの係数を複素数にすれば(複素係数フィルタ),上図下段に示すような非対称な周波数特性をもったフィルタが実現できる.

複素係数フィルタを用い,信号を複素数表現すれば,SSB生成の流れは下図のようになる.
04

今回はこの複素係数フィルタを,dsPIC33FJ64GP802 を用いディジタル信号処理で実現してみた.下図のように,複素係数フィルタの出力の実部がAF PSNの0°出力,虚部が90° 出力に相当する.
05

 

複素係数フィルタの構成は,512Tap FIR フィルタとした.
06

 

フィルタの周波数特性(設計目標)は下図のとおり.
+300Hz~+3kHzのバンドパスで,負の領域はすべて阻止する.
Fres_cmplx

 

これを逆フーリエ変換し,FIRフィルタの係数を求めた.
サンプリング周波数は,使用するdsPICの性能により 約10kHz に設定した.

フィルタ係数(実部:R0 – R511)
FirCoeff_re

フィルタ係数(虚部:Q0 – Q511)FirCoeff_im

複素係数フィルタのプログラムのソースコードを,こちらに置いておく.
dsPIC周辺の接続は下図のとおり.07

 

動作確認の結果を以下にまとめておく.

20180706_071500 dsPIC

入力200Hz
f0200

入力300Hz
f0300

入力1000Hz
f1000

入力2000Hz
f2000

入力2900Hz
f2900.jpg

入力3000Hz
f3000

これらの結果を見る限りは使い物になりそうな感じがする.
部品選別や調整などなしに,プログラムを書き込みさえすればこれと全く同じ結果が得られる.
あとは実際にSSBジェネレータにしたときにどのような品質の信号になるか,確認が必要だろう.

VFO

カウンタ基板にはSi5351が実装できるようにすでにパターンを作っているので,
次にダイアルイメージ表示のVFOをやってみようと思う.
カウンタの場合はすべて受け身の動作でよかったが,
VFOとなると,システムから考え直さないといけない.

20180507_211713~2

周波数はエンコーダで設定するが,
周波数に応じて外部のバンドパスフィルタを切り替える,
などということも必要となるから,そういう制御信号をださないといけないし,
どの周波数のとき,どのフィルタを使うのか,
そこはユーザが設定できるようにしないといけない.
Si5351を使うなら,もちろんキャリア信号も出したいから,
その周波数の設定と,モードによっては受信時はオフに…
と,考えたらきりがない感じだが,少し時間をかけて検討しよう.

周波数カウンタ

周波数カウンタは,今では格安のキットなどもあるので,
今更…な感があるが,今回少々変わったものを作った.
とはいえ,実用性がよいとか,性能が向上したとかではない.

カウントした周波数を数値ではなく,
あえて読み取り精度が低下するダイアルイメージで表示する.
20180415_132715

昔,ラジオなど作るときに一番工作に苦労したのが周波数表示ダイアルだった.
今は,周波数カウンタやPLL,DDSといったデバイスがあるので
そのようなダイアルは不要であるが…
とはいえ,ディジタル表示よりもダイアルがいい,と思うことがときどきあり,
そのあたりが製作の動機である.

表示には2.4インチのTFTカラーLCDを使った.
CPUはPIC32MZEF.
SRAMが512kBあるので外付けメモリなしでOKだった.

 

表示のレイアウトなど,気分でいろいろと変られるように設定用のPCアプリもつくってみた.
”dcon.exe”

dconfg

以下は設定例.
sample00

完成品を¥10,000 で頒布しています.
お問い合わせのフォームからご連絡ください.

Si5351で直交信号

直交信号が得られると非常に有用なので,Si5351で試してみた.
MultiSynth のDelay機能を使えば,ch間の位相差(時間差)を設定できる.
結論としては,3MHz以上で直交信号を得ることができた.

サンプルコード(Si5351Aの設定に関する部分のみ)を修正しておいた.
ch0, ch1 に出力されるようになっている.

以下詳細.

Delayは,td= N/(4*fvco) —-(1)
で,N は,0~127の範囲で設定できる.

出力周波数は, fout=fvco/(M*R) —- (2)
(M:MultiSynthの分周比,R:出力dividerの分周比)

90度位相差に相当するDelayは, td=1/(4*fout) —- (3)

(1), (2), (3) より,
N=M*R

つまり,fvco と fout の比(fvco/fout )を設定すれば
90度の位相差となる.

ここでNの値として設定できるのが最大127まで,というのが制限になる.
fvcoの下限は375MHzであるから,
(fvco=fxtal*(a+b/c) で,a>=15, fxtal=25MHz.よって25*15=375 )

375/127≒2.95MHz.これが,直交信号が得られる下限となる.

ちなみに,VCO自体の周波数範囲は,
使用したチップの実測で 200MHz~1160MHz くらいあるようで,
意外と広帯域である.

3MHz
20170314_3M

7MHz
20170314_7M

14MHz
20170314_14M

21MHz
20170314_21M

28MHz
20170314_28M

50MHz
20170314_50M

Si5351

Clock Generator Si5351A搭載のモジュールを入手したので動かしてみた.
今回作成したサンプルコード
(Si5351Aの設定に関する部分のみ)を置いておく.

これだけで2.5kHz ~ 200MHzの任意の周波数を発生できる.
周波数分解能は出力周波数にもよるが,約6Hz(150MHz~200MHz時)
出力周波数が低いほど高分解能になる(Divider で分周するため).
20170313_1

7.000000MHz 出力
20170313_7M

受信機でモニタした限りでは,通信に使えそうなC/Nではないかと思う.
矩形波なので高調波の問題はあるが,
受信用のローカルOSCとして使用するならこのままでいいかもしれない.

200.000000MHz 出力
20170313_200M

こちらは,モニタできないので波形のみ観測.
100MHzのオシロなので,フィルタがかかってきれいな波形になっているが,
信号がおよそ200MHzで出ていることは確認できる.

位相も設定できるようなので,後日試してみたい.