正弦波をつくる
経緯
もう今から20年以上前*1ですが、周期の異なる方形波の排他的論理和(Exclusive-OR)が三角波のPWMになるなら、 バイナリ・カウンタをベースにPWMの正弦波がつくれるのではとの考えに取り憑かれ、試行錯誤の末、基本構成を作り上げました。
今回紹介するのは、またそれから一年以上経ってから CPLD(プログラマブル・ロジック・デバイスの一種)に DAC(オーディオ用ではありません)のテスト用としてインプリメントするため VHDL化したものをベースにしています。
もう永いこと VHDLに係わることもなく ModelSimのような VHDLのコードを検証できる環境もないので、 今後これを紹介することもないだろうと思っていましたが、 最近ディジタル信号処理等の検討に使用し始めた MATLAB互換の数値演算プログラム Octaveで VHDLのロジックをシミュレーションできるのではとふと思いつき、 試してみたところ意外にあっさり VHDLソースから Octaveの .mスクリプトへの移植ができました。
Octaveによるシミュレーション
真ん中のリファレンスのカウンタの方形波(黄緑)と一番上のsinカウンタの波形(赤)との排他的論理和(Exclusive-OR)が、上から二番目のsin PWM波形(マゼンタ)です。 リファレンスのカウンタの方形波(黄緑)と一番下のcosカウンタの波形(青)との排他的論理和が下から二番目のcos PWM波形(シアン)です。これらの正弦波の周期は2048クロックです。

次の図は上の PWMを積分(排他的論理和が真のときは +1, 偽のときは -1を加算)した波形です。比較のために基本波相当の正弦波も表示しています。最初の初期化の 512サイクル以降は安定した正弦波を生成し続けます。

下図は上の積分波形 4周期分を DFT(FFT)した結果です。blackman窓を使用しています。

上のスペクトルは方形波同様偶数次の高調波を含んでいません。 31次前後のピークは PWMのキャリア周波数に相当する成分です。 reference, sin, cos の各カウンタは 5ビット (25=32) で構成しています。
動作原理その1. 概要
周期が異なる方形波の排他的論理和(Exclusive-OR)は
PWMの三角波になります。
下の回路図は原理説明のための
LTspiceの回路図とそのロジックのシミュレーションです。

下図最上段の紫色の波形は左右両3ビット・バイナリ・カウンタの
MBS(最上位ビット:
A2_Q
上から
3段目の青の波形
,
A11_Q
上から2段目の黄土色の波形)の
Exclusive-OR(A19)と
R14,R15,C1によるその積分波形です。
緑の波形は
MBS-1ビット(A3_Q
水色の波形
,
A12_Q
赤の波形)の
Exclusive-NOR(A20)と
R13,R16,C2によるその積分波形です。
下から2段目の茶色の階段波形は右の3ビット・バイナリ・カウンタの出力(Q)に接続した
R-2R
ラダー抵抗ネットワークの出力(R12とR11の交点)です。同様に最下段の青の階段波形は左のバイナリ・カウンタの出力(Q)に接続した
R-2Rラダーの出力(R6とR5の交点)になります。

基準となるフリーランのバイナリ・カウンタ(LTspice回路図の左側に相当)とカウント・イネーブルの制御でカウントを間引くことが可能な2個(sin,cos)のバイナリ・カウンタ(LTspice回路図の右側に相当)との排他的論理和(LTspice回路図 A19相当)を PWMの正弦波に近づけるようカウント・イネーブルの制御を工夫しました。
原理的には sinのバイナリ・カウンタの微分で cosのバイナリ・カウンタのカウント・イネーブルの制御を、また cosのバイナリ・カウンタの微分で sinのバイナリ・カウンタのカウント・イネーブルの制御を行えばよいのですが、微分する代わりに基準カウンタと sin, cos のバイナリ・カウンタの 1ビット下(重み1/2)のビットの Exclusive-NOR(排他的論理和の負論理出力)を使用しています。上の LTspiceシミュレーションの緑の波形がそれに相当します。またカウント・イネーブル制御の誤差の蓄積を防ぐため 1/4周期(π/2=90)毎に初期化を行っています。
動作原理その2. 状態方程式
次に、微分の代わりに 1ビット下(重み1/2)の出力の Exclusive-NORが使えることを現代制御理論の状態方程式を用いて説明します(より簡潔明瞭な方法はあるとは思いますが)。下の連立微分方程式が状態方程式です。
大文字は行列、小文字はベクトルを表し、それぞれ
A: システムマトリクス
B: 入力マトリクス
C: 出力マトリクス
D: 伝達マトリクス
x: 状態ベクトル
u: 入力ベクトル
y: 出力ベクトル
と呼ばれますが、多入力多出力の系を扱うため入出力がともにベクトルになっています。『真空管アンプの歪率改善に端を発した古典制御が専ら出力から入力に負帰還をかけることに終始したことに対し、現代制御は出力ではなく系内部の複数の状態変数からの状態フィードバックすることにより多入力多出力の制御が可能になった。』というようなことを40数年前*2になりますが、制御工学の講義で確か教わった気がします。ちなみに現代制御というのは古典制御との対比から付いた名称のようで、今日では制御理論の中心ではないようです。
前置きはこれまでとし説明に移ります。まず reference 用フリーラン・バイナリ・カウンタに対する cos 用バイナリ・カウンタと sin 用バイナリ・カウンタのカウントの遅延量をそれぞれ x1 と x2 します。ロジックとしてはカウント・イネーブルの制御により常に基準カウンタに対して遅れる方向(遅延方向の符号をプラスとすれば単調増加) ですが、排他的論理和を用いての制御は PLLの位相比較器と同様、基準信号との位相関係だけを考えることになります。周回数は無視してトップ争いも周回遅れも同じ扱いです。状態変数 x1 と x2 については負の値も認め -1 ≤ x1, x2 ≤ 1 とします。
状態方程式も π/2 周期の4つの位相(フェーズ)に分けて考えることにします。 π/2 周期でイニシャライズするため LTspiceのシミュレーション波形を基に位相(フェーズ)と状態変数を以下の表のように定めます。
Phase-1 | Phase-2 | Phase-3 | Phase-4 | |
---|---|---|---|---|
cosθ |
π ≤ θ < 3π/2
|
3π/2 ≤ θ < 2π
|
0 ≤ θ < π/2
|
π/2 ≤ θ < π
|
sinθ |
3π/2 ≤ θ < 2π
|
0 ≤ θ < π/2
|
π/2 ≤ θ < π
|
π ≤ θ < 3π/2
|
MSB
EX-OR duty cycle |
0% → 50%
|
50% → 100%
|
100% → 50%
|
50% → 0%
|
状態変数 x |
-1 → 0
|
0 → 1
|
-1 → 0
|
0 → 1
|
MSB-1
EX-NOR duty cycle |
100% → 0% |
0% → 100% |
100% → 0% |
0% → 100% |
- 0 ≤ θ < π/2
-
まず、システムマトリックス
を考えます。
sin と reference カウンタの MSB-1 ビットの Exclusive-NOR で cos カウンタの制御を
また cos と reference カウンタの MSB-1 ビットの Exclusive-NOR で sin カウンタの制御を行うため、対角要素 a11, a22 は 0 となって
状態変数 x1, x2 は単調増加と規定しましたから a21 x1, a12 x2 も正の値で
x1 < 0 → a21 < 0
x2 > 0 → a12 > 0
になります。
ここで | a12 | = | a21 | ならば
a21x1, a12x2 は【MSB-1 EX-NOR duty cycle】の値に比例します。
| a12 | = | a21 | = ω とするとシステムマトリクス A は
になります。
次に状態方程式をラプラス変換して
とします。
状態ベクトルの初期値を x0 とすると
これをラプラス逆変換し時間関数に戻すと
状態ベクトルの初期値 x0 と状態遷移マトリクス φ(t) から自由応答 x(t) が得られます。
(ただしこの系では入力はないものとして BU(s)=[0] とします。) これで準備が整いました。
まず特性方程式 sI?A は
次に sI?A の逆行列 (sI?A)?1 (= φ(s)) を求めます。
【Phase-3】の【状態変数 x 】の初期値 -1 と【Phase-2】の【状態変数 x 】の初期値 0 から
として、自由応答を求めます。
出力マトリックス
の対角要素 C11, C22 の符号は cos と sin それぞれの【MSB EX-OR duty cycle】が単調増加のときプラス、単調減少のときマイナスになります。また対角要素以外は 0 になります。
したがって係数を1とすると出力マトリックスは
バイアス成分を除いた*1出力は
- π/2 ≤ θ < π
-
状態変数の符号から
x1 ≥ 0 → a21 > 0
x2 ≥ 0 → a12 > 0
システムマトリックス A は
特性方程式 sI?A は
次に sI?A の逆行列 (sI?A)?1 (= φ(s)) を求めます。
【Phase-4】の【状態変数 x】の初期値 0 と【Phase-3】の【状態変数 x】の初期値 -1 から
として、自由応答を求めます。
【MSB EX-OR duty cycle】の傾きから、出力マトリクスは
バイアス成分を除いた*1出力は
x1 < 0 → a21 < 0
x2 > 0 → a12 > 0
システムマトリックス A は
特性方程式は 0 ≤ θ < π/2 と同じで
初期値 x0 は【Phase-1】の【状態変数 x】の初期値 -1 と【Phase-4】の【状態変数 x】の初期値 0 から
特性方程式と初期値が 0 ≤ θ < π/2 と同じなので自由応答も同じになります。
【MSB EX-OR duty cycle】の傾きから、出力マトリクスは
バイアス成分を除いた*1出力は
x1 > 0 → a21 > 0
x2 < 0 → a12 < 0
システムマトリックス A は
特性方程式は π/2 ≤ θ < π と同じで
初期値 x0 は【Phase-2】の【状態変数 x】の初期値 0 と【Phase-1】の【状態変数 x】の初期値 -1 から
特性方程式と初期値が π/2 ≤ θ < π と同じなので自由応答も同じになります。
【MSB EX-OR duty cycle】の傾きから、出力マトリクスは
バイアス成分を除いた*1出力は
*1:【MSB EX-OR duty cycle】の 50%に相当するバイアス成分を入れるには、伝達マトリクスと入力ベクトルの掛け算 Du の各要素を 0.5 とすればよいのですが、その一方で Bu を[0]とするのは如何にもご都合主義といった感じで気が進みません。というわけでバイアス成分は省かせて頂きました。
動作原理その3. ω=π/2 の近似
1/4周期毎に初期化するので、1/4周期を単位時間(=1)とすると
この値の近似のため Exclusive-NOR の出力で 9進カウンタをインクリメント(+1)しつつ、カウント・イネーブル制御用の 5ビットカウンタでは 9進カウンタの値が 0,2,4,6 のときは +1 また 1,3,5,7,8 では +3 して
*3の割合でカウント・アップし cos または sin 用のバイナリ・カウンタのカウント・イネーブルを生成してカウントの間引きを行っています。
下図は具体的なその様子を示した Octave によるシミュレーション波形です。

真ん中の黒のパルスは 1/4周期のイニシャライズ用のストローブ信号です。中央から上は cos 用カウンタ(赤)とカウント・イネーブル生成のための信号、中央から下は sin 用カウンタ(赤)とカウント・イネーブル生成のための信号です。
マゼンタの信号は MSB-1ビットの Exclusive-NOR の信号です。この信号が1のとき下の黄緑色の 9ビット・カウンタとシアンのカウント・イネーブル制御用の 5ビットカウンタがカウント・アップします。
間引きの回数は 1/4周期あたり 8クロックの1周期 32(=25)クロックです。これは 5ビットの cos および sin 用のバイナリ・カウンタが reference カウンタに対し、ちょうど1周回遅れすることを意味しています。
- 方形波からつくる正弦波
- (PREV)
- PWM直交発振器
- (NEXT)
- PWMからPDMへ