Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
混合声波(iOS上的CoreAudio)_Ios_Audio_Core Audio_Pcm_Mixing - Fatal编程技术网

混合声波(iOS上的CoreAudio)

混合声波(iOS上的CoreAudio),ios,audio,core-audio,pcm,mixing,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 + wa

在我看来,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
我可以这样做吗?我是否应该预先分析声波以找到实际的最大振幅(因为最大点可能与时间线不匹配)并使用它

我想要的是一种方法,可以在不降低音量的情况下同时播放多个合成声音,而且听起来非常无缝。如果我用几个合成乐器弹奏和弦,我不想要求单个音符实际上是无声的


谢谢。

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

您可以研究自适应AGC(自动增益控制),它将更缓慢地改变比例因子,但在快速瞬变过程中仍可能剪裁或获得突然的音量变化

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

如果您确实使用AGC,那么孤立的音符听起来可能比在和弦中播放时声音更大,这可能无法正确表示乐曲的意图(尽管这种压缩在恼人的电视和广播广告中很常见)

缩小混音器输出音量,使音符永远不会被剪辑或音量减小,除非合成显示将导致大量通道的音量大大减小的混音(这就是为什么广播中正确复制的古典音乐往往过于安静,无法吸引足够多的观众来赚钱)


这完全是一种折衷。

我不认为这是一个问题。如果你知道所有波的最大振幅(在所有时间内),它应该会起作用。确保不要在每个样本的基础上改变振幅,而是决定每个“注意事项”。这是一个非常简单的算法,但可以满足您的需要。

谢谢。我将尝试不同的技术,看看什么是最好的。在找到最佳解决方案之前,我将欢迎更多的答案。