1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/***********************************************************************
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*      File: preemph.c                                                *
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                     *
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*      Description: Preemphasis: filtering through 1 - g z^-1         *
215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen*              Preemph2 --> signal is multiplied by 2             *
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                     *
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h"
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h"
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Preemph(
295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 x[],                           /* (i/o)   : input signal overwritten by the output */
305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 mu,                            /* (i) Q15 : preemphasis coefficient                */
315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 lg,                            /* (i)     : lenght of filtering                    */
325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * mem                          /* (i/o)   : memory (x[-1])                         */
335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        )
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 temp;
365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 i, L_tmp;
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    temp = x[lg - 1];
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = lg - 1; i > 0; i--)
415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_tmp = L_deposit_h(x[i]);
435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_tmp -= (x[i - 1] * mu)<<1;
445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        x[i] = (L_tmp + 0x8000)>>16;
455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    L_tmp = L_deposit_h(x[0]);
485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    L_tmp -= ((*mem) * mu)<<1;
495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    x[0] = (L_tmp + 0x8000)>>16;
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    *mem = temp;
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    return;
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Preemph2(
585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 x[],                           /* (i/o)   : input signal overwritten by the output */
595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 mu,                            /* (i) Q15 : preemphasis coefficient                */
605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 lg,                            /* (i)     : lenght of filtering                    */
615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * mem                          /* (i/o)   : memory (x[-1])                         */
625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen         )
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 temp;
655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 i, L_tmp;
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    temp = x[lg - 1];
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
69d23f7ef608b3ef917a6f9b371feebc98b74ee485Marco Nelissen    for (i = (Word16) (lg - 1); i > 0; i--)
705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_tmp = L_deposit_h(x[i]);
725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_tmp -= (x[i - 1] * mu)<<1; // only called with mu == 22282, so this won't overflow
735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if (L_tmp > INT32_MAX / 2) {
745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            L_tmp = INT32_MAX / 2;
755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_tmp = (L_tmp << 1);
777c1615d0009a5e4583d273e4a24bd0b5be2c4f53Marco Nelissen        if (L_tmp > INT32_MAX - 0x8000) {
787c1615d0009a5e4583d273e4a24bd0b5be2c4f53Marco Nelissen            L_tmp = INT32_MAX - 0x8000;
797c1615d0009a5e4583d273e4a24bd0b5be2c4f53Marco Nelissen        }
805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        x[i] = (L_tmp + 0x8000)>>16;
815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    L_tmp = L_deposit_h(x[0]);
845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    L_tmp -= ((*mem) * mu)<<1;
855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    if (L_tmp > INT32_MAX / 2) {
865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_tmp = INT32_MAX / 2;
875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    L_tmp = (L_tmp << 1);
895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    if (L_tmp > INT32_MAX - 0x8000) {
905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_tmp = INT32_MAX - 0x8000;
915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    x[0] = (L_tmp + 0x8000)>>16;
935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    *mem = temp;
955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    return;
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
101