这里的第一次海报。
关于在此处设置循环的快速问题。我想为主循环的前1/3设置一个for循环,它将从.00001增加一个值或类似于1.所以我可以使用它来乘以一个样本变量,以便创建一个淡入这个简单的音频文件播放程序。
到目前为止,它已经变得有点头疼,任何帮助都非常接受。
for(i=0; i < end && !feof(fpin); i+=blockframes)
{
samples = fread(audioblock, sizeof(short), blocksamples, fpin);
frames = samples;
for(j=0; j < frames; j++)
{
for (f = 0; f< frames/3 ;f++)
{
fade = fade--;
}
output[j] = audioblock[j]/fade;
}
fwrite(output,sizeof(short), frames, fpoutput);
}
道歉, 到目前为止,我已经成功阅读并重写了该文件。我的问题是我试图想出一种方法来循环变量'fade',所以它增加或减少到1,所以我可以修改输出变量。
我想说3个阶段: 1.从0到帧/ 3,将乘法因子从.0001增加到1 2.从第1/3帧到第2/3帧不做任何事情(乘以1)和 3.使因子再次降低至1以下,以使输出变量减小回原点。
如何创建一个循环来增加和减少外部循环中的这些值?
答案 0 :(得分:2)
我认为你认为自己陷入了困境。无需创建嵌套循环来修改渐变增益,您可以通过循环简单地跟踪它并在必要时进行调整。另外,你的框架/样本的变量命名对我来说似乎有点混乱,我希望我有一个正确。
float fadeTime = 0.5f;
float outputGain = 0.0f;
float gainProgressionPerSample = 1.0f/(fadeTime*SAMPLERATE);
float fadeInStop = fadeTime*SAMPLERATE;
float fadeOutBegin;
for(i=0; i < end && !feof(fpin); i+=blockframes)
{
samples = fread(audioblock, sizeof(short), blocksamples, fpin);
fadeOutBegin = samples - fadeTime*SAMPLERATE;
for(j=0; j < samples; j++)
{
if (j < fadeInStop)
{
outputGain += gainProgressionPerSample;
}
// else is not used intentionally to allow fade in/out blending for short tracks
if (j > fadeOutBegin)
{
outputGain -= gainProgressionPerSample;
}
output[j] = audioblock[j]*outputGain;
}
fwrite(output,sizeof(short), samples, fpoutput);
}
答案 1 :(得分:0)
我的第一个观察结果:
fade = fade--;
不起作用,因为它等同于
int temp = fade - 1;
fade = fade;
这是后增量运算符的工作方式。所以你应该写一下
fade--;
代替(或--fade
- 无论你喜欢什么: - )。
然后你应该建立你的循环:
for(j=0; j < frames/3; j++)
{
fade--;
output[j] = audioblock[j]/fade;
}
for( ; j < 2*frames/3; j++)
{
output[j] = audioblock[j]/fade;
}
for( ; j < frames; j++)
{
fade++;
output[j] = audioblock[j]/fade;
}
答案 2 :(得分:0)
在现代处理器中,没有真正的理由不使用浮点数学。它更准确,性能与整数数学大致相同。如果您使用浮点数,则没有理由不将所有临时变量都设置为双精度数。将它们声明为浮动实际上会降低性能。
此代码将为您提供超过(帧/ 3)样本的线性淡入淡出
double gain = 0.0f;
double deltaGain = (1.0 - gain)/(frames/3);
for (int i=0; i < end && !feof(fpin); i += blockframes)
{
samples = fread(audioblock, sizeof(short), blocksamples, fpin);
j = 0;
// do the fade in.
for ( ; j < samples; ++j)
{
gain += deltaGain; // adjust the gain
if (gain >= 1.0)
break;
output[j] = (short)(audioblock[j] * gain);
}
// copy the remainder.
for ( ; j < samples; ++j)
output[j] = audioblock[j];
fwrite(output,sizeof(short), samples, fpoutput);
}
基本技巧是预先计算增益乘数的起点和终点,然后除(结束 - 开始)/步骤以获得每个样本的增益应该改变的量。然后在你的内循环中,调整增益只是一个补充。只需在内环中添加两个加法就可以获得x平方增益曲线。 x-squared是对数渐变的合理近似值,其中声音更自然,因为我们的耳朵听到了对数刻度。