我正在开发一个应用程序,我想在其中使用 Objective-c 在录制的音频文件中添加回声效果。
我正在使用 DIRAC 来添加其他效果,例如男人对女人,慢,快。
现在我必须制作录制声音的机器人声音。对于机器人声音,我需要添加回声效果
请帮我这样做
我正在开发一个应用程序,我想在其中使用 Objective-c 在录制的音频文件中添加回声效果。
我正在使用 DIRAC 来添加其他效果,例如男人对女人,慢,快。
现在我必须制作录制声音的机器人声音。对于机器人声音,我需要添加回声效果
请帮我这样做
回声非常简单。您需要一条延迟线,并且需要很少的乘法。假设一个通道和音频已经用浮点表示,延迟线看起来像这样(在类似 C 的伪代码中):
int LENGTH = samplerate * seconds; //seconds is the desired length of the delay in seconds
float buffer[ LENGTH ];
int readIndex = 0, writeIndex = LENGTH - 1;
float delayLine.readNext( float x ) {
float ret = buffer[readIndex];
++readIndex;
if( readIndex >= LENGTH )
readIndex = 0;
return ret;
}
void delayLine.writeNext( float x ) {
buffer[ writeIndex ] = x;
++writeIndex;
if( writeIndex >= LENGTH )
writeIndex = 0;
}
不要忘记将缓冲区初始化为全零。
这就是你的延迟线。基本用法是这样的:
float singleDelay( float x ) {
delayLine.writeNext(x);
return delayLine.readNext( x );
}
但你不会听到太大的不同:它会在稍后出现。如果你想听到一个回声,你需要这样的东西:
float singleEcho( float x, float g ) {
delayLine.writeNext(x);
return x + g * delayLine.readNext( x );
}
其中 g 是某个常数,通常介于 0 和 1 之间。
现在说你想要一个回声流:“HELLO...Hello...hello...h...”就像这样。你只需要做更多的工作:
float echo( float x, float g ) {
float ret = x + g * delayLine.readNext( x );
delayLine.writeNext( ret );
return ret;
}
注意这次整个事情的输出是如何反馈到延迟线的,而不是输入。在这种情况下,|g| 非常重要。< 1。
您可能会在此处遇到非规范化问题。我不记得这是否是 iOS 上的问题,但我不这么认为。