C中的简单波表振荡器

时间:2010-11-21 01:03:59

标签: c timer

我必须为学校毕业设计项目编写一个数字合成器,虽然我一般都知道关于合成器的大部分理论,但我必须承认自己是编程新手。 如标题所述,我必须在C中完成。 最简单的方法似乎是使用波表振荡器,因此我可以使用斜波作为ADSR包络的基础。 但是,我不知道如何确保它是正确的音调。通过改变增量计数器很容易改变振荡器的相对音高,但如何确定振荡器的绝对音高?

J.Midtgaard

1 个答案:

答案 0 :(得分:4)

您需要知道您正在制作的音频流的sample rate。如果您的采样率是 fs ,并且您尝试生成频率为 f 的音调,则需要每个生成一个完整的周期(周期) > fs / f 样本。或者,在每个音频样本期间,您必须前进一个周期的 f / fs 。因此,如果您的wavetable有 n 条目来表示完整周期,那么您需要前进 n * f / fs 条目。

例如,对于 fs = 44.1kHz, f = 1kHz, n = 1024,您的增量必须为1024 * 1000/44100 =每个样本23.22个条目。

请注意,您通常会获得非整数增量值。为了获得正确的音高,您不应该在递增时舍入该值。相反,只有在将累加器值转换为表索引值时才应该舍入。 (更复杂的方法是在条目之间进行某种插值。)