3

问题

我试图弄清楚这一点但无济于事 - 如何在两个频率之间连续改变音符的音高。

我正在使用与此类似的功能生成音频信号:

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

不是乘以frequency,而是time使用frequency以适当的数量递增time。这种方式time是连续的,你不会得到跳跃。

于 2011-12-19T20:15:01.063 回答