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

フィードバック

フィードバックとは、オペレータの位相変調入力に他のオペレータ出力を入れるのではなく、自分自身の出力を戻して変調をかける機能です。
サイン波の傾きが「上り坂」の部分では、フィードバックが傾きを増す方向に作用し、傾きが「下り坂」の部分では、フィードバックが傾きを減少させる方向に作用するので、結局、のこぎり波に近い波形になります。
フィードバックといっても、連続時間のアナログ回路とは違い、リアルタイム、つまり現サンプルに対する計算の入力として、その計算出力値を直接使うことはできません。
現サンプルの計算の入力として使えるのは、少なくとも1サンプル以上前の出力値に限られます。
そのため、次のサンプルでの計算に使うため、現サンプルの出力値を記憶しておく必要があります。
FB 値と変調指数の対応は次の表のようになっています。

FB   0     1   2   3   4   5   6   7
変調指数   0 \pi/16 \pi/8 \pi/4 \pi/2  \pi 2\pi 4\pi

変調指数の値は、無理数である \pi に 2 のべき乗をかけた形になっていますが、実際に \pi を乗算しているわけではありません。
この \pi は、フェーズジェネレータの 2^{\small N} がサイン関数の位相の 2\pi に対応するように、\sin(2\pi\cdot 2^{\small -N}(\cdot )) と選んだために必然的に導入された係数です。
実際には、記憶しておいた前サンプルの出力値に、FB の値に応じてビットシフトを行い、位相変調入力とするものです。
サイン波テーブルのエントリ数および値のビット数の少ない ATmega 版のFM音源プログラムでは、フィードバックに関してトラブルがありました。
それは、FB の値が大きい場合に、出力波形にサンプリング周波数の 1/2 の周波数の振動が生じ、異音として聞こえる現象です。
ATmega 版はサイン波テーブルは1周期分で 512 エントリ、データは 9 ビット幅で、ADuC7026 版および V850 版の 16K エントリ、16 ビットデータに比較して「刻み」が荒いために生じる非線形な現象ではないかと思っていますが、深く原因を追求してはいません。
対症療法的に、フィードバックする信号の経路に fs/2 に零点をもつ FIR フィルタを挿入して振動を抑えています。具体的には、過去の隣り合う2つのサンプルの平均を取っています。