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: hp400.c * 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Description: * 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 2nd order high pass filter with cut off frequency at 400 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 100Hz 200Hz 300Hz 400Hz 630Hz 1.5kHz 3kHz * 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* dB loss: -infdB -30dB -20dB -10dB -3dB +6dB +1dB 0dB * 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] = {3660, -7320, 3660}; in Q12 * 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Word16 a[3] = {4096, 7320, -3540}; in Q12 * 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* float --> b[3] = {0.893554687, -1.787109375, 0.893554687}; * 37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* a[3] = {1.000000000, 1.787109375, -0.864257812}; * 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/ 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h" 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h" 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "oper_32b.h" 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "acelp.h" 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* filter coefficients */ 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic Word16 b[3] = {915, -1830, 915}; /* Q12 (/4) */ 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic Word16 a[3] = {16384, 29280, -14160}; /* Q12 (x4) */ 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Initialization of static values */ 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Init_HP400_12k8(Word16 mem[]) 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Set_zero(mem, 6); 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid HP400_12k8( 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 signal[], /* input signal / output is divided by 16 */ 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 lg, /* lenght of signal */ 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 mem[] /* filter memory [6] */ 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 x2; 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1; 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_tmp; 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 num; 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y2_hi = *mem++; 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y2_lo = *mem++; 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y1_hi = *mem++; 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y1_lo = *mem++; 71b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x0 = *mem++; 72b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x1 = *mem; 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard num = (Word32)lg; 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard do 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard x2 = x1; 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard x1 = x0; 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard x0 = *signal; 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] */ 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* + a[1]*y[i-1] + a[2] * y[i-2]; */ 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp = 8192L; /* rounding to maximise precision */ 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp += y1_lo * a[1]; 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp += y2_lo * a[2]; 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp = L_tmp >> 14; 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2)* b[0] + x1 * b[1]) << 1; 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp <<= 1; /* coeff Q12 --> Q13 */ 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y2_hi = y1_hi; 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y2_lo = y1_lo; 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y1_hi = (Word16)(L_tmp>>16); 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y1_lo = (Word16)((L_tmp & 0xffff)>>1); 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* signal is divided by 16 to avoid overflow in energy computation */ 93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *signal++ = (L_tmp + 0x8000) >> 16; 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard }while(--num !=0); 95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *mem-- = x1; 97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *mem-- = x0; 98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *mem-- = y1_lo; 99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *mem-- = y1_hi; 100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *mem-- = y2_lo; 101b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *mem = y2_hi; 102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 107