音频单元样本值范围
Posted
技术标签:
【中文标题】音频单元样本值范围【英文标题】:Audio Units samples value range 【发布时间】:2012-08-24 16:07:22 【问题描述】:我想知道音频单元在缓冲区中期望什么样的值。现在,当我计算振幅为 0.5 的单个频率上的正弦波样本时,一切正常。
但是当我想同时播放多个频率时,例如一次播放 5 个频率,然后我通过将它们相加来将样本混合在一起,样本值会变得更高,并且声音不再干净。
所以我想知道我的最大采样值是多少,然后才开始听到脏声音。
【问题讨论】:
您可以对它们进行归一化,也就是说,您可以对每个样本执行平均值,而不是简单地添加它们。 有什么例子可以说明这是如何做到的吗? 如果在你的代码中你正在做out[i]=a[i]+b[i]+c[i]
,现在你会做out[i]=(a[i]+b[i]+c[i])/3
。
如果我从三个音符变为四个音符并突然除以 4,这不会造成任何问题吗?我的意思是,幅度的突然变化不会很明显吗?
当然,这很明显,这完全取决于您的目标是什么。如果您想添加两个声音(就像同时弹奏钢琴的两个琴键一样),那么简单的添加是正确的方法;为避免失真,请确保原始幅度足够小,不会超过输出的动态范围。相反,如果您希望峰值不超过原始幅度,请取平均值。如果您想将输出的感知强度保持为输入之一,请除以声音数量的平方根(尽管实际上它更复杂)。
【参考方案1】:
在 OS X 上
样本值通常在[-1.0...1.0)
范围内,其中最大值和最小值对应于 0 dBFS。但是,您应该准备好处理更大的样本值。
许多使用浮点渲染/混合图的人习惯于在不考虑超过 0 dBFS 的情况下工作。他们可能仅在输出到硬件或音频文件时验证信号不超过 0 dBFS。
如果您只有一个将 5 个正弦信号相加的合成器,每个正弦信号为 -6 dBFS,则在正常情况下应该不会出现信号削波,即使您超过 [-1...1),因为您使用的是浮点数代表您的信号的数字。
有一些例外:
您正在使用一个不寻常的 AU 主机,它不使用浮点混合器(我想不出一个正在积极开发的) 或在输出到达 DAC 之前不降低输出 或在将输出保存到文件之前不降低输出(尽管音频文件也可以以浮点形式保存) 信号路径中某处的组件不以浮点方式处理或不支持浮点输入。这在专用硬件处理器中很常见,但如今许多第 3 方插件都以浮点方式处理。我通常会通过向它发送一个明显会削波的信号来证明/反驳这一点。当然,选择使用整数处理的信号处理器/生成器可以(并且应该)留出大量余量以避免削波(因为处理器不太可能使用小于 32 位的任何东西处理音频)。
在 iOS 上
因为在 ios 设备上浮点处理速度要慢得多,所以规范 AudioUnitSampleType
被指定为 Q7.24 定点。
这种格式的解释can be found here。另请参阅围绕该主题的帖子。
因为这不是浮点数,所以您必须更加小心增益级以避免内部削波。
另外请注意,可以在 iOS 上配置 32 位 float
图形。在这种情况下,您应该避免在处理器的输出上超过 [-1.0...1.0)
,因为您的输出很可能迟早会转换为非浮点表示(与 OS X 相比),除非您当然有直接的控制处理链下游适当点的增益分级,并适当调整这些点的幅度。
【讨论】:
在输出到达 DAC 之前降低输出到底是什么意思。跟幅度有关系吗?我只是将我的样本总和发送到缓冲区。我的代码基于这个例子:cocoawithlove.com/2010/10/… @Sled 那篇文章是关于 iOS 上的 AudioUnits 的——与桌面完全不同的世界,原始的/通用的/开放的 AudioUnit。将不得不更新答案。我的回答是关于 OS X 上的 AU。 对不起,我应该提到这是一个 iOS 应用程序,但我认为这无关紧要。 是的,在这方面完全不同,因为 iOS 上的 AU 和 fp 处理要慢得多 - 所以他们在 iOS 上使用了 Q7.24。同样,没有真正的方法在 iOS 上开发 AU,所以......我假设是 OS X。np @Sled 从技术上讲,1.0 会剪辑。只需将最大值想象为目标样本格式的整数减一(无论该宽度可能是多少)。例如:如果从浮点数转换为 8 位,则 -1 映射到 -128——类似地,+1 映射到 +128。 +127 是有符号的 8 位值表示的最高值,因此 +128 将是一个剪辑。以上是关于音频单元样本值范围的主要内容,如果未能解决你的问题,请参考以下文章