PSNタイプのSSB発生器の試作


JA1VCW


 前回からおよそ2年を経過したが、このたびまた少しDSPをさわってみようという気を起こしPSNタイプのジェネレータを試作してみた。 その結果をレポートする。
前回で述べたことを土台にしている事も多いので、あわせて読んでいただかないとわからないことも多いと思いますがご容赦ください。

A PSN方式のSSB発生について

 アナログ方式の発生器については、すでにいろいろな記事などでご承知にとおりであるが、ここでいつも問題になるのがAFのPSNであった。すなわちいかにAFの帯域内で正確な90度の位相差を振幅誤差無く(少なく)作成することができるかということにあった。
そのためにいろいろな方式が考案され、使用されてきた。
などが代表的であって、これらの内容に付いては以前から発表されてきたので省略する。
ブロック図を示す。

B デジタルによるSSBの発生について

ブロック図はアナログ式とまったく同一である。 そしてここでもAFのPSNが必要になるが、デジタルで実現するための方式は2つある。
1では少ない段数で広い帯域の90度位相が選られる。 設計が難しい(もっとも今回はこれを考慮していないので、どの程度かは不明)。 直線位相は得られない(そんなに大きくずれるわけではない)。
2では、ヒルベルト変換用のBPFまたはHPFを使用する。完全な90度位相と直線位相が得られる。段数が多い。フィルタのリップル、振幅特性がサイドバンドサプレッションに影響する。サンプリング周波数に対して、低い周波数までフィルタの振幅特性をえることが難しい。ディレイが大きい。
などの特徴がある。

変調器は、前回で述べた方法の変調器を2個使用する。 90度位相のずれたキャリアで変調し、出力を加算するだけで良い。

C 設計の方針

C,1 ハードウェアについて

ハードウェアについては、前回と同一とし、プログラムのロードのみでフィルタタイプ、PSNタイプを選択できる。 方式によってのハードの変更は不要である。

C,2 ソフトウェアについて

B項の1はまだ勉強不足によって設計ができないため(少し情けない)、2で実現することとした。2の短所は特に問題はないと判断した。

C.2.1 ヒルベルト変換について

FIRフィルタを使用してヒルベルト変換として動作させる場合、通常はBPFまたはHPFとなる。
そして専用のフィルタ作成が必要である。
浅学にしてそのフィルタの作成プログラムは現時点では入手できていない(00/5/1時点)。
したがって参考文献1の係数をそのまま使用することにした。

ヒルベルト変換は次の図のようになる。


図はExcelを使用してFIRフィルタの畳み込みをシミュレーションした結果である。
波形は正規化してあるので、振幅特性はここでは正確ではない。フィルタ相応の振幅特性が生じる。
信号入力300Hzと1000Hzの結果であるが、いずれも波形のpeakと0-crossが一致している。
(データで確認済み。図では詳細は見えません)
また、下の波形を右に1/4周期ずらすと上と重なるので、下の波形は90度進んでいることがわかる。


C.2.2 インターポレーションについて

今回使用したヒルベルト変換フィルタの係数はサンプリング周波数は10kHzで計算してある(文献1)。 その場合サンプリング周波数が約2倍の19.841kHzでは、BPFの帯域はおよそ600Hzから9.4kHzまでとなってしまい、使用不能である(サンプリング周波数にスケーリングされる)。 従ってこの部分はやはり同文献にあるようにインターポレーションを使用して、サンプリング周波数を2倍に上げる処理をしないといけない。
最初から20kHzのサンプリング周波数のフィルタがあれば、インターポレーションは不要である。しかしこれはこれで実体験となる。

インターポレーションとは、サンプリング周波数をn倍に上げる方法である。
次のような処理を行う。図はn=2の場合。
  • データに"0"を補間する。
  • Gain=nのフィルタを通す。
今回は係数は10kHzサンプリングの値で、システムのサンプリング周波数は19.841kHzなので正確に2倍ではないが、係数のほうのサンプリングをfs/2(9.92kHz)と考えても誤差は小さい。
実際には係数(9.92kHz)、システム(19,841kHz)が正確な値である。
図は分かりやすくするため、10kHzと20kHzで書いてある。
また、信号のサンプリング周波数をfsとして、2倍に上昇する場合を表す。


C.3 AF PSNのブロック図

