FM音源プログラム (20) -- オペレータ (13)
フィードバック
フィードバックとは、オペレータの位相変調入力に他のオペレータ出力を入れるのではなく、自分自身の出力を戻して変調をかける機能です。
サイン波の傾きが「上り坂」の部分では、フィードバックが傾きを増す方向に作用し、傾きが「下り坂」の部分では、フィードバックが傾きを減少させる方向に作用するので、結局、のこぎり波に近い波形になります。
フィードバックといっても、連続時間のアナログ回路とは違い、リアルタイム、つまり現サンプルに対する計算の入力として、その計算出力値を直接使うことはできません。
現サンプルの計算の入力として使えるのは、少なくとも1サンプル以上前の出力値に限られます。
そのため、次のサンプルでの計算に使うため、現サンプルの出力値を記憶しておく必要があります。
FB 値と変調指数の対応は次の表のようになっています。
FB |   0   |   1 |   2 |   3 |   4 |   5 |   6 |   7 |
---|---|---|---|---|---|---|---|---|
変調指数 |   0 |   |
変調指数の値は、無理数である に 2 のべき乗をかけた形になっていますが、実際に を乗算しているわけではありません。
この は、フェーズジェネレータの がサイン関数の位相の に対応するように、 と選んだために必然的に導入された係数です。
実際には、記憶しておいた前サンプルの出力値に、FB の値に応じてビットシフトを行い、位相変調入力とするものです。
サイン波テーブルのエントリ数および値のビット数の少ない ATmega 版のFM音源プログラムでは、フィードバックに関してトラブルがありました。
それは、FB の値が大きい場合に、出力波形にサンプリング周波数の 1/2 の周波数の振動が生じ、異音として聞こえる現象です。
ATmega 版はサイン波テーブルは1周期分で 512 エントリ、データは 9 ビット幅で、ADuC7026 版および V850 版の 16K エントリ、16 ビットデータに比較して「刻み」が荒いために生じる非線形な現象ではないかと思っていますが、深く原因を追求してはいません。
対症療法的に、フィードバックする信号の経路に fs/2 に零点をもつ FIR フィルタを挿入して振動を抑えています。具体的には、過去の隣り合う2つのサンプルの平均を取っています。