00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <inttypes.h>
00025
00026 #include "avcodec.h"
00027 #define FRAC_BITS 14
00028 #include "mathops.h"
00029 #include "lsp.h"
00030 #include "libavcodec/mips/lsp_mips.h"
00031 #include "libavutil/avassert.h"
00032
00033 void ff_acelp_reorder_lsf(int16_t* lsfq, int lsfq_min_distance, int lsfq_min, int lsfq_max, int lp_order)
00034 {
00035 int i, j;
00036
00037
00038
00039 for(i=0; i<lp_order-1; i++)
00040 for(j=i; j>=0 && lsfq[j] > lsfq[j+1]; j--)
00041 FFSWAP(int16_t, lsfq[j], lsfq[j+1]);
00042
00043 for(i=0; i<lp_order; i++)
00044 {
00045 lsfq[i] = FFMAX(lsfq[i], lsfq_min);
00046 lsfq_min = lsfq[i] + lsfq_min_distance;
00047 }
00048 lsfq[lp_order-1] = FFMIN(lsfq[lp_order-1], lsfq_max);
00049 }
00050
00051 void ff_set_min_dist_lsf(float *lsf, double min_spacing, int size)
00052 {
00053 int i;
00054 float prev = 0.0;
00055 for (i = 0; i < size; i++)
00056 prev = lsf[i] = FFMAX(lsf[i], prev + min_spacing);
00057 }
00058
00059
00060
00061 static const int16_t tab_cos[65] =
00062 {
00063 32767, 32738, 32617, 32421, 32145, 31793, 31364, 30860,
00064 30280, 29629, 28905, 28113, 27252, 26326, 25336, 24285,
00065 23176, 22011, 20793, 19525, 18210, 16851, 15451, 14014,
00066 12543, 11043, 9515, 7965, 6395, 4810, 3214, 1609,
00067 1, -1607, -3211, -4808, -6393, -7962, -9513, -11040,
00068 -12541, -14012, -15449, -16848, -18207, -19523, -20791, -22009,
00069 -23174, -24283, -25334, -26324, -27250, -28111, -28904, -29627,
00070 -30279, -30858, -31363, -31792, -32144, -32419, -32616, -32736, -32768,
00071 };
00072
00073 static int16_t ff_cos(uint16_t arg)
00074 {
00075 uint8_t offset= arg;
00076 uint8_t ind = arg >> 8;
00077
00078 av_assert2(arg <= 0x3fff);
00079
00080 return tab_cos[ind] + (offset * (tab_cos[ind+1] - tab_cos[ind]) >> 8);
00081 }
00082
00083 void ff_acelp_lsf2lsp(int16_t *lsp, const int16_t *lsf, int lp_order)
00084 {
00085 int i;
00086
00087
00088 for(i=0; i<lp_order; i++)
00089
00090 lsp[i] = ff_cos(lsf[i] * 20861 >> 15);
00091 }
00092
00093 void ff_acelp_lsf2lspd(double *lsp, const float *lsf, int lp_order)
00094 {
00095 int i;
00096
00097 for(i = 0; i < lp_order; i++)
00098 lsp[i] = cos(2.0 * M_PI * lsf[i]);
00099 }
00100
00106 static void lsp2poly(int* f, const int16_t* lsp, int lp_half_order)
00107 {
00108 int i, j;
00109
00110 f[0] = 0x400000;
00111 f[1] = -lsp[0] << 8;
00112
00113 for(i=2; i<=lp_half_order; i++)
00114 {
00115 f[i] = f[i-2];
00116 for(j=i; j>1; j--)
00117 f[j] -= MULL(f[j-1], lsp[2*i-2], FRAC_BITS) - f[j-2];
00118
00119 f[1] -= lsp[2*i-2] << 8;
00120 }
00121 }
00122
00123 void ff_acelp_lsp2lpc(int16_t* lp, const int16_t* lsp, int lp_half_order)
00124 {
00125 int i;
00126 int f1[MAX_LP_HALF_ORDER+1];
00127 int f2[MAX_LP_HALF_ORDER+1];
00128
00129 lsp2poly(f1, lsp , lp_half_order);
00130 lsp2poly(f2, lsp+1, lp_half_order);
00131
00132
00133 lp[0] = 4096;
00134 for(i=1; i<lp_half_order+1; i++)
00135 {
00136 int ff1 = f1[i] + f1[i-1];
00137 int ff2 = f2[i] - f2[i-1];
00138
00139 ff1 += 1 << 10;
00140 lp[i] = (ff1 + ff2) >> 11;
00141 lp[(lp_half_order << 1) + 1 - i] = (ff1 - ff2) >> 11;
00142 }
00143 }
00144
00145 void ff_amrwb_lsp2lpc(const double *lsp, float *lp, int lp_order)
00146 {
00147 int lp_half_order = lp_order >> 1;
00148 double buf[MAX_LP_HALF_ORDER + 1];
00149 double pa[MAX_LP_HALF_ORDER + 1];
00150 double *qa = buf + 1;
00151 int i,j;
00152
00153 qa[-1] = 0.0;
00154
00155 ff_lsp2polyf(lsp , pa, lp_half_order );
00156 ff_lsp2polyf(lsp + 1, qa, lp_half_order - 1);
00157
00158 for (i = 1, j = lp_order - 1; i < lp_half_order; i++, j--) {
00159 double paf = pa[i] * (1 + lsp[lp_order - 1]);
00160 double qaf = (qa[i] - qa[i-2]) * (1 - lsp[lp_order - 1]);
00161 lp[i-1] = (paf + qaf) * 0.5;
00162 lp[j-1] = (paf - qaf) * 0.5;
00163 }
00164
00165 lp[lp_half_order - 1] = (1.0 + lsp[lp_order - 1]) *
00166 pa[lp_half_order] * 0.5;
00167
00168 lp[lp_order - 1] = lsp[lp_order - 1];
00169 }
00170
00171 void ff_acelp_lp_decode(int16_t* lp_1st, int16_t* lp_2nd, const int16_t* lsp_2nd, const int16_t* lsp_prev, int lp_order)
00172 {
00173 int16_t lsp_1st[MAX_LP_ORDER];
00174 int i;
00175
00176
00177 for(i=0; i<lp_order; i++)
00178 #ifdef G729_BITEXACT
00179 lsp_1st[i] = (lsp_2nd[i] >> 1) + (lsp_prev[i] >> 1);
00180 #else
00181 lsp_1st[i] = (lsp_2nd[i] + lsp_prev[i]) >> 1;
00182 #endif
00183
00184 ff_acelp_lsp2lpc(lp_1st, lsp_1st, lp_order >> 1);
00185
00186
00187 ff_acelp_lsp2lpc(lp_2nd, lsp_2nd, lp_order >> 1);
00188 }
00189
00190 #ifndef ff_lsp2polyf
00191 void ff_lsp2polyf(const double *lsp, double *f, int lp_half_order)
00192 {
00193 int i, j;
00194
00195 f[0] = 1.0;
00196 f[1] = -2 * lsp[0];
00197 lsp -= 2;
00198 for(i=2; i<=lp_half_order; i++)
00199 {
00200 double val = -2 * lsp[2*i];
00201 f[i] = val * f[i-1] + 2*f[i-2];
00202 for(j=i-1; j>1; j--)
00203 f[j] += f[j-1] * val + f[j-2];
00204 f[1] += val;
00205 }
00206 }
00207 #endif
00208
00209 void ff_acelp_lspd2lpc(const double *lsp, float *lpc, int lp_half_order)
00210 {
00211 double pa[MAX_LP_HALF_ORDER+1], qa[MAX_LP_HALF_ORDER+1];
00212 float *lpc2 = lpc + (lp_half_order << 1) - 1;
00213
00214 av_assert2(lp_half_order <= MAX_LP_HALF_ORDER);
00215
00216 ff_lsp2polyf(lsp, pa, lp_half_order);
00217 ff_lsp2polyf(lsp + 1, qa, lp_half_order);
00218
00219 while (lp_half_order--) {
00220 double paf = pa[lp_half_order+1] + pa[lp_half_order];
00221 double qaf = qa[lp_half_order+1] - qa[lp_half_order];
00222
00223 lpc [ lp_half_order] = 0.5*(paf+qaf);
00224 lpc2[-lp_half_order] = 0.5*(paf-qaf);
00225 }
00226 }
00227
00228 void ff_sort_nearly_sorted_floats(float *vals, int len)
00229 {
00230 int i,j;
00231
00232 for (i = 0; i < len - 1; i++)
00233 for (j = i; j >= 0 && vals[j] > vals[j+1]; j--)
00234 FFSWAP(float, vals[j], vals[j+1]);
00235 }