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: deemph.c * 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen* Description:filtering through 1/(1-mu z^ -1) * 215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen* Deemph2 --> signal is divided by 2 * 225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen* Deemph_32 --> for 32 bits signal. * 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/ 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h" 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h" 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "math_op.h" 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Deemph( 315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 x[], /* (i/o) : input signal overwritten by the output */ 325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 mu, /* (i) Q15 : deemphasis factor */ 335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 L, /* (i) : vector size */ 345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * mem /* (i/o) : memory (y[-1]) */ 355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i; 385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_tmp; 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = L_deposit_h(x[0]); 415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = L_mac(L_tmp, *mem, mu); 425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x[0] = vo_round(L_tmp); 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 1; i < L; i++) 455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = L_deposit_h(x[i]); 475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = L_mac(L_tmp, x[i - 1], mu); 485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x[i] = voround(L_tmp); 495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *mem = x[L - 1]; 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return; 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Deemph2( 585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 x[], /* (i/o) : input signal overwritten by the output */ 595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 mu, /* (i) Q15 : deemphasis factor */ 605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 L, /* (i) : vector size */ 615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * mem /* (i/o) : memory (y[-1]) */ 625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i; 655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_tmp; 665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = x[0] << 15; 6758996b6fa078bde4b8a68891962b43383848c190Marco Nelissen i = L_mult(*mem, mu); 6858996b6fa078bde4b8a68891962b43383848c190Marco Nelissen L_tmp = L_add(L_tmp, i); 6958996b6fa078bde4b8a68891962b43383848c190Marco Nelissen x[0] = voround(L_tmp); 705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 1; i < L; i++) 715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 tmp; 735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = x[i] << 15; 745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = (x[i - 1] * mu)<<1; 7558996b6fa078bde4b8a68891962b43383848c190Marco Nelissen L_tmp = L_add(L_tmp, tmp); 7658996b6fa078bde4b8a68891962b43383848c190Marco Nelissen x[i] = voround(L_tmp); 775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *mem = x[L - 1]; 795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return; 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Deemph_32( 845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 x_hi[], /* (i) : input signal (bit31..16) */ 855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 x_lo[], /* (i) : input signal (bit15..4) */ 865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 y[], /* (o) : output signal (x16) */ 875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 mu, /* (i) Q15 : deemphasis factor */ 885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 L, /* (i) : vector size */ 895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * mem /* (i/o) : memory (y[-1]) */ 905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 fac; 935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i, L_tmp; 945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen fac = mu >> 1; /* Q15 --> Q14 */ 965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = L_deposit_h(x_hi[0]); 985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp += (x_lo[0] * 8)<<1; 995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = (L_tmp << 3); 1005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp += ((*mem) * fac)<<1; 1015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = (L_tmp << 1); 1025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen y[0] = (L_tmp + 0x8000)>>16; 1035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 1; i < L; i++) 1055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = L_deposit_h(x_hi[i]); 1075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp += (x_lo[i] * 8)<<1; 1085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = (L_tmp << 3); 1095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp += (y[i - 1] * fac)<<1; 1105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = (L_tmp << 1); 1115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen y[i] = (L_tmp + 0x8000)>>16; 1125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *mem = y[L - 1]; 1155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return; 117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 121