C 均衡后如何避免音频采样16位剪辑?

C 均衡后如何避免音频采样16位剪辑?,c,audio,ffmpeg,pcm,C,Audio,Ffmpeg,Pcm,我有来自ffmpeg的样本,通常是16位样本(短类型),我使用了iir带通滤波器和dbGain,如前所述,滤波后有时会出现短类型溢出,当计算出的样本值从32767/-32767流出时,结果是一些噪声,这是任何逃脱音频pcm样本剪辑的方法。有什么办法吗 我在谷歌上搜索过,但没有找到任何有效的例子 更新 当我将传递函数计算结果转换为整数并检查溢出时,仍然会出现噪声:: int result = A1 * ((int) Rx) + A2 * ((int) Rxx) + A3 * ((int) Rxxx

我有来自ffmpeg的样本,通常是16位样本(短类型),我使用了iir带通滤波器和dbGain,如前所述,滤波后有时会出现短类型溢出,当计算出的样本值从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;
int结果=A1*((int)Rx)+A2*((int)Rxx)+A3*((int)Rxxx)
-B1*((国际)Ryy)-B2*((国际)Ryy);
如果(结果>32767)
结果=32767;
如果(结果<-32700)
结果=-32700;
y=(短)结果;

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

由于命中范围边界是这种处理的自然副作用,因此您应该使用以下方法之一来处理它(列表不应该满):

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

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