DSPにおけるソフトDDSによるキャリアの発生
2002/3/3  JA1VCW


1.はじめに

久しぶりに少しDSPで遊んでみたので、レポートさせていただく。

以前たまたまRACALのカタログを見る機会があり、その中でボード受信機のカタログがあってブロック図が提示されていた。この受信機はDSPを使用し、1ボードで通常のほぼすべての機能を持ち、コンピュータでコントロールする。(最近はこのようなボード受信機やHF1000とか95S-1,TEN-TECなど、DSPを使用し、少ないボード数で並み以上の性能がある受信機を散見するが、まったくおもしろくもなんともない。これも技術の進歩か)
そのブロック図では、局発は1kHzステップで可変してDSPに取り込み、それ以下1Hz分解能は、DSPの内部の発振器でデジタル的に受信周波数を可変するように書いてあった。
また他の例で、144MHzのトランシーバにDSPが使用されていて、局発は5kHzステップで可変その間をDSP内で1Hzステップでチューニングする設計であった。
このようなわけでDSPの内部で可変周波数発生器を作り、それで周波数を変えるという方法に興味をもった。
さしあたってDSPでのフィルタタイプのジェネレータがあるので、キャリア周波数を変えてみるというテストを行った。

2.方法

以前の拙稿では変調用のキャリアの周波数をサンプリング周波数の1/4に設定し、データの極性を反転する方法での平衡変調をおこなった。
そこで、
"キャリアとサンプリングが整数倍であるときにはこのように簡単であるが、そうでない時には、キャリアを実際にサンプリング周波数でサンプリングしてキャリアデータを作り、それと信号をかけ算しなくてはならない。"
などと書いた。(SSBの作り方その1
通常サンプリング周波数は変更できないので、整数分の1ではなく中途半端な分周の周波数のキャリアを作らなければならない。さてどうしましょう。

周波数を動かすためには可変周波数の発生器(発振器)が必要である。そのためには次のような方法がある。

  1. サンプリング周波数で動作する、サイン波発生プログラムを使用する。
  2. DDSをソフトで作る。
1)はZ-変換を使用した例として、以前文献に紹介したDSPプログラミング入門に記載されていた方法で、少ないプログラムステップでサイン波の発生を行うことができる。
2)は良く知られた方法である。

今回は2)でチャレンジする。
もう一度動作を確かめながらプログラムを作ろうとおもう。

まずはDDSのしくみから。
よくあるDDSのブロック図を示す。
ここでは、

  1. LatchはAdderの出力を1クロック遅延する。
  2. Adderは2つの入力を加算する。
  3. SIN ROMは入力に対応し、SINの値を出力する。
  4. D/Aは入力に対応するアナログの電圧を出力する。
  5. Clockは全体の動作を決定する、基準周波数。Clockが一つ入力されるたびに、状態が変化する。
  6. nは出力周波数を決定する数値。

DDSの動作を理解するために単純な例から始める。
Adder=4bit、Clock=16Hzとする。
  1. このDDSは、Adderの出力が4bitなので16の状態を出力する。
  2. Adder出力は一つ前の状態よりもnだけ増加している。
  3. Adderの出力はSIN ROMの入力となり、ROMの出力はデジタルの数値でサイン波になるように設定されている。
  4. D/AはROMの出力の数値の電圧を発生する。
この条件でn=1とすると2)の条件で、0,1,2,3,4,5,6,・・・・・E,F,0,1(16進)となり0〜Fを繰り返す。
従って、n=1のときは下図のように16クロックで1周期になるサイン波を発生することになる。
任意の1周期で最初が0のときを選らんで図示。

クロックは16Hzなので、16クロックで1周期ということは、このサイン波の周波数は1Hzである。

出力周波数を決定する式

F = Fs*n/2addbit  (addbit: Adderのbit数)
から、
F = 16(Hz)*1/24 = 1(Hz)
となって正しい。

次にn = 3のときはどうなるか。
Adderの出力は3づつ増加するので、0,3,6,9,C,F,2,5,8・・・となる。これを前図にあてはめると下図Aの値を、サンプルごとにSIN ROMから出力することになるので,図Bのように16サンプルのあいだに3周期のサイン波が得られる。
すなわち3Hzのサイン波である。

