Algorithm 采样器更改之间的音频淡出功能

Algorithm 采样器更改之间的音频淡出功能,algorithm,function,math,audio,sample-rate,Algorithm,Function,Math,Audio,Sample Rate,我正在尝试创建一个简单的函数,它可以在每次迭代通过缓冲区时减少缓冲区中的音频音量(如淡出)。这是我的简单函数 double iterationSum = 1.0; double iteration(double sample) { iterationSum *= 0.9; //and then multiply that sum with the current sample. sample *= iterationSum; return sample; } 这在设置为44100

我正在尝试创建一个简单的函数,它可以在每次迭代通过缓冲区时减少缓冲区中的音频音量(如淡出)。这是我的简单函数

double iterationSum = 1.0;

double iteration(double sample)
{
 iterationSum *= 0.9;

 //and then multiply that sum with the current sample.
 sample *= iterationSum;
 return sample;
}
这在设置为44100 kHz采样器时效果很好,但我遇到的问题是,例如,如果采样器更改为88200 kHz,则每次只能将该步骤的体积减少一半,因为采样器的体积是该步骤的两倍,否则会在中场结束“淡出”,我试着使用44100/88200=0.5这样的系数,但这不会使它以任何方式变为半步

我被这个简单的问题困住了,需要一个指导来引导我,如果在编程期间更改了采样器,那么在每次迭代中调用这个函数时,我该怎么做才能使它变为半步呢


你好,摩根,我不知道我是否明白,但是像这样的事情呢:

public void fadeOut(double sampleRate)
{
    //run 1 iteration per sec?
    int defaultIterations=10;

    double decrement = calculateIteration(sampleRate, defaultIterations);

    for(int i=0; i < defaultIterations; i++)
    {

        //maybe run each one of these loops every x ms?
        sampleRate = processIteration(sampleRate, decrement);
    }
}


public double calculateIteration(double sampleRate, int numIterations)
{
    return sampleRate/numIterations;
}


private double processIteration(double sampleRate, double decrement)
{
    return sampleRate -= decrement;
}
public void fadeOut(双采样器)
{
//每秒运行1次迭代?
int=10;
双减量=计算(采样率,默认迭代次数);
对于(int i=0;i
我不确定我是否理解,但是像这样的事情呢:

public void fadeOut(double sampleRate)
{
    //run 1 iteration per sec?
    int defaultIterations=10;

    double decrement = calculateIteration(sampleRate, defaultIterations);

    for(int i=0; i < defaultIterations; i++)
    {

        //maybe run each one of these loops every x ms?
        sampleRate = processIteration(sampleRate, decrement);
    }
}


public double calculateIteration(double sampleRate, int numIterations)
{
    return sampleRate/numIterations;
}


private double processIteration(double sampleRate, double decrement)
{
    return sampleRate -= decrement;
}
public void fadeOut(双采样器)
{
//每秒运行1次迭代?
int=10;
双减量=计算(采样率,默认迭代次数);
对于(int i=0;i
我不确定我是否理解,但是像这样的事情呢:

public void fadeOut(double sampleRate)
{
    //run 1 iteration per sec?
    int defaultIterations=10;

    double decrement = calculateIteration(sampleRate, defaultIterations);

    for(int i=0; i < defaultIterations; i++)
    {

        //maybe run each one of these loops every x ms?
        sampleRate = processIteration(sampleRate, decrement);
    }
}


public double calculateIteration(double sampleRate, int numIterations)
{
    return sampleRate/numIterations;
}


private double processIteration(double sampleRate, double decrement)
{
    return sampleRate -= decrement;
}
public void fadeOut(双采样器)
{
//每秒运行1次迭代?
int=10;
双减量=计算(采样率,默认迭代次数);
对于(int i=0;i
我不确定我是否理解,但是像这样的事情呢:

public void fadeOut(double sampleRate)
{
    //run 1 iteration per sec?
    int defaultIterations=10;

    double decrement = calculateIteration(sampleRate, defaultIterations);

    for(int i=0; i < defaultIterations; i++)
    {

        //maybe run each one of these loops every x ms?
        sampleRate = processIteration(sampleRate, decrement);
    }
}


public double calculateIteration(double sampleRate, int numIterations)
{
    return sampleRate/numIterations;
}


private double processIteration(double sampleRate, double decrement)
{
    return sampleRate -= decrement;
}
public void fadeOut(双采样器)
{
//每秒运行1次迭代?
int=10;
双减量=计算(采样率,默认迭代次数);
对于(int i=0;i
独立于采样率的淡出最可靠的方法是跟踪淡出开始后的时间,并使用显式的
淡出(时间)
功能

double iterationSum = 1.0;

double iteration(double sample)
{
 iterationSum *= 0.9;

 //and then multiply that sum with the current sample.
 sample *= iterationSum;
 return sample;
}
如果由于某种原因您不能这样做,您可以根据采样率设置指数衰减率,如下所示:

double decay_time = 0.01; // time to fall to ~37% of original amplitude
double sample_time = 1.0 / sampleRate;
double natural_decay_factor = exp(- sample_time / decay_time);
...
double iteration(double sample) {
    iterationSum *= natural_decay_factor;
    ...
}
之所以使用
~37%
是因为
exp(x)=e^x
,其中e是“自然对数”基数,
1/e~0.3678…
。如果要为衰减时间指定不同的衰减因子,则需要通过常数对其进行缩放:

// for decay to 50% amplitude (~ -6dB) over the given decay_time:
double halflife_decay_factor = exp(- log(2) * sample_time / decay_time);

// for decay to 10% amplitude (-20dB) over the given decay_time:
double db20_decay_factor = exp(- log(10) * sample_time / decay_time);

独立于采样率的淡出最可靠的方法是跟踪淡出开始后的时间,并使用显式的
fadeout(time)
函数

double iterationSum = 1.0;

double iteration(double sample)
{
 iterationSum *= 0.9;

 //and then multiply that sum with the current sample.
 sample *= iterationSum;
 return sample;
}
如果由于某种原因您不能这样做,您可以根据采样率设置指数衰减率,如下所示:

double decay_time = 0.01; // time to fall to ~37% of original amplitude
double sample_time = 1.0 / sampleRate;
double natural_decay_factor = exp(- sample_time / decay_time);
...
double iteration(double sample) {
    iterationSum *= natural_decay_factor;
    ...
}
之所以使用
~37%
是因为
exp(x)=e^x
,其中e是“自然对数”基数,
1/e~0.3678…
。如果要为衰减时间指定不同的衰减因子,则需要通过常数对其进行缩放:

// for decay to 50% amplitude (~ -6dB) over the given decay_time:
double halflife_decay_factor = exp(- log(2) * sample_time / decay_time);

// for decay to 10% amplitude (-20dB) over the given decay_time:
double db20_decay_factor = exp(- log(10) * sample_time / decay_time);

独立于采样率的淡出最可靠的方法是跟踪淡出开始后的时间,并使用显式的
fadeout(time)
函数

double iterationSum = 1.0;

double iteration(double sample)
{
 iterationSum *= 0.9;

 //and then multiply that sum with the current sample.
 sample *= iterationSum;
 return sample;
}
如果由于某种原因您不能这样做,您可以根据采样率设置指数衰减率,如下所示:

double decay_time = 0.01; // time to fall to ~37% of original amplitude
double sample_time = 1.0 / sampleRate;
double natural_decay_factor = exp(- sample_time / decay_time);
...
double iteration(double sample) {
    iterationSum *= natural_decay_factor;
    ...
}
之所以使用
~37%
是因为
exp(x)=e^x
,其中e是“自然对数”基数,
1/e~0.3678…
。如果要为衰减时间指定不同的衰减因子,则需要通过常数对其进行缩放:

// for decay to 50% amplitude (~ -6dB) over the given decay_time:
double halflife_decay_factor = exp(- log(2) * sample_time / decay_time);

// for decay to 10% amplitude (-20dB) over the given decay_time:
double db20_decay_factor = exp(- log(10) * sample_time / decay_time);

独立于采样率的淡出最可靠的方法是跟踪淡出开始后的时间,并使用显式的
fadeout(time)
函数

double iterationSum = 1.0;

double iteration(double sample)
{
 iterationSum *= 0.9;

 //and then multiply that sum with the current sample.
 sample *= iterationSum;
 return sample;
}
如果由于某种原因您不能这样做,您可以根据采样率设置指数衰减率,如下所示:

double decay_time = 0.01; // time to fall to ~37% of original amplitude
double sample_time = 1.0 / sampleRate;
double natural_decay_factor = exp(- sample_time / decay_time);
...
double iteration(double sample) {
    iterationSum *= natural_decay_factor;
    ...
}
之所以使用
~37%
是因为
exp(x)=e^x
,其中e是“自然对数”基数,
1/e~0.3678…
。如果要为衰减时间指定不同的衰减因子,则需要通过常数对其进行缩放:

// for decay to 50% amplitude (~ -6dB) over the given decay_time:
double halflife_decay_factor = exp(- log(2) * sample_time / decay_time);

// for decay to 10% amplitude (-20dB) over the given decay_time:
double db20_decay_factor = exp(- log(10) * sample_time / decay_time);

因此,您要做的是获取当前采样器,并在相同的时间内将其减少(淡出)为零。不管取样器是什么?@Greg是的,不管取样器是什么,我在这里试图通过乘法获得相同的时间。你在寻找一条特定的曲线吗?没有