1/** 2 * LPC utility code 3 * Copyright (c) 2006 Justin Ruggles <justin.ruggles@gmail.com> 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22#ifndef AVCODEC_LPC_H 23#define AVCODEC_LPC_H 24 25#include <stdint.h> 26#include "dsputil.h" 27 28#define ORDER_METHOD_EST 0 29#define ORDER_METHOD_2LEVEL 1 30#define ORDER_METHOD_4LEVEL 2 31#define ORDER_METHOD_8LEVEL 3 32#define ORDER_METHOD_SEARCH 4 33#define ORDER_METHOD_LOG 5 34 35#define MIN_LPC_ORDER 1 36#define MAX_LPC_ORDER 32 37 38 39/** 40 * Calculate LPC coefficients for multiple orders 41 */ 42int ff_lpc_calc_coefs(DSPContext *s, 43 const int32_t *samples, int blocksize, int min_order, 44 int max_order, int precision, 45 int32_t coefs[][MAX_LPC_ORDER], int *shift, int use_lpc, 46 int omethod, int max_shift, int zero_shift); 47 48void ff_lpc_compute_autocorr(const int32_t *data, int len, int lag, 49 double *autoc); 50 51#ifdef LPC_USE_DOUBLE 52#define LPC_TYPE double 53#else 54#define LPC_TYPE float 55#endif 56 57/** 58 * Levinson-Durbin recursion. 59 * Produces LPC coefficients from autocorrelation data. 60 */ 61static inline int compute_lpc_coefs(const LPC_TYPE *autoc, int max_order, 62 LPC_TYPE *lpc, int lpc_stride, int fail, 63 int normalize) 64{ 65 int i, j; 66 LPC_TYPE err; 67 LPC_TYPE *lpc_last = lpc; 68 69 if (normalize) 70 err = *autoc++; 71 72 if (fail && (autoc[max_order - 1] == 0 || err <= 0)) 73 return -1; 74 75 for(i=0; i<max_order; i++) { 76 LPC_TYPE r = -autoc[i]; 77 78 if (normalize) { 79 for(j=0; j<i; j++) 80 r -= lpc_last[j] * autoc[i-j-1]; 81 82 r /= err; 83 err *= 1.0 - (r * r); 84 } 85 86 lpc[i] = r; 87 88 for(j=0; j < (i+1)>>1; j++) { 89 LPC_TYPE f = lpc_last[ j]; 90 LPC_TYPE b = lpc_last[i-1-j]; 91 lpc[ j] = f + r * b; 92 lpc[i-1-j] = b + r * f; 93 } 94 95 if (fail && err < 0) 96 return -1; 97 98 lpc_last = lpc; 99 lpc += lpc_stride; 100 } 101 102 return 0; 103} 104 105#endif /* AVCODEC_LPC_H */ 106