我想知道音频单元在缓冲区中的期望值。现在,当我在幅度为0.5的单个频率上计算正弦波样本时,一切正常。音频单元样本值范围
但是当我想要同时播放几个频率时,例如同时播放5个频率,我将这些样本合计起来,样本值就会变得更高,并且声音不再清晰。
所以我想知道我的最大样本值可以在我开始变得肮脏的声音之前。
我想知道音频单元在缓冲区中的期望值。现在,当我在幅度为0.5的单个频率上计算正弦波样本时,一切正常。音频单元样本值范围
但是当我想要同时播放几个频率时,例如同时播放5个频率,我将这些样本合计起来,样本值就会变得更高,并且声音不再清晰。
所以我想知道我的最大样本值可以在我开始变得肮脏的声音之前。
在OS X
样本值通常内[-1.0...1.0)
,其中所述最大和最小对应于0 dBFS的。但是,您应该准备好处理更大的样本值。
许多使用浮点渲染/混合图表的人习惯于在不考虑超过0 dBFS的情况下工作。只有当它们输出到硬件或音频文件时,它们才能验证信号不超过0 dBFS。
如果你只有一个合成器,合计5个正弦,每个都在-6 dBFS,在正常情况下,即使你超过[-1 ... 1),也不应该剪切信号,因为你正在使用浮动点数代表你的信号。
也有少数例外情况:
我会典型地通过发送一个明显的剪辑信号来证明/反驳。当然,选择使用ints进行处理的信号处理器/发生器可以(并且应该)留出大量的空间来避免削波(因为处理器不太可能使用小于32位的任何处理来处理音频)。
在iOS
因为浮点处理是在iOS设备慢得多,所述法服AudioUnitSampleType
被指定为Q7.24固定点。
对这种格式的解释can be found here。另请参阅与此主题相关的帖子。
因为这不是浮点数,所以您必须更加小心您的增益阶段以避免内部削波。
另请注意,可以在iOS上配置32位float
图表。在这种情况下,您应该避免在处理器的输出处超出[-1.0...1.0)
,因为很可能您的输出将比以后更快地转换为非浮点表示(与OS X相比),除非您直接控制在处理链下游的适当点进行增益分级,并适当调整这些点的幅度。
通过在达到DAC之前将输出降低到什么程度意味着什么。这与振幅有什么关系?我只是将我的样本总和发送到缓冲区。我的代码基于此示例:http://cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html – networkprofile
@Sled该文章是关于iOS上的AudioUnits - 与桌面完全不同的世界,原始/通用/开放的AudioUnit。将不得不更新答案。我的答案是关于OS X上的AU. – justin
对不起,我应该提到这是一个iOS应用程序,但并不认为这很重要。 – networkprofile
你可以对它们进行标准化,而不是直接添加它们,你可以为每个样本执行一个均值。 –
关于如何完成的任何示例? – networkprofile
如果在你的代码中你正在做'out [i] = a [i] + b [i] + c [i]',那么现在你应该'out [i] =(a [i] + b [i] + C [1])/ 3'。 –