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