混合声波(iOS上的CoreAudio)

时间:2011-12-18 01:41:17

标签: ios audio core-audio pcm mixing

在我看来,当混合到单个通道时,CoreAudio会将声波加在一起。我的程序会发出合成声音。我知道每个声音的振幅。当我一起玩它们时,我应该将它们加在一起并乘以合成波以保持在该范围内吗?我可以这样做:

MaxAmplitude = max1 + max2 + max3 //Maximum amplitude of each sound wave
if MaxAmplitude > 1 then //Over range
    Output = (wave1 + wave2 + wave3)/MaxAmplitude //Meet range
else
    Output = (wave1 + wave2 + wave3) //Normal addition
end if

我可以这样做吗?我应该预先分析声波以找到实际的最大振幅(因为最大点可能在时间轴上不匹配)并使用它吗?

我想要的是一种方法,可以将多个合成声音一起播放而不会在整个声音中无缝地减小音量。如果我用几种合成乐器演奏和弦,我不希望单个音符几乎保持沉默。

谢谢。

2 个答案:

答案 0 :(得分:2)

在单个样本的基础上突然改变比例,这就是你的“if”语句所做的,听起来非常糟糕,类似于剪辑。

您可以研究自适应AGC(自动增益控制),它会更慢地改变比例因子,但在快速瞬变期间仍然可以剪辑或获得突然的音量变化。

如果你使用前瞻性的AGC算法来防止突然的瞬态削波,那么你的延迟会变得更糟。

如果你确实使用了AGC,那么隔离的音符可能听起来比在和弦中播放时声音更大,这可能无法正确表示音乐作品的意图(尽管这种类型的压缩在烦人的电视和收音机中很常见)广告)。

缩小调音台输出音量,使音符永远不会剪辑或减小音量,而不是合成指示将导致大量通道的音量大大减少(这就是正确复制古典音乐的原因)在收音机上通常太安静了,无法吸引足够多的观众赚钱。)

这都是一种权衡。

答案 1 :(得分:0)

我不认为这是一个问题。如果您知道所有波浪的最大振幅(所有时间)它应该工作。请确保不要在每个样本的基础上更改幅度,而是要确定每个“音符开启”。这是一个非常简单的算法,但可以满足您的需求。