📄 convolve.cpp
字号:
/* ------------------------------------------------------------------ * Copyright (C) 2008 PacketVideo * * 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. * ------------------------------------------------------------------- *//****************************************************************************************Portions of this file are derived from the following 3GPP standard: 3GPP TS 26.073 ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec Available from http://www.3gpp.org(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)Permission to distribute, modify and use this file under the standard licenseterms listed above has been obtained from the copyright holder.****************************************************************************************//*------------------------------------------------------------------------------ Pathname: ./audio/gsm-amr/c/src/convolve.c Date: 06/19/2000------------------------------------------------------------------------------ REVISION HISTORY Description: Optimize for speed. Update to code template. Description: Added author name and date, fixed tabs, and added missing sections. Updated Input/Output section. Description: Optimized code by calculating two convolution sums per iteration of the outer loop, thereby, decreasing outer loop count by 2. Updated input/output definitions to be the same as the assembly file (convolve.asm). Left Pseudo-code section blank. Description: Deleted semi-colon in the Pointers modified section. Description: Synchronized file with UMTS version 3.2.0. Updated coding template. Removed unnecessary include files. Description: Made the following changes per comments from Phase 2/3 review: 1. Fixed typecasting issue with TI C compiler. 2. Modified FOR loop to count down, wherever applicable. Description: Made the following changes 1. Unrolled the correlation loop. 2. Performed 2 correlation per pass per sample to avoid recalling the same data twice. 3. Eliminated math operations that check for saturation. Description: 1. Modified loop counter, extra unrolling did speed up code Description: Replaced "int" and/or "char" with OSCL defined types. Description: Using inlines from fxp_arithmetic.h . Description: Replacing fxp_arithmetic.h with basic_op.h. Description:------------------------------------------------------------------------------*//*----------------------------------------------------------------------------; INCLUDES----------------------------------------------------------------------------*/#include "typedef.h"#include "convolve.h"#include "basic_op.h"/*----------------------------------------------------------------------------; MACROS; Define module specific macros here----------------------------------------------------------------------------*//*----------------------------------------------------------------------------; DEFINES; Include all pre-processor statements here. Include conditional; compile variables also.----------------------------------------------------------------------------*//*----------------------------------------------------------------------------; LOCAL FUNCTION DEFINITIONS; Function Prototype declaration----------------------------------------------------------------------------*//*----------------------------------------------------------------------------; LOCAL STORE/BUFFER/POINTER DEFINITIONS; Variable declaration - defined here and used outside this module----------------------------------------------------------------------------*//*------------------------------------------------------------------------------ FUNCTION NAME: Convolve------------------------------------------------------------------------------ INPUT AND OUTPUT DEFINITIONS Inputs: x = pointer to input vector of L elements of type Word16 h = pointer to the filter's impulse response vector of L elements of type Word16 y = pointer to the output vector of L elements of type Word16 used for storing the convolution of x and h; L = Length of the convolution; type definition is Word16 Outputs: y buffer contains the new convolution output Returns: None Global Variables Used: None Local Variables Needed: None------------------------------------------------------------------------------ FUNCTION DESCRIPTION Perform the convolution between two vectors x[] and h[] and write the result in the vector y[]. All vectors are of length L and only the first L samples of the convolution are computed. The convolution is given by: y[n] = sum_{i=0}^{n} x[i] h[n-i], n=0,...,L-1------------------------------------------------------------------------------ REQUIREMENTS None------------------------------------------------------------------------------ REFERENCES convolve.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001------------------------------------------------------------------------------ PSEUDO-CODEvoid Convolve ( Word16 x[], // (i) : input vector Word16 h[], // (i) : impulse response Word16 y[], // (o) : output vector Word16 L // (i) : vector size){ Word16 i, n; Word32 s; for (n = 0; n < L; n++) { s = 0; move32 (); for (i = 0; i <= n; i++) { s = L_mac (s, x[i], h[n - i]); } s = L_shl (s, 3); y[n] = extract_h (s); move16 (); } return;}------------------------------------------------------------------------------ RESOURCES USED [optional] When the code is written for a specific target processor the the resources used should be documented below. HEAP MEMORY USED: x bytes STACK MEMORY USED: x bytes CLOCK CYCLES: (cycle count equation for this function) + (variable used to represent cycle count for each subroutine called) where: (cycle count variable) = cycle count for [subroutine name]------------------------------------------------------------------------------ CAUTION [optional] [State any special notes, constraints or cautions for users of this function]------------------------------------------------------------------------------*/void Convolve( Word16 x[], /* (i) : input vector */ Word16 h[], /* (i) : impulse response */ Word16 y[], /* (o) : output vector */ Word16 L /* (i) : vector size */){ register Word16 i, n; Word32 s1, s2; for (n = 1; n < L; n = n + 2) { h = h + n; s2 = ((Word32) * (x)) * *(h--); s1 = ((Word32) * (x++)) * *(h); for (i = (n - 1) >> 1; i != 0; i--) { s2 = amrnb_fxp_mac_16_by_16bb((Word32) * (x), (Word32) * (h--), s2); s1 = amrnb_fxp_mac_16_by_16bb((Word32) * (x++), (Word32) * (h), s1); s2 = amrnb_fxp_mac_16_by_16bb((Word32) * (x), (Word32) * (h--), s2); s1 = amrnb_fxp_mac_16_by_16bb((Word32) * (x++), (Word32) * (h), s1); } s2 = amrnb_fxp_mac_16_by_16bb((Word32) * (x), (Word32) * (h), s2); *(y++) = (Word16)(s1 >> 12); *(y++) = (Word16)(s2 >> 12); x = x - n; } return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -