FM音源プログラム (17) -- オペレータ (10)

今度は、サイン波テーブルの参照方法についての話です。
前の議論で、フェーズアキュムレータを N ビットとしましたが、その上位 M ビットを抽出して、サイン波テーブルの参照に使うものとします。
具体的には、FM音源プログラムでは、1周期分では 16 K エントリになる表を使っていますから、 M = 14 ビットということになります。

左の図の横軸をフェーズアキュムレータ出力の位相、縦軸をサイン波テーブルの参照に使う位相とします。
図で 0 から 2\pi まで伸びている直線は、フル周期のサイン波テーブルに対して、フェーズアキュムレータ出力に何も手を加えずに使う場合を示しています。
1/4 周期、つまり、0 〜 \pi/2 に相当するサイン波テーブルを使う場合は、サイン関数の対称性から、テーブルのインデクスは、この図の山形になっている線のように変化させます。
表であらわすと、

  入力   出力
\qquad\qquad\; 0 \rightarrow \pi/2 \qquad\; 0 \rightarrow \pi/2
\quad\pi/2 \rightarrow \pi \pi/2\rightarrow 0
\quad\qquad\; \pi \rightarrow 3\pi/2 \qquad\; 0 \rightarrow \pi/2
3\pi/2 \rightarrow 2\pi \pi/2\rightarrow 0

のようになります。
それに加えて、位相が \pi2\pi の間は、表から求めた数値の符号を反転します。

サイン波テーブルを作成する際に、連続波形をサンプリングする方法に、対称性を考慮すると2種類の方法があることが分かります。
左の図は、1/4 周期内で 4 サンプル取る場合です。

  1. 青のバーで示した、位相が 0 の点と、\pi/2 の点がサンプリング・タイミングとちょうど一致する場合
  2. 赤のバーで示した、位相が 0 の点と、\pi/2 の点が、サンプリング・タイミングのちょうど中央に当たる場合

この2種類では、表のインデクスの折り返し方が違います。
1. の場合は、
\qquad 0 \rightarrow 1 \rightarrow 2 \rightarrow 3 \rightarrow 4 \rightarrow 3 \rightarrow 2 \rightarrow 1 \rightarrow 0 \rightarrow \, ...
2. の場合は、
\qquad 0 \rightarrow 1 \rightarrow 2 \rightarrow 3 \rightarrow 3 \rightarrow 2 \rightarrow 1 \rightarrow 0 \rightarrow 0 \rightarrow \, ...
となり、1. の場合は、本来の表のサイズ 4 より 1 大きい 5 エントリが必要なことが分かります。
一般には、1. の場合、表のエントリ数は 2^{\small M-2}+1 になります。
2. の方法では、余分なエントリは必要ありませんが、テーブルに位相 0 のエントリが存在せず、オフセットが付いた状態となっています。
単独の波形なら、何も問題ありませんが、モジュレータとキャリアの周波数が違うと、初期の位相オフセット量が異なるため、波形に変化が生じ、音色が変わってしまう可能性があります。
これは、発音を開始するときにモジュレータ側とキャリア側のフェーズアキュムレータの初期値を調整しておけば避けることができます。 ただし、ちょっと面倒です。
1. の方式では、インデクス 0 は位相 0 の状態ですから、発音を開始するときに、単にフェーズアキュムレータをゼロ・クリアすればすみます。
具体的なプログラム例については、次回以降に説明します。