問題
私はこれをしばらく無駄に理解しようとしています.2つの周波数間で音のピッチを連続的に変更する方法です。
私はこれに似た関数でオーディオ信号を生成しています:
double SineGenerator(double time, double frequency)
{
return Math.Sin(frequency * time * 2 * Math.PI);
}
私はこの関数の外で手動で時間を管理していますが、次のようにします:
time += 1.0 / sampleRate;
double sample = SineGenerator(time, frequency);
また、必要な量のサンプルに対してパラメーターを線形補間するという明らかな解決策はfrequency
、期待どおりに機能しません。これを行うと、音波がポンとクリックでいっぱいになります。
代わりにこれをどのように実装する必要がありますか?
ソリューション (編集)
geofftnzless のおかげで、これは驚くほど簡単に解決できました。私は今、このジェネレーターの使用に切り替えました:
double SineGenerator(ref double time, double frequency, int sampleRate)
{
return Math.Sin(time += (frequency * 2 * Math.PI) / sampleRate);
}
time
内部でインクリメントを処理します。
このジェネレーターの補間を使用するfrequency
と、スムーズに動作し、可聴の問題は発生しません。ありがとう!