内藤さんこんにちは!著者の中本です
>とありますが、負の周波数でfreqがマイナスの場合、if文が実行されないで
>0~-2πの範囲に収められなくなるような気がしますが、実際にはうまく、
>例えば-1000Hzの発振がおこなわれています。なぜでしょうか?
ご指摘の通りです。負の周波数を入れると以下の2行は全く
意味がなくphaseはマイナス方向に無限に成長します。
>if (phase > 2 * PI) // 一周したら
>phase -= 2 * PI; // 必ず0から2*PIの範囲に収めておく
しかしC#の三角関数ライブラリの内部でこの0から2*PIの範囲に
収めてから計算するという処理が重ねて実装されていますので
負の周波数を指定するとC#での処理ではなくライブラリ内の
処理で全く同様の処理が行われるためうまく発振します。
この事を確認するには上記の2行をコメントアウトして
発振させると正でも負でも問題なく動作します。
但し負の周波数での発振が無限に続くわけではなく、極めて
長時間動作させていると大きさの違う浮動小数点同士の加算の
際の桁落ちが発生し信号の質が低下する事になります。
従ってif文内に負の方向の判定を加える事で長時間安定して
発振する事になります。そのように改造するのがより汎用的に
なります。
ソースをよく読み込んで頂いて感謝します。
貴重なご指摘ありがとうございました。