3

問題

私はこれをしばらく無駄に理解しようとしています.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と、スムーズに動作し、可聴の問題は発生しません。ありがとう!

4

1 に答える 1

4

を掛ける代わりにfrequencytimeを使用して適切な量frequencyを増やします。timeその方法timeは連続的であり、ジャンプすることはありません。

于 2011-12-19T20:15:01.063 に答える