annotate ffmpeg/libavcodec/acelp_filters.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * various filters for ACELP-based codecs
yading@10 3 *
yading@10 4 * Copyright (c) 2008 Vladimir Voroshilov
yading@10 5 *
yading@10 6 * This file is part of FFmpeg.
yading@10 7 *
yading@10 8 * FFmpeg is free software; you can redistribute it and/or
yading@10 9 * modify it under the terms of the GNU Lesser General Public
yading@10 10 * License as published by the Free Software Foundation; either
yading@10 11 * version 2.1 of the License, or (at your option) any later version.
yading@10 12 *
yading@10 13 * FFmpeg is distributed in the hope that it will be useful,
yading@10 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 16 * Lesser General Public License for more details.
yading@10 17 *
yading@10 18 * You should have received a copy of the GNU Lesser General Public
yading@10 19 * License along with FFmpeg; if not, write to the Free Software
yading@10 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 21 */
yading@10 22
yading@10 23 #include <inttypes.h>
yading@10 24
yading@10 25 #include "libavutil/avassert.h"
yading@10 26 #include "libavutil/common.h"
yading@10 27 #include "avcodec.h"
yading@10 28 #include "acelp_filters.h"
yading@10 29
yading@10 30 const int16_t ff_acelp_interp_filter[61] = { /* (0.15) */
yading@10 31 29443, 28346, 25207, 20449, 14701, 8693,
yading@10 32 3143, -1352, -4402, -5865, -5850, -4673,
yading@10 33 -2783, -672, 1211, 2536, 3130, 2991,
yading@10 34 2259, 1170, 0, -1001, -1652, -1868,
yading@10 35 -1666, -1147, -464, 218, 756, 1060,
yading@10 36 1099, 904, 550, 135, -245, -514,
yading@10 37 -634, -602, -451, -231, 0, 191,
yading@10 38 308, 340, 296, 198, 78, -36,
yading@10 39 -120, -163, -165, -132, -79, -19,
yading@10 40 34, 73, 91, 89, 70, 38,
yading@10 41 0,
yading@10 42 };
yading@10 43
yading@10 44 void ff_acelp_interpolate(int16_t* out, const int16_t* in,
yading@10 45 const int16_t* filter_coeffs, int precision,
yading@10 46 int frac_pos, int filter_length, int length)
yading@10 47 {
yading@10 48 int n, i;
yading@10 49
yading@10 50 av_assert1(frac_pos >= 0 && frac_pos < precision);
yading@10 51
yading@10 52 for (n = 0; n < length; n++) {
yading@10 53 int idx = 0;
yading@10 54 int v = 0x4000;
yading@10 55
yading@10 56 for (i = 0; i < filter_length;) {
yading@10 57
yading@10 58 /* The reference G.729 and AMR fixed point code performs clipping after
yading@10 59 each of the two following accumulations.
yading@10 60 Since clipping affects only the synthetic OVERFLOW test without
yading@10 61 causing an int type overflow, it was moved outside the loop. */
yading@10 62
yading@10 63 /* R(x):=ac_v[-k+x]
yading@10 64 v += R(n-i)*ff_acelp_interp_filter(t+6i)
yading@10 65 v += R(n+i+1)*ff_acelp_interp_filter(6-t+6i) */
yading@10 66
yading@10 67 v += in[n + i] * filter_coeffs[idx + frac_pos];
yading@10 68 idx += precision;
yading@10 69 i++;
yading@10 70 v += in[n - i] * filter_coeffs[idx - frac_pos];
yading@10 71 }
yading@10 72 if (av_clip_int16(v >> 15) != (v >> 15))
yading@10 73 av_log(NULL, AV_LOG_WARNING, "overflow that would need cliping in ff_acelp_interpolate()\n");
yading@10 74 out[n] = v >> 15;
yading@10 75 }
yading@10 76 }
yading@10 77
yading@10 78 void ff_acelp_interpolatef(float *out, const float *in,
yading@10 79 const float *filter_coeffs, int precision,
yading@10 80 int frac_pos, int filter_length, int length)
yading@10 81 {
yading@10 82 int n, i;
yading@10 83
yading@10 84 for (n = 0; n < length; n++) {
yading@10 85 int idx = 0;
yading@10 86 float v = 0;
yading@10 87
yading@10 88 for (i = 0; i < filter_length;) {
yading@10 89 v += in[n + i] * filter_coeffs[idx + frac_pos];
yading@10 90 idx += precision;
yading@10 91 i++;
yading@10 92 v += in[n - i] * filter_coeffs[idx - frac_pos];
yading@10 93 }
yading@10 94 out[n] = v;
yading@10 95 }
yading@10 96 }
yading@10 97
yading@10 98
yading@10 99 void ff_acelp_high_pass_filter(int16_t* out, int hpf_f[2],
yading@10 100 const int16_t* in, int length)
yading@10 101 {
yading@10 102 int i;
yading@10 103 int tmp;
yading@10 104
yading@10 105 for (i = 0; i < length; i++) {
yading@10 106 tmp = (hpf_f[0]* 15836LL) >> 13;
yading@10 107 tmp += (hpf_f[1]* -7667LL) >> 13;
yading@10 108 tmp += 7699 * (in[i] - 2*in[i-1] + in[i-2]);
yading@10 109
yading@10 110 /* With "+0x800" rounding, clipping is needed
yading@10 111 for ALGTHM and SPEECH tests. */
yading@10 112 out[i] = av_clip_int16((tmp + 0x800) >> 12);
yading@10 113
yading@10 114 hpf_f[1] = hpf_f[0];
yading@10 115 hpf_f[0] = tmp;
yading@10 116 }
yading@10 117 }
yading@10 118
yading@10 119 void ff_acelp_apply_order_2_transfer_function(float *out, const float *in,
yading@10 120 const float zero_coeffs[2],
yading@10 121 const float pole_coeffs[2],
yading@10 122 float gain, float mem[2], int n)
yading@10 123 {
yading@10 124 int i;
yading@10 125 float tmp;
yading@10 126
yading@10 127 for (i = 0; i < n; i++) {
yading@10 128 tmp = gain * in[i] - pole_coeffs[0] * mem[0] - pole_coeffs[1] * mem[1];
yading@10 129 out[i] = tmp + zero_coeffs[0] * mem[0] + zero_coeffs[1] * mem[1];
yading@10 130
yading@10 131 mem[1] = mem[0];
yading@10 132 mem[0] = tmp;
yading@10 133 }
yading@10 134 }
yading@10 135
yading@10 136 void ff_tilt_compensation(float *mem, float tilt, float *samples, int size)
yading@10 137 {
yading@10 138 float new_tilt_mem = samples[size - 1];
yading@10 139 int i;
yading@10 140
yading@10 141 for (i = size - 1; i > 0; i--)
yading@10 142 samples[i] -= tilt * samples[i - 1];
yading@10 143
yading@10 144 samples[0] -= tilt * *mem;
yading@10 145 *mem = new_tilt_mem;
yading@10 146 }
yading@10 147
yading@10 148 void ff_acelp_filter_init(ACELPFContext *c)
yading@10 149 {
yading@10 150 c->acelp_interpolatef = ff_acelp_interpolatef;
yading@10 151 c->acelp_apply_order_2_transfer_function = ff_acelp_apply_order_2_transfer_function;
yading@10 152
yading@10 153 if(HAVE_MIPSFPU)
yading@10 154 ff_acelp_filter_init_mips(c);
yading@10 155 }