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: hp50.c                                                     *
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                       *
205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen*      Description:                                                 *
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 2nd order high pass filter with cut off frequency at 31 Hz.           *
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Designed with cheby2 function in MATLAB.                              *
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Optimized for fixed-point to get the following frequency response:    *
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                       *
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*  frequency:     0Hz    14Hz  24Hz   31Hz   37Hz   41Hz   47Hz         *
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*  dB loss:     -infdB  -15dB  -6dB   -3dB  -1.5dB  -1dB  -0.5dB        *
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                       *
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Algorithm:                                                            *
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                       *
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*  y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2]                         *
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                   + a[1]*y[i-1] + a[2]*y[i-2];                        *
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                       *
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*  Word16 b[3] = {4053, -8106, 4053};       in Q12                      *
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*  Word16 a[3] = {8192, 16211, -8021};       in Q12                     *
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                       *
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*  float -->   b[3] = {0.989501953, -1.979003906,  0.989501953};        *
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*              a[3] = {1.000000000,  1.978881836, -0.979125977};        *
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h"
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h"
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "oper_32b.h"
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "cnst.h"
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "acelp.h"
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* filter coefficients  */
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic Word16 b[3] = {4053, -8106, 4053};  /* Q12 */
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic Word16 a[3] = {8192, 16211, -8021}; /* Q12 (x2) */
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Initialization of static values */
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Init_HP50_12k8(Word16 mem[])
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Set_zero(mem, 6);
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid HP50_12k8(
595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 signal[],                      /* input/output signal */
605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 lg,                            /* lenght of signal    */
615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 mem[]                          /* filter memory [6]   */
625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen          )
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 x2;
655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;
665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 L_tmp;
675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 num;
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    y2_hi = *mem++;
705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    y2_lo = *mem++;
715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    y1_hi = *mem++;
725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    y1_lo = *mem++;
735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    x0 = *mem++;
745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    x1 = *mem;
755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    num = (Word32)lg;
765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    do
775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        x2 = x1;
795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        x1 = x0;
805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        x0 = *signal;
815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2]  */
825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        /* + a[1]*y[i-1] + a[2] * y[i-2];  */
835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_tmp = 8192 ;                    /* rounding to maximise precision */
845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_tmp += y1_lo * a[1];
855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_tmp += y2_lo * a[2];
865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_tmp = L_tmp >> 14;
875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2) * b[0] + x1 * b[1]) << 1;
885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_tmp <<= 2;           /* coeff Q12 --> Q13 */
895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        y2_hi = y1_hi;
905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        y2_lo = y1_lo;
915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        y1_hi = (Word16)(L_tmp>>16);
925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        y1_lo = (Word16)((L_tmp & 0xffff)>>1);
935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *signal++ = extract_h((L_add((L_tmp<<1), 0x8000)));
945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }while(--num !=0);
95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    *mem-- = x1;
975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    *mem-- = x0;
985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    *mem-- = y1_lo;
995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    *mem-- = y1_hi;
1005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    *mem-- = y2_lo;
1015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    *mem-- = y2_hi;
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    return;
104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
107