Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm ADSR包络的迭代指数曲线生成_Algorithm_Math_Exponential_Iteration - Fatal编程技术网

Algorithm 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。这使得将

我正在使用一本书来学习如何从代码生成音频。我很难理解其中的一部分。我正在阅读的这一章讨论了通过指数攻击、衰减和释放迭代生成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曲线的每个样本,如伪代码中所示:

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论坛以及其他论坛上提问