| /*
|
| ** Copyright 2003-2010, VisualOn, Inc.
|
| **
|
| ** Licensed under the Apache License, Version 2.0 (the "License");
|
| ** you may not use this file except in compliance with the License.
|
| ** You may obtain a copy of the License at
|
| **
|
| ** http://www.apache.org/licenses/LICENSE-2.0
|
| **
|
| ** Unless required by applicable law or agreed to in writing, software
|
| ** distributed under the License is distributed on an "AS IS" BASIS,
|
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| ** See the License for the specific language governing permissions and
|
| ** limitations under the License.
|
| */
|
| /*******************************************************************************
|
| File: band_nrg.c
|
|
|
| Content: Band/Line energy calculations functions
|
|
|
| *******************************************************************************/ |
| |
| #include "basic_op.h"
|
| #include "band_nrg.h" |
| |
| #ifndef ARMV5E
|
| /******************************************************************************** |
| * |
| * function name: CalcBandEnergy |
| * description: Calc sfb-bandwise mdct-energies for left and right channel |
| * |
| **********************************************************************************/
|
| void CalcBandEnergy(const Word32 *mdctSpectrum, |
| const Word16 *bandOffset, |
| const Word16 numBands, |
| Word32 *bandEnergy, |
| Word32 *bandEnergySum) |
| { |
| Word32 i, j; |
| Word32 accuSum = 0; |
| |
| for (i=0; i<numBands; i++) { |
| Word32 accu = 0; |
| for (j=bandOffset[i]; j<bandOffset[i+1]; j++) |
| accu = L_add(accu, MULHIGH(mdctSpectrum[j], mdctSpectrum[j]));
|
|
|
| accu = L_add(accu, accu); |
| accuSum = L_add(accuSum, accu); |
| bandEnergy[i] = accu; |
| } |
| *bandEnergySum = accuSum; |
| } |
| |
| /******************************************************************************** |
| * |
| * function name: CalcBandEnergyMS |
| * description: Calc sfb-bandwise mdct-energies for left add or minus right channel |
| * |
| **********************************************************************************/ |
| void CalcBandEnergyMS(const Word32 *mdctSpectrumLeft, |
| const Word32 *mdctSpectrumRight, |
| const Word16 *bandOffset, |
| const Word16 numBands, |
| Word32 *bandEnergyMid, |
| Word32 *bandEnergyMidSum, |
| Word32 *bandEnergySide, |
| Word32 *bandEnergySideSum) |
| { |
| |
| Word32 i, j; |
| Word32 accuMidSum = 0; |
| Word32 accuSideSum = 0; |
| |
| |
| for(i=0; i<numBands; i++) { |
| Word32 accuMid = 0; |
| Word32 accuSide = 0; |
| for (j=bandOffset[i]; j<bandOffset[i+1]; j++) { |
| Word32 specm, specs; |
| Word32 l, r; |
| |
| l = mdctSpectrumLeft[j] >> 1; |
| r = mdctSpectrumRight[j] >> 1; |
| specm = l + r; |
| specs = l - r; |
| accuMid = L_add(accuMid, MULHIGH(specm, specm)); |
| accuSide = L_add(accuSide, MULHIGH(specs, specs)); |
| } |
|
|
| accuMid = L_add(accuMid, accuMid);
|
| accuSide = L_add(accuSide, accuSide);
|
| bandEnergyMid[i] = accuMid; |
| accuMidSum = L_add(accuMidSum, accuMid); |
| bandEnergySide[i] = accuSide; |
| accuSideSum = L_add(accuSideSum, accuSide); |
| |
| } |
| *bandEnergyMidSum = accuMidSum; |
| *bandEnergySideSum = accuSideSum; |
| } |
| |
| #endif |