00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <inttypes.h>
00024
00025 #include "avcodec.h"
00026 #include "acelp_filters.h"
00027 #define FRAC_BITS 13
00028 #include "mathops.h"
00029
00030 const int16_t ff_acelp_interp_filter[61] =
00031 {
00032 29443, 28346, 25207, 20449, 14701, 8693,
00033 3143, -1352, -4402, -5865, -5850, -4673,
00034 -2783, -672, 1211, 2536, 3130, 2991,
00035 2259, 1170, 0, -1001, -1652, -1868,
00036 -1666, -1147, -464, 218, 756, 1060,
00037 1099, 904, 550, 135, -245, -514,
00038 -634, -602, -451, -231, 0, 191,
00039 308, 340, 296, 198, 78, -36,
00040 -120, -163, -165, -132, -79, -19,
00041 34, 73, 91, 89, 70, 38,
00042 0,
00043 };
00044
00045 void ff_acelp_interpolate(
00046 int16_t* out,
00047 const int16_t* in,
00048 const int16_t* filter_coeffs,
00049 int precision,
00050 int pitch_delay_frac,
00051 int filter_length,
00052 int length)
00053 {
00054 int n, i;
00055
00056 assert(pitch_delay_frac >= 0 && pitch_delay_frac < precision);
00057
00058 for(n=0; n<length; n++)
00059 {
00060 int idx = 0;
00061 int v = 0x4000;
00062
00063 for(i=0; i<filter_length;)
00064 {
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 v += in[n + i] * filter_coeffs[idx + pitch_delay_frac];
00076 idx += precision;
00077 i++;
00078 v += in[n - i] * filter_coeffs[idx - pitch_delay_frac];
00079 }
00080 out[n] = av_clip_int16(v >> 15);
00081 }
00082 }
00083
00084 void ff_acelp_convolve_circ(
00085 int16_t* fc_out,
00086 const int16_t* fc_in,
00087 const int16_t* filter,
00088 int subframe_size)
00089 {
00090 int i, k;
00091
00092 memset(fc_out, 0, subframe_size * sizeof(int16_t));
00093
00094
00095
00096
00097
00098
00099
00100 for(i=0; i<subframe_size; i++)
00101 {
00102 if(fc_in[i])
00103 {
00104 for(k=0; k<i; k++)
00105 fc_out[k] += (fc_in[i] * filter[subframe_size + k - i]) >> 15;
00106
00107 for(k=i; k<subframe_size; k++)
00108 fc_out[k] += (fc_in[i] * filter[k - i]) >> 15;
00109 }
00110 }
00111 }
00112
00113 int ff_acelp_lp_synthesis_filter(
00114 int16_t *out,
00115 const int16_t* filter_coeffs,
00116 const int16_t* in,
00117 int buffer_length,
00118 int filter_length,
00119 int stop_on_overflow,
00120 int rounder)
00121 {
00122 int i,n;
00123
00124
00125 filter_length++;
00126 filter_coeffs--;
00127
00128 for(n=0; n<buffer_length; n++)
00129 {
00130 int sum = rounder;
00131 for(i=1; i<filter_length; i++)
00132 sum -= filter_coeffs[i] * out[n-i];
00133
00134 sum = (sum >> 12) + in[n];
00135
00136
00137 if(sum + 0x8000 > 0xFFFFU)
00138 {
00139 if(stop_on_overflow)
00140 return 1;
00141 sum = (sum >> 31) ^ 32767;
00142 }
00143 out[n] = sum;
00144 }
00145
00146 return 0;
00147 }
00148
00149 void ff_acelp_weighted_filter(
00150 int16_t *out,
00151 const int16_t* in,
00152 const int16_t *weight_pow,
00153 int filter_length)
00154 {
00155 int n;
00156 for(n=0; n<filter_length; n++)
00157 out[n] = (in[n] * weight_pow[n] + 0x4000) >> 15;
00158 }
00159
00160 void ff_acelp_high_pass_filter(
00161 int16_t* out,
00162 int hpf_f[2],
00163 const int16_t* in,
00164 int length)
00165 {
00166 int i;
00167 int tmp;
00168
00169 for(i=0; i<length; i++)
00170 {
00171 tmp = MULL(hpf_f[0], 15836);
00172 tmp += MULL(hpf_f[1], -7667);
00173 tmp += 7699 * (in[i] - 2*in[i-1] + in[i-2]);
00174
00175
00176
00177
00178 out[i] = av_clip_int16((tmp + 0x800) >> 12);
00179
00180 hpf_f[1] = hpf_f[0];
00181 hpf_f[0] = tmp;
00182 }
00183 }