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* * 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 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{ 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Set_zero(mem, 6); 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid HP50_12k8( 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 signal[], /* input/output signal */ 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 lg, /* lenght of signal */ 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 mem[] /* filter memory [6] */ 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 x2; 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1; 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_tmp; 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 num; 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y2_hi = *mem++; 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y2_lo = *mem++; 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y1_hi = *mem++; 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y1_lo = *mem++; 73b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x0 = *mem++; 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard x1 = *mem; 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard num = (Word32)lg; 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard do 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard x2 = x1; 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard x1 = x0; 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard x0 = *signal; 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] */ 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* + a[1]*y[i-1] + a[2] * y[i-2]; */ 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp = 8192 ; /* rounding to maximise precision */ 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp += y1_lo * a[1]; 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp += y2_lo * a[2]; 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp = L_tmp >> 14; 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2) * b[0] + x1 * b[1]) << 1; 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp <<= 2; /* coeff Q12 --> Q13 */ 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y2_hi = y1_hi; 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y2_lo = y1_lo; 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y1_hi = (Word16)(L_tmp>>16); 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y1_lo = (Word16)((L_tmp & 0xffff)>>1); 93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *signal++ = extract_h((L_add((L_tmp<<1), 0x8000))); 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 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 107