以上のような方針で実現すると、ブロック図は次のようになる。
ここでは、システムのサンプリング周波数(fs)を基準に表してある。(C.2.2項とは違う表現である)


D. PSN全体のブロック図

最終的に次のようなブロック図となった。


システムサンプリング周波数: 19.841kHz
ヒルベルト変換用BPF: 300〜4.7kHz 101タップ  @9.920kHzサンプリング
Interpolation LPF: Cutoff 4.3kHz 121タップ

1 ヒルベルト変換

サンプリング周波数が fs/2なのでサンプリング2回に1回のみこのフィルタを通すことにして、他の1回はデータを捨ててしまう。(実際には2項のフィルタに0を挿入する動作を行っている)
N/2タップディレイは、N=101なので51タップ目から取り出す。
ディレイは、ゲイン調整が必要であった。

2 Interpolation LPF

Cutoff 4.3kHzのFIRフィルタであり、fs/4の周波数で十分減衰が必要である。

3 "0"発生

インターポレーションではfs1回おきに0を挿入しなければいけないので、1)とあわせ"0"データを発生してInterpolation LPFの入力とする。
0度、90度ともに同一の振幅、位相特性でなければいけないので同一のフィルタを使用しなければならない。

E. 変調器

変調器は至って簡単である。前回ではデータをキャリアの信号によって反転させただけであったが、今回も同様である。ただ違う点は90度位相のずれたキャリアをもって、2つの変調器を動作させる点のみである。
2つのキャリアは90度位相差があるので、図のように表せる。
変調器は単なる極性反転器であるので
とすれば、SIG A,B を単に図に従って反転させればよい。
この時、キャリアの変化をサンプリング周波数で行うと、キャリアは1/4の周波数となる。
逆の言い方をすれば、必要なキャリアの周波数の4倍以上のサンプリング周波数でないとこの変調器は動作しない。
また、4倍以外の周波数では4の偶数倍のサンプリング周波数でないと大変めんどうになる。
奇数倍では正確な90度の位相差が作れない。
最後に2つのデータを加算すれば、最終出力が得られる。

この実現方法は簡単で、ソフトウェアの4進カウンタを一つ用意し(バイナリカウンタの下2bitでも良い)、サンプリング周波数ごとにカウントアップする様に設定する。
そのカウンタの出力状態に対応してSIGA,Bを反転させるだけで良い。

PSN方式ではLSB/USBどちらでも発生できるが、必ずUSBを取り出すようにしないと455kHzに変換する時に具合が悪い。



F. プログラム フローチャート

概略のフローチャートを示す。
A/Dのインタラプトからの処理である。
インターポレーション用と変調器用との2つのカウンタを使用する。

G. フィルタの特性など

1)、2)は計算結果、3)は実測値をExcelでグラフ表示


H. 測定結果

PSN type と Filter type を前回のコンピュータ・スペアナで比較した。
右側のピークは入力の第2高調波。
使用ソフトはシェアウェアで次のものである。
サウンドモニター FFT Wave6.2 E.N. Softwareである。



I. 結果考察

自分勝手な考察をしてみました。

1 サイドバンドサプレッション

ディレイデータのレベル調整を行わないと十分なサイドバンドサプレッションが選られなかった。(実は、デバッガをつかって変数値を手ですこしずつ変えて最良点を求めた。まったくアマチュアであった)
文献には単にFIRフィルタの出力とディレイの出力を単に取り出せば良いように書かれていることが多いようである。FIRの係数は、16ビットに正規化して使用したためなのかどうかわからない。 不勉強のきわみ。 うまく2のn乗で割ってやると、すなわちビットシフトのみでFIRフィルタの出力とディレイの出力のレベルがうまく合うのかもしれない。
それにしてもこの係数が結構クリチカルであった。 NULL点の近くでは係数の0.1%程度の変化で6dB以上サイドバンドサプレッションが変化した。
こんなことはやってみないとわからない。
調整後では、周波数を変えてもサイドバンドサプレッションはノイズと区別ができない程度にはなっている。(ただし後で述べる低域のサイドもれは別の話。)

2 キャリアサプレッション

キャリアサプレッションは-63dBであった。 この値は、よく聞けばもれているのがわかるといった程度。 実用上では差し支えないと考える。  ただしどうやってもこれ以下には下がらない。
計算誤差であるか? TS950の記事にもノッチフィルタを入れていると書いてあるのでそんなものか?

3 帯域

このジェネレータの帯域は、A/D変換器のBPFに依存している。 高域は2900Hzあたりで切ったほうが良い。  そのためにA/Dのフィルタの帯域を変更する。 RA=21,RB=12とするとFilterClockが238kHzとなって、cutoffが3.4kHz->2.8kHzとなる。 測定では3000Hz : -3dB、3300Hz : -26dB、3700Hz : -60dBとなった。 6ポールのハイフレのXtalFilterの減衰傾斜が500Hz当たりで25dBくらいであるから似たようなものであるが、あまり良いとはいえない。

4 フィルタ

PSNでSSBを発生させるために、101タップ1個、102タップ2個のフィルタを合計3回使用することになった。 サンプリング19kHzで300Hzまでのヒルベルト変換フィルタが設計できればインターポレータ自体不要となる。 300タップの係数をもってきても大丈夫。

5 低域の特性

ヒルベルト変換の低域の特性が300Hzまでなのでそれ以下の周波数が入力されると、逆サイドバンドのもれとなる。 実際にもれは前述の1kHzのデータのレベルにおいて、250Hzで約-58dB、200Hzで最大で約-44dBとなった。このレベルでは気にしないことにした。ヒルベルト変換と言ってもフィルタになるので帯域を持つのはいたしかたない。
気にする場合は、Audioで低域をカットする必要がある。これをヒルベルト変換で低域をのばそうとすると努力が必要。 また入力にデジタルフィルタを入れるとすると80から120タップくらいのFIRが必要で、このくらいのタップ数だと一昔まえのハイフレのクリスタルフィルタ程度の形状ものができてしまうから、いったいなんのためのPSNタイプなのかい!ということになってしまう。

6 帯域

帯域が300Hz〜3000Hzで良いのであれば面倒なPSNタイプにする必要はない。
もっと低音を出したいならば、IIRのALLPATHを設計し、PSNとするのが良いようである。
逆な言い方をすれば、低音を響かせたい場合IIRのALLPATH以外には方法が無さそうである。
メーカーさんもこの辺をねらってわざわざIIRのALLPATHで実現しているのであろう。商品価値を上げるためか。 私個人としては、あまり低音の伸びた音は好みではない。(IIRが今回できなかったからというわけではない) きれいな低音ならば問題ないけれど。

7 A/D、D/A

A/D、D/Aともにダイナミックレンジぎりぎりまで使用したほうがS/Nがとれるし計算誤差の点でも良いので、出力は実際にマイクを接続して、大声で!さわいでももクリップしないところに設定するのが良い。現在はどこかで計算がオーバーフローしているらしくて、とても大声を出すと、ピークでめちゃくちゃになる。一考を要す。

8 シミュレーション

FIRのシミュレーションはらくである。 ヒルベルト変換の係数をExcelに入力して、ユーティリティのフーリエ変換を実行し、パワースペクトラムに変換してグラフを書かせれば周波数特性は簡単にみることができるし、リップルなども同様に簡単にチェックできる。
Excelがすきになってしまった。

9 処理時間

処理時間については動作させてOKだったので何ら考察していないが、およその見当ではフィルタ3個で 120+120+100=340 それ以外で100 ステップと考えると430ステップ。
1ステップあたり50nsで21.5μs となる。 20kHzサンプルで50μsなのでまだ半分のこっているということになる。


3月始めから、まずヒルベルト変換というものはほんとに動くのかね?! というシミュレーションから始め、やっぱりインターポレータを使わないとだめかと言うことになって、サイドバンドサプレッションがとれないetc、いきあたりばったりで計画性がないことおびただしい。ここまで来るのに結構いろいろなドジをふみました。
このレポートは、2000/5/14時点の状態で時々刻々変化します。プログラムもまだまだ修正がおこなわれるはずです。

考察というよりも感想となってしまいましたが、間違は人の常。 その時はぜひご容赦いただいて御教授を賜りたいと思う次第です。

補足 参考文献

1.HAMJournal No.68 SSB変調方式とDSP処理 西村 芳一
2.HAMJournal No.80
3.HAMJournal No.86
4.HAMJournal No.91


戻る