ADSR包络的迭代指数曲线生成

时间:2014-04-03 18:46:35

标签: algorithm math exponential iteration

我正在使用一本书来学习如何从代码生成音频。我很难理解它的一部分。我正在阅读的这一章讨论了迭代生成具有指数攻击,衰减和释放的ADSR包络。它首先有一个等式的算法: Equation1

但足以说明作者解释说这需要对ADSR曲线中的每个样本使用pow()函数,这是低效的。然后他继续采用不同的方法,如本摘录中所述: Equation2

我的第一个问题是这套方程式。看起来第二行是错的,应该读y(n)= b * y(n-1),但这本书没有勘误,所以很难确定。如果我错了,请解释原因。其次,当方程6.7中c为0时,y(0)总是为1。这使得包含在本节中的等式中变得令人困惑,因为没有它你可以很容易地看到b = y(k)^(1 / k)。我假设y(0)包含在下一个摘录中,这是我真正努力的书的一部分: Equation3

我理解第一段。我理解解释曲线的前两个方程式。我不明白的是他如何得到解决b的最后一个方程式。该算法取决于该等式,因为它允许您使用pow()函数一次从期望的最小值y(0)= 0和最大值y(k)= 1计算b,并使用迭代乘法计算ADSR曲线的每个样本,如伪代码中所示:

expMin = 0.2; // adjust to change curvature
expMul = pow((expMin+1)/expMin, 1/attackTime);
expNow = expMin;
for (n = 0; n < totalSamples; n++) {
    if (n < attackTime || n > decayStart) {
        expNow *= expMul;
        volume = (expNow – expMin) * peakAmp;
    } else if (n == attackTime) {
        volume = peakAmp;
    } else if (n == decayStart) {
        expNow = 1+expMin;
        expMul = pow(expMin/(1+expMin),1/decayTime));
    }
    sample[n] = volume * sin(phase);
    if ((phase += phaseIncr) >= twoPI)
        phase -= twoPI;
}

我知道这可能不是这个问题的最佳位置,但是我一直在绞尽脑汁,用谷歌搜索了好几个小时,无法弄明白,也不知道哪里会更好问。任何帮助将不胜感激。

0 个答案:

没有答案