均衡后如何避免音频采样16位削波?

时间:2012-12-19 07:30:58

标签: c audio ffmpeg pcm

我有来自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;

1 个答案:

答案 0 :(得分:2)

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

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

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