FM音源をソフトウェアで実装するために、正弦関数をテーブルを使って高速に計算する必要があるのですが、それに関し不明な点があるので質問します。
現在の実装はこんな感じです:
lang
1int sin_table[22050]; // 128・sin(2Πx)+128 2 3// Freq : 周波数 4// pos : サンプル位置 (0~SamplePerSec) 5// SamplePerSec : サンプリングレート (=44100) 6// mod : 初期位相 7inline int SIN(int Freq, int pos, int SamplePerSec, int mod){ 8 static const int sine_size = sizeof(sine_table)/sizeof(sine_table[0]); 9 10 return sine_table[ 11 (sine_size*Freq/SamplePerSec*pos)%sine_size 12 ]; 13}
こちらは周波数を受け取って単純な正弦波を返すものです。今のところは0~255の範囲で返ってきます。
実際にはこの関数は初期位相(引数mod)によって値を変える必要があります。用途がFM音源なので、引数には0~255(実際のsin関数でいうところの-1~1)の数値しか渡されません。
・・・というようなものを実装したいのですが、実際にどうコーディングすれば良いのでしょうか?
とりあえず初期位相の分だけ波形を前後にずらす(添字を一定量増減させる)をすればよいこは分かっていて、初期位相が2πFreq*128になればちょうど一周期分ずれることになるはずだと考えてコーディングしています。
return sine_tableの中の計算がよくわかりませんでした。
sine_tableに必要なサイズを求める計算と、sine_tableの値を取得する計算がごっちゃになっている気がします。
実際にsine_tableに代入する部分はどのようになっていますか?