図Bの波形がきれいなサイン波になっていないのはExcelのせいである。
本来ならば完全なサイン波がフィットするが、Excelではベジエ曲線とかスプライン曲線かなにかで点の補間しているためこのようなは形となっている。
このようにDDSではAdderのビット数とクロックの周波数によって、出力周波数と分解能が決定されてしまう。

たとえば秋月さんで販売しているDDSでは、26ビットのAdderなので、1/2^26=1/67108864の分解能が得られる。
従って、1Hzの分解能を得るためには、67.108864MHzのクロックで動作させれば良い。

SIN ROMは、ICの内部にあって入力(アドレス)として理論的には1周期分の26ビット必要である。

出力のビット数は、多いほどより正確なサイン波を発生できるが、通常8ビット〜14ビットくらいである。
このビット数が少ないとS/N比の悪化(ノイズフロアの上昇)が発生する。

ところでSIN ROMであるが、じつは1周期分内蔵する必要はない。サイン波は0〜90度までの波形があれば90度〜360度まではその変換で値が得られる。
下図のようにbはaを左右反転すればよいし、cはaを、dはbを上下反対にすればよい。
したがってaさえあればその他の値は変換によって得られる。つまりSIN ROMの容量は1/4になる。
aをbに変換するためには、テーブルの検索順序をaと反対にすれば良い。
またc,dはa,bの符号を変えれば良い。
実際のDDSのIC内部でも同様な動作をさせているようである。

3.実際の方法

前記の方法で、DSPの内部でDDSを作成する。
Adder、Latch,SIN ROMを用意する。Adderはアキュムレータ、Latchはメモリ、SIN ROMはRAMの内部にテーブルを持てば良い。

今回は、SSBのキャリアポイントを動かすことが目的であるので、つぎのような設定をする。

サンプリング周波数 : 10MHz/504 = 19.841269kHz (従来通り)
キャリア周波数    : 19.841269kHz/4 = 4.96031725kHz (従来通り)
周波数分解能    :  約20Hz  (いくらでも良いが現実的な値)
DDSの発生周波数の式
F = Fs*n/2addbit  (addbit: Adderのbit数)
周波数分解能は、addbitを10bitとすれば、前出の条件では実際の分解能はnを1変化させた時のFであるから、
F=19.841269kHz*n/1024      Δf=19.376239Hz

n=256のときにサンプリング周波数の1/4となり 4.96031725kHzである。
n=257では  4.979693489kHzとなる。

Adderは10bitなので下8bitをROMアドレスとし、上2bitで値をどのように変換させるかを決定する。
サイン波の値はDSP自体のワードデータが16bitなのでそのまま使用する。
値はExcelでサイン波1周期が1024点になるように計算させて、初めの257個の値(256個ではない。257のほうが計算しやすい)をプログラムにCopyすれば良い。
これをプログラムする。(フローチャートは後出)
このデータをD/Aに出力させると、きれいなサイン波が観測され、カウンタで測定するとちゃんと周波数がシフトする。(あたりまえか)
今回のキャリア周波数の可変は、DSP内部でデジタル値を使用するのでD/A変換器は使用しない。

フェージングタイプのSSB発生器など、いろいろなところで位相差のあるキャリアを必要とすることがある。
その場合2個のDDSを作り、Adderの初期値を変えることによって位相差を作ることができる。たとえば90度の位相差が必要な場合は、前記10ビットAdderでは、初期値に一方は0を、もう一方は100hをセットしてスタートする。
すなわち、0と100hは90度ずれているのでその状態からスタートすれば、その位相差を保ちつつサイン波の発生ができるからである。

4.SSB Generatorへの応用

