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是的,不管取样器是什么,我在这里试图通过乘法获得相同的时间。你在寻找一条特定的曲线吗?没有