ディジタル信号処理による信号発生とエイリアス(13)
D-Number
FM音源チップのデータシートでは、F-Number レジスタの名前の由来については、特に説明されていません。
この F-Number は周波数 (ピッチ) に比例する量ですから、「F」は Frequency の F から取ったものと見て間違いないでしょう。
ここで、F-Number とペアになる概念として、(勝手に) 「D-Number」を定義したいと思います。
D は Division (除算)、Divider (分周器)、あるいは Divisor (除数) の D です。
を F-Number、 を D-Number として
定数
で定義します。 つまり、D-Number は F-Number の逆数に比例する数となります。
F-Number は、波形の周波数に比例する数でしたから、D-Number は、波形の周期に比例する数となります。
ここで、特に、定数 の場合、
を考えます。
フェーズ・アキュムレータのビット幅を とし、 の表現は、それに見合った、 ビットの固定小数点表現で、フェーズ・アキュムレータに加算する値そのものとします。
両辺の 2 の対数を取って移項すると、
F-Number は周波数に比例する値ですから、 は何かと言えば、その周波数の音程ドメインでの表現になります。
の整数部はオクターブを表し、小数部はオクターブ内の音程を表します。
整数部を添え字 、小数部を添え字 で表現し、
と表すことにします。
そうすると、前の式は、
となります。
整数部どうし、小数部どうしを、それぞれ等しいとおいて、ふたつの式に分けると、
となります。
の組から、実際の を求めるには、
を計算するわけですが、 は整数なので、2 のべき乗は、単にビットシフトするだけとなります。
小数部の については、F-NUMBER テーブルを引いて求めていることを以前説明しました。
と の小数部に関する式を見ると、 である に対して、 で が求められることを表現していますから、結局、F-NUMBER テーブルを、 と では、それぞれ逆向きに参照すれば良いことが分かります。
もう少し具体的に言うと、
- F-NUMBER テーブルのエントリ数が NSIZE
- に相当するインデクス値が k でテーブルの参照が fnum[k] で表される
場合、 に対する参照は、fnum[NSIZE - k] となります。
ただし、この場合、 k=0 で fnum[NSIZE] を参照することになり、テーブルの領域外をアクセスすることになります。
fnum[NSIZE] に対するエントリを追加し、NSIZE+1 エントリの表にすれば解決できますが、16 ビット値のテーブルを、fnum[0] = 0x8000 から始めると fnum[NSIZE] = 0x10000 としなければならず、16 ビットにはおさまらなくなります。
少し誤差が加わることを承知の上で、fnum[NSIZE-k] の代わりに fnum[NSIZE-1-k] を使えば、テーブルサイズを増やさなくてすみます。
結局、ランプ波形サンプリングに相当する波形を発生させる方式*1に必要とされる D-Number
の計算は、通常の音程ドメインから F-NUMBER を求める計算に追加する形で、除算なしで実行できます。
*1:これを「ディジタル・リワインド方式」と呼ぶことにします