今回の目的は、SSB Generatorのキャリア周波数を動かすことである。
このDDSはまさに”キャリアの周波数をサンプリング周波数でサンプルした値になっている。
拙稿にフィルタタイプの発生器を作成したことを記したが、それにこのDDSを組み込み動作させる。
フィルタはサンプリング周波数が変わらない限り形状は変化しないが、キャリア周波数はこのDDSで変化する。
フェーズシフトタイプではキャリア周波数を移動させても、発生周波数が変化するだけで外に何もおこらない。
従来のバランスドモジュレータ(BM)では、信号データの極性をキャリアの周波数で反転し、あたかもスイッチを使用しているような方法で変調をかけていた。
それを信号データとキャリアのサイン波データの掛け算の形にする。

5.結果

コンピュータスペアナで観測した結果を示す。 ちょっと見にくい。
測定値は誤差がどのくらいあるか不明であるが、±1dB程度には収まっていると思われる。
A. 単一周波数の発生
  1. 出力周波数は計算どおり。 このスペアナの画面では良く分からないが、カウンタで0.1Hzの桁まで確認済。
  2. スプリアスは発生している。 これは避けようが無い。有害であれば内部でデジタルフィルタをいれて取り除く。
  3. ノイズフロアの上昇(広帯域ノイズ)を心配したが、特に発生周波数によってノイズフロアが変化するようなことも無いようである。この程度のコンピュータスペアナでは、そこまでの観測は無理か。よくわからない。
  4. 3次、5次の高調波が観測される。
  5. 出力レベルは、アパチャー効果が現れている。
B. SSBジェネレータとしての特性
従来の結果をリファレンスとして、それとの比較。2トーンをマイク入力からいれて、DSPのD/A出力を観測。
  1. 出力レベルが違う。 スイッチ方式は矩形波を掛け算しているのと同じである。矩形波の基本波成分は4/πだけ通常のサイン波よりも大きいので、そのぶん約2.1dB大きくなるはずであるがそうなっていない。どういうわけか分からない。このグラフでは3dB矩形波の方式のほうが小さいが、内部で実は12dB(4倍)矩形波ドライブのほうが大きいプログラムとなっている。その分をさしひいて9dB大きい。どうなっているのだろう。また良くプログラムを調査しなければ。
  2. ノイズフロアの変化は結果から分からないくらいなので小さいことにする。
  3. LSBが発生できるまで周波数を変化させたが、ちゃんと2トーンが出力されている。この結果によると、アパチャー効果によってマイク入力の低域が減衰することになる。従来のUSBの発生では高域が同効果によって減衰していた。
  4. 2トーンにスプリアスが見られるが、これは2トーンの発生器の高調波に起因する。

6.感想

  1. 単に加算とテーブル参照のプログラムに3週間もかかってしまった。 いくら休日無線家としてもなさけない。思い出しながら作っているせいか、年のせいか。 頭が混乱している。
  2. 今回はフィルタタイプのジェネレータのキャリアポイントを動かしただけの話であるが、今回の結果から導き出されることがある。

    1. DDSを使用してサイン波をつくることが最良かどうかはわからないが、サイン波を作ることによってアナログの発振器とミクサの動作と同じことがDSPでも可能であることを体験した。(できることははじめから分かっている。実際に実用になっているものがあるのだから)
    2. 最初に書いたRACALのラジオなどに見られる周波数を微調することが可能であることがわかった。実際の応用として、フェージングタイプのSSBジェネレータの送信周波数の微調とか、DSPの受信機への応用が現実的になった。(ただし現在のこのDSPキットが送信用には十分であると思えるが、ダイナミックレンジの点から受信用に十分使用できるかどうかは、別の検討が必要であろう)
    3. 理論の世界の端っこと、現実のものがつながった。

  3. 無い頭をしぼって考えた方法がこのようなものであった。この方法が、実際に使用されているのか、もっと良い方法があるのか、DSPを手がけられている諸先輩がたには常識なことか、また理論的にまったく非常識なことをやっているのか、そのあたりは多数の文献をあたったわけでもなく、スーパーな知人がいるわけでもないので、まったく分からない。ま、アマチュアだよねということでご容赦ください。ただし実用程度には動作している。
  4. たあいのないことではあるが、自分で考えて、実行してある程度の結果がでたときにはうれしいものである。これが機械いじりの楽しみであり、なかなか止められない。


戻る