问题

我试图解决这一问题无济于事-如何在两个频率之间连续更改音符的音高。

我正在生成具有以下功能的音频信号:

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可以顺利进行,并且不会出现听觉上的问题。谢谢!

最佳答案

不要用frequency乘以time,而是使用frequencytime增加适当的数量。这样time是连续的,您将不会跳转。

07-24 09:52
查看更多