Algorithm ADSR包络的迭代指数曲线生成
我正在使用一本书来学习如何从代码生成音频。我很难理解其中的一部分。我正在阅读的这一章讨论了通过指数攻击、衰减和释放迭代生成ADSR信封。它首先有一个方程的算法: 但是,作者解释说,这需要对ADSR曲线中的每个样本使用pow()函数,这是低效的。然后,他继续使用另一种方法,如本摘录所述: 我的第一个问题是关于这组方程。看起来第二行是错误的,应该是y(n)=b*y(n-1),但是这本书没有勘误表,所以很难确定。如果我错了,请解释原因。其次,在等式6.7中,当c为0时,y(0)似乎总是1。这使得将其包含在本节的方程式中变得混乱,因为如果没有它,您很容易看到b=y(k)^(1/k)。我假设y(0)包含在下一个摘录中,这是我真正挣扎的书的一部分: 我理解第一段。我理解解释曲线的前两个方程式。我不明白的是他是怎么得到最后一个方程的,它解b。该算法依赖于该方程,因为它允许您使用pow()函数一次,根据所需的最小值y(0)=0和最大值y(k)=1计算b,并使用迭代乘法计算ADSR曲线的每个样本,如伪代码中所示:Algorithm ADSR包络的迭代指数曲线生成,algorithm,math,exponential,iteration,Algorithm,Math,Exponential,Iteration,我正在使用一本书来学习如何从代码生成音频。我很难理解其中的一部分。我正在阅读的这一章讨论了通过指数攻击、衰减和释放迭代生成ADSR信封。它首先有一个方程的算法: 但是,作者解释说,这需要对ADSR曲线中的每个样本使用pow()函数,这是低效的。然后,他继续使用另一种方法,如本摘录所述: 我的第一个问题是关于这组方程。看起来第二行是错误的,应该是y(n)=b*y(n-1),但是这本书没有勘误表,所以很难确定。如果我错了,请解释原因。其次,在等式6.7中,当c为0时,y(0)似乎总是1。这使得将
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;
}
expMin=0.2;//调整以更改曲率
expMul=pow((expMin+1)/expMin,1/攻击时间);
expNow=expMin;
对于(n=0;ndecastart){
expNow*=expMul;
体积=(expNow–expMin)*peakAmp;
}else if(n==攻击时间){
体积=峰值;
}else if(n==decastart){
expNow=1+expMin;
expMul=pow(expMin/(1+expMin),1/decayTime);
}
样品[n]=体积*sin(相);
如果((相位+=相位incr)>=twoPI)
相位-=twoPI;
}
我知道这可能不是回答这个问题的最佳地点,但我已经绞尽脑汁,在谷歌上搜索了好几个小时,弄不明白,不知道还有什么地方更适合提问。任何帮助都将不胜感激。这里有类似的问题:这似乎是一个很棒的论坛,我刚刚找到它。您也可以在KVR DSP论坛和native reaktor builders论坛以及其他论坛上提问