c - 均衡后如何避免音频样本16位削波?

标签 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;

最佳答案

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

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

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

关于c - 均衡后如何避免音频样本16位削波?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13947498/

相关文章:

C 编程。为什么这不起作用?

linux - 从属模式下类似于 mplayer 的命令行音频播放器

ffmpeg - 如何使用 ffmpeg 覆盖 2 个视频,以便在主视频之前开始覆盖?

android - 使用最新的 FFmpeg 库和 NDK 编译 Android 中的简单库时出错

c++ - 我用 Gstreamer MSVC 1.16.1 构建 opencv 3.4,现在 imread 和 VideoCapture 不起作用

c - pthread_atfork() 被多次调用导致 after fork() 函数被多次调用

android - NFC P2P as3911 <--> 手机

比较 unsigned 和 signed int

audio - 关于声码器的使用

android - Android刷新音频播放器中的搜索栏进度和播放持续时间,导致音频播放滞后