我有来自 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;
最佳答案
16 位 PCM 样本必须在 [-32768..+32767] 范围内。如果您将数学(在您的情况下为双二阶滤波器)应用于输入信号,则不能保证输出保持在范围内,如果您应用正增益,这是不可避免的结果。
由于达到范围边界是这种处理的自然副作用,您应该使用其中一种方法来处理它(列表应该不完整):
- 确保您的输入信号足够安静和/或将值右移几位以为输出的大值提供余量
- 对输出信号使用更高的位数,例如 24 位 PCM
- 将浮点 PCM 用于输出信号以防止超出 PCM 采样范围时的精度损失
关于c - 均衡后如何避免音频样本16位削波?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13947498/