FM音源プログラム (17) -- オペレータ (10)
今度は、サイン波テーブルの参照方法についての話です。
前の議論で、フェーズアキュムレータを N ビットとしましたが、その上位 M ビットを抽出して、サイン波テーブルの参照に使うものとします。
具体的には、FM音源プログラムでは、1周期分では 16 K エントリになる表を使っていますから、 M = 14 ビットということになります。
左の図の横軸をフェーズアキュムレータ出力の位相、縦軸をサイン波テーブルの参照に使う位相とします。
図で 0 から まで伸びている直線は、フル周期のサイン波テーブルに対して、フェーズアキュムレータ出力に何も手を加えずに使う場合を示しています。
1/4 周期、つまり、0 〜 に相当するサイン波テーブルを使う場合は、サイン関数の対称性から、テーブルのインデクスは、この図の山形になっている線のように変化させます。
表であらわすと、
入力 | 出力 |
---|---|
のようになります。
それに加えて、位相が 〜 の間は、表から求めた数値の符号を反転します。
サイン波テーブルを作成する際に、連続波形をサンプリングする方法に、対称性を考慮すると2種類の方法があることが分かります。
左の図は、1/4 周期内で 4 サンプル取る場合です。
この2種類では、表のインデクスの折り返し方が違います。
1. の場合は、
2. の場合は、
となり、1. の場合は、本来の表のサイズ 4 より 1 大きい 5 エントリが必要なことが分かります。
一般には、1. の場合、表のエントリ数は になります。
2. の方法では、余分なエントリは必要ありませんが、テーブルに位相 0 のエントリが存在せず、オフセットが付いた状態となっています。
単独の波形なら、何も問題ありませんが、モジュレータとキャリアの周波数が違うと、初期の位相オフセット量が異なるため、波形に変化が生じ、音色が変わってしまう可能性があります。
これは、発音を開始するときにモジュレータ側とキャリア側のフェーズアキュムレータの初期値を調整しておけば避けることができます。 ただし、ちょっと面倒です。
1. の方式では、インデクス 0 は位相 0 の状態ですから、発音を開始するときに、単にフェーズアキュムレータをゼロ・クリアすればすみます。
具体的なプログラム例については、次回以降に説明します。