数字音频链中是否存在电平限制?
我正在使用OpenAL进行塔防游戏,并且将同时发射许多塔,并且所有塔都使用相同的声音效果(至少现在是这样)。我担心的是,同时触发太多声音可能会导致扬声器吹响,或者至少会使用户头痛。
在我看来,应该在软件中或在声卡硬件级别上都有一个级别限制器,以防止像我这样的傻瓜这样做。
谁能确认这一点,如果可以,请告诉我该限制器在哪里?谢谢!
最佳答案
照原样,如果信号在到达DAC之前被简单地剪辑在软件中,您将很幸运。您可以轻松地自己实现。当我说“削波”时,是指将超过最大值的幅度设置为最大值,而不是允许溢出,环绕或其他不太令人讨厌的结果。在这个阶段剪辑通常听起来很糟糕,但是我提到的替代方案听起来更糟。
在这方面,实际上有一个很大的考虑要考虑:您是使用float还是int进行渲染?如果是int,您的净空是多少?使用int,您几乎可以在任何阶段进行裁剪或溢出。浮点数,只会发生严重的设计缺陷。当然,当与DAC /硬件接口(interface)时,您最终往往不得不转换为int。 DAC将限制输出,因为它可以处理非常特定的限制内的信号。在最坏的情况下,这将等于0 dB FS时(采样的)白噪声(对于用户而言可能是糟糕的体验)。所以... DAC用作限制器,尽管此阶段仅大大降低了信号引起听力或设备损坏的可能性。
无论如何,您都可以轻松避免这种情况,我建议您自己做,因为您可以直接控制声音的数量及其幅度。在最坏的情况下,峰值为0 dB FS的样本都将收敛于同一样本,您需要将信号(镜头总数)乘以镜头总数的倒数:output[i] = numShots > 1 ? allThoseShots[i]*(1.0/numShots) : allThoseShots[i];
这在很多情况下都不理想(因为会产生过大的回避声)。因此,除了整体减少同时拍摄的数量外,您实际上应该引入一个限制器。那么您可以降低拍摄信号的信号,因为它们的峰值可能不会在同一时间点收敛。一个简单的限制器,前瞻性约为10毫秒,可以防止您执行糟糕的操作。在 Debug模式下检测繁重的限制也是一个好主意,这会引起上游设计问题。
无论如何,您绝对应该考虑适当的 yield 补偿,这是您的责任-您从不希望限制输出dac。实际上,您要留出一些余量(引用:采样间峰值)。
关于audio - 我是否需要担心程序中的整体音频增益?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5024757/