117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/* 217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** Copyright 2003-2010, VisualOn, Inc. 317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** 417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** Licensed under the Apache License, Version 2.0 (the "License"); 517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** you may not use this file except in compliance with the License. 617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** You may obtain a copy of the License at 717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** 817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** http://www.apache.org/licenses/LICENSE-2.0 917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** 1017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** Unless required by applicable law or agreed to in writing, software 1117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** distributed under the License is distributed on an "AS IS" BASIS, 1217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** See the License for the specific language governing permissions and 1417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** limitations under the License. 1517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong */ 1617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 1717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*********************************************************************** 1817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* File: deemph.c * 1917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* * 2017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* Description:filtering through 1/(1-mu z^ -1) * 2117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* Deemph2 --> signal is divided by 2 * 2217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* Deemph_32 --> for 32 bits signal. * 2317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* * 2417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong************************************************************************/ 2517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 2617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "typedef.h" 2717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "basic_op.h" 2817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "math_op.h" 2917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 3017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongvoid Deemph( 3117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 x[], /* (i/o) : input signal overwritten by the output */ 3217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 mu, /* (i) Q15 : deemphasis factor */ 3317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 L, /* (i) : vector size */ 3417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 * mem /* (i/o) : memory (y[-1]) */ 3517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ) 3617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 3717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 i; 3817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_tmp; 3917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 4017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp = L_deposit_h(x[0]); 4117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp = L_mac(L_tmp, *mem, mu); 4217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong x[0] = vo_round(L_tmp); 4317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 4417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for (i = 1; i < L; i++) 4517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 4617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp = L_deposit_h(x[i]); 4717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp = L_mac(L_tmp, x[i - 1], mu); 4817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong x[i] = voround(L_tmp); 4917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 5017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 5117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong *mem = x[L - 1]; 5217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 5317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return; 5417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 5517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 5617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 5717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongvoid Deemph2( 5817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 x[], /* (i/o) : input signal overwritten by the output */ 5917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 mu, /* (i) Q15 : deemphasis factor */ 6017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 L, /* (i) : vector size */ 6117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 * mem /* (i/o) : memory (y[-1]) */ 6217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ) 6317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 6417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 i; 6517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_tmp; 6617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp = x[0] << 15; 6717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp += ((*mem) * mu)<<1; 6817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong x[0] = (L_tmp + 0x8000)>>16; 6917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for (i = 1; i < L; i++) 7017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 7117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp = x[i] << 15; 7217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp += (x[i - 1] * mu)<<1; 7317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong x[i] = (L_tmp + 0x8000)>>16; 7417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 7517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong *mem = x[L - 1]; 7617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return; 7717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 7817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 7917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 8017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongvoid Deemph_32( 8117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 x_hi[], /* (i) : input signal (bit31..16) */ 8217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 x_lo[], /* (i) : input signal (bit15..4) */ 8317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 y[], /* (o) : output signal (x16) */ 8417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 mu, /* (i) Q15 : deemphasis factor */ 8517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 L, /* (i) : vector size */ 8617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 * mem /* (i/o) : memory (y[-1]) */ 8717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ) 8817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 8917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 fac; 9017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 i, L_tmp; 9117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 9217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong fac = mu >> 1; /* Q15 --> Q14 */ 9317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 9417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp = L_deposit_h(x_hi[0]); 9517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp += (x_lo[0] * 8)<<1; 9617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp = (L_tmp << 3); 9717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp += ((*mem) * fac)<<1; 9817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp = (L_tmp << 1); 9917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong y[0] = (L_tmp + 0x8000)>>16; 10017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 10117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for (i = 1; i < L; i++) 10217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 10317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp = L_deposit_h(x_hi[i]); 10417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp += (x_lo[i] * 8)<<1; 10517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp = (L_tmp << 3); 10617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp += (y[i - 1] * fac)<<1; 10717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_tmp = (L_tmp << 1); 10817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong y[i] = (L_tmp + 0x8000)>>16; 10917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 11017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 11117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong *mem = y[L - 1]; 11217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 11317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return; 11417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 11517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 11617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 11717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 118