我想知道音频单元在缓冲区中期望什么样的值。现在,当我计算振幅为 0.5 的单个频率上的正弦波样本时,一切正常。
但是,当我想同时播放多个频率时,例如一次播放 5 个频率,我通过将样本相加来将样本混合在一起,样本值会变得更高,并且声音不再干净。
所以我想知道我的最大采样值是多少,然后才开始听到脏音。
我想知道音频单元在缓冲区中期望什么样的值。现在,当我计算振幅为 0.5 的单个频率上的正弦波样本时,一切正常。
但是,当我想同时播放多个频率时,例如一次播放 5 个频率,我通过将样本相加来将样本混合在一起,样本值会变得更高,并且声音不再干净。
所以我想知道我的最大采样值是多少,然后才开始听到脏音。
在 OS X 上
样本值通常在 范围内[-1.0...1.0)
,其中最大值和最小值对应于 0 dBFS。但是,您应该准备好处理更大的样本值。
许多使用浮点渲染/混合图的人习惯于在不考虑超过 0 dBFS 的情况下工作。他们可能仅在输出到硬件或音频文件时验证信号不超过 0 dBFS。
如果您只有一个将 5 个正弦相加的合成器,每个正弦为 -6 dBFS,那么在正常情况下应该没有信号削波,即使您超过 [-1...1),因为您使用浮点数来表示你的信号。
有几个例外:
我通常会通过向它发送一个明显会削波的信号来证明/反驳这一点。当然,选择使用整数处理的信号处理器/生成器可以(并且应该)留下大量的动态余量以避免削波(因为处理器不太可能使用小于 32 位的任何东西处理音频)。
在 iOS 上
因为 iOS 设备上的浮点处理速度要慢得多,所以规范AudioUnitSampleType
被指定为 Q7.24 定点。
可以在此处找到此格式的说明。另请参阅围绕此主题的帖子。
因为这不是浮点数,所以您必须更加小心增益级以避免内部削波。
另请注意,可以float
在 iOS 上配置 32 位图形。在这种情况下,您应该避免超出[-1.0...1.0)
处理器的输出,因为您的输出很可能迟早会转换为非浮点表示(与 OS X 相比),除非您当然可以直接控制在处理链下游的合适点处进行增益分级,然后适当地调整这些点的幅度。