Как избежать обрезки 16-битного аудиосэмпла после эквалайзера?

У меня есть сэмплы из ffmpeg, очень часто это 16-битные сэмплы (короткие), я использовал полосовой фильтр с 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;

person testCoder    schedule 19.12.2012    source источник
comment
Если ваш фильтр имеет положительное усиление, насыщение — это риск, на который вы пойдете. Можете ли вы объяснить свой конкретный вопрос лучше?   -  person Carl Norum    schedule 19.12.2012
comment
Что вы хотите узнать конкретно?   -  person testCoder    schedule 19.12.2012
comment
Что ж, если вы применяете усиление, почему бы вам не ожидать, что иногда оно будет переполняться/насыщаться?   -  person Carl Norum    schedule 19.12.2012
comment
Как я могу ожидать переполнения/насыщения?   -  person testCoder    schedule 19.12.2012
comment
ваша реализация фильтра должна заботиться о недостатке/переполнении, вы можете обрезать, насыщать пол конечным результатом. вы должны использовать более высокую точность (32/64 бита) для промежуточного результата.   -  person rajneesh    schedule 19.12.2012
comment
@testCoder, представьте, что у вас есть сигнал +32767. Если вы примените какое-либо положительное усиление к этому сигналу, он должен будет переполниться. Только если ваш фильтр имеет 0 или отрицательное усиление, вы можете быть в безопасности от переполнения.   -  person Carl Norum    schedule 19.12.2012


Ответы (1)


16-битные выборки PCM должны находиться в диапазоне [-32768..+32767]. Если вы применяете математику (в вашем случае биквадратный фильтр) к входному сигналу, выходной сигнал не гарантируется, что он останется в пределах диапазона, что является неизбежным результатом здесь, если вы применяете положительное усиление.

Поскольку попадание за границы диапазона является естественным побочным эффектом при такой обработке, вы должны позаботиться об этом, используя один из подходов (список не должен быть полным):

  • убедитесь, что ваш входной сигнал достаточно тихий и/или сдвиньте значения вправо на несколько бит, чтобы обеспечить запас для больших значений на выходе
  • использовать более высокую разрядность для выходного сигнала, например, 24-битный PCM
  • использовать ИКМ с плавающей запятой для выходного сигнала для потери точности при выходе за пределы диапазона выборки ИКМ
person Roman R.    schedule 19.12.2012