【问题标题】:How to avoid audio sample 16bit clipping after equalization?均衡后如何避免音频样本 16 位削波?
【发布时间】:2012-12-06 12:24:08
【问题描述】:

我有来自 ffmpeg 的样本,通常是 16 位样本(短类型),我使用了带有 dbGain 的 iir 带通滤波器,如 here 所述,过滤后我有时会出现短类型溢出和结果当计算的样本值从 32767/-32767 流出时,这是一些噪音,有什么方法可以逃避音频 pcm 样本剪辑。可能存在任何方法吗?

我已经用谷歌搜索但没有找到任何有效的例子?

更新

当我将传递函数计算结果转换为整数并检查溢出时,仍然会出现噪音::

int result = A1 * ((int) Rx) + A2 * ((int) Rxx) + A3 * ((int) Rxxx)
                    - B1 * ((int) Ryy) - B2 * ((int) Ryyy);
if (result > 32767)
    result = 32767;
if (result < -32700)
    result = -32700;
y = (short) result;

【问题讨论】:

  • 如果您的过滤器有正增益,饱和是您要承担的风险。你能更好地解释你的具体问题吗?
  • 您具体想了解什么?
  • 好吧,如果你正在应用增益,你为什么不期望它有时会溢出/饱和?
  • 我怎么能期望溢出/饱和?
  • 你的过滤器实现应该处理下溢/溢出,你可以“剪辑”,“地板”“饱和”最终结果。你应该为“中间结果”使用更高的精度(32/64位) .

标签: c audio ffmpeg pcm


【解决方案1】:

16 位 PCM 样本必须在 [-32768..+32767] 范围内。如果您将数学(在您的情况下为双二阶滤波器)应用于输入信号,则不能保证输出保持在该范围内,如果您应用正增益,这是不可避免的结果。

由于达到范围边界是这种处理的自然副作用,因此您应该使用其中一种方法来处理它(列表不应该是完整的):

  • 确保您的输入信号足够安静和/或将值右移几位,以便为输出上的大值提供余量
  • 对输出信号使用更高的位数,例如 24 位 PCM
  • 使用浮点 PCM 输出信号以在超出 PCM 采样范围时精确损失

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    相关资源
    最近更新 更多