annotate src/vector.c @ 104:a32738e9d955

- Fixes to descriptors.c where no break statement was given for certain cases is switch conditionals - Added LPC and LPCC extraction functions. LPC implements Durbin method as described in Rabiner and Juang and implemented in Dr. Dobbs 1994 edition by Jutta Degener
author Jamie Bullock <jamie@postlude.co.uk>
date Mon, 24 Dec 2007 13:21:13 +0000
parents 7a5859764ccd
children f2af1c75e3ed
rev   line source
jamie@1 1 /* libxtract feature extraction library
jamie@1 2 *
jamie@1 3 * Copyright (C) 2006 Jamie Bullock
jamie@1 4 *
jamie@1 5 * This program is free software; you can redistribute it and/or modify
jamie@1 6 * it under the terms of the GNU General Public License as published by
jamie@1 7 * the Free Software Foundation; either version 2 of the License, or
jamie@1 8 * (at your option) any later version.
jamie@1 9 *
jamie@1 10 * This program is distributed in the hope that it will be useful,
jamie@1 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jamie@1 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
jamie@1 13 * GNU General Public License for more details.
jamie@1 14 *
jamie@1 15 * You should have received a copy of the GNU General Public License
jamie@1 16 * along with this program; if not, write to the Free Software
jamie@1 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
jamie@1 18 * USA.
jamie@1 19 */
jamie@1 20
jamie@1 21
jamie@1 22 /* xtract_vector.c: defines functions that extract a feature as a single value from an input vector */
jamie@1 23
jamie@1 24 #include <math.h>
jamie@43 25 #include <string.h>
jamie@43 26 #include <stdlib.h>
jamie@30 27
jamie@98 28 #include "xtract/libxtract.h"
jamie@98 29 #include "xtract_macros_private.h"
jamie@98 30
jamie@85 31 #ifndef roundf
jamie@85 32 float roundf(float f){
jamie@85 33 if (f - (int)f >= 0.5)
jamie@85 34 return (float)((int)f + 1);
jamie@85 35 else
jamie@85 36 return (float)((int)f);
jamie@85 37 }
jamie@85 38 #endif
jamie@85 39
jamie@30 40 #ifdef XTRACT_FFT
jamie@30 41
jamie@1 42 #include <fftw3.h>
jamie@98 43 #include "xtract_globals_private.h"
jamie@98 44 #include "xtract_macros_private.h"
jamie@1 45
jamie@54 46 int xtract_spectrum(const float *data, const int N, const void *argv, float *result){
jamie@1 47
jamie@56 48 float *input, *rfft, q, temp;
jamie@43 49 size_t bytes;
jamie@98 50 int n , NxN, M, vector, withDC, argc;
jamie@98 51 //fftwf_plan plan;
jamie@98 52
jamie@98 53 vector = argc = withDC = 0;
jamie@1 54
jamie@54 55 M = N >> 1;
jamie@56 56 NxN = XTRACT_SQ(N);
jamie@54 57
jamie@54 58 rfft = (float *)fftwf_malloc(N * sizeof(float));
jamie@43 59 input = (float *)malloc(bytes = N * sizeof(float));
jamie@43 60 input = memcpy(input, data, bytes);
jamie@1 61
jamie@56 62 q = *(float *)argv;
jamie@54 63 vector = (int)*((float *)argv+1);
jamie@70 64 withDC = (int)*((float *)argv+2);
jamie@46 65
jamie@56 66 XTRACT_CHECK_q;
jamie@46 67
jamie@102 68 if(fft_plans.spectrum_plan == NULL){
jamie@98 69 /* FIX: Not sure this should really be here. Might introduce
jamie@98 70 * DEBUG_POST macro, or some kind of error handler, or leave it to the
jamie@98 71 * caller... */
jamie@98 72 fprintf(stderr,
jamie@98 73 "libxtract: Error: xtract_spectrum() has uninitialised plan\n");
jamie@98 74 return XTRACT_NO_RESULT;
jamie@98 75 }
jamie@98 76
jamie@102 77 fftwf_execute_r2r(fft_plans.spectrum_plan, input, rfft);
jamie@54 78
jamie@54 79 switch(vector){
jamie@67 80
jamie@56 81 case XTRACT_LOG_MAGNITUDE_SPECTRUM:
jamie@67 82 for(n = 1; n < M; n++){
jamie@67 83 if ((temp = XTRACT_SQ(rfft[n]) +
jamie@70 84 XTRACT_SQ(rfft[N - n])) > XTRACT_LOG_LIMIT)
jamie@54 85 temp = log(sqrt(temp) / N);
jamie@54 86 else
jamie@56 87 temp = XTRACT_LOG_LIMIT_DB;
jamie@70 88 if(withDC) {
jamie@70 89 result[n] =
jamie@70 90 /*Normalise*/
jamie@70 91 (temp + XTRACT_DB_SCALE_OFFSET) /
jamie@70 92 XTRACT_DB_SCALE_OFFSET;
jamie@70 93 result[M + n + 1] = n * q;
jamie@70 94 }
jamie@70 95 else {
jamie@70 96 result[n - 1] =
jamie@70 97 (temp + XTRACT_DB_SCALE_OFFSET) /
jamie@70 98 XTRACT_DB_SCALE_OFFSET;
jamie@70 99 result[M + n - 1] = n * q;
jamie@70 100 }
jamie@54 101 }
jamie@54 102 break;
jamie@67 103
jamie@56 104 case XTRACT_POWER_SPECTRUM:
jamie@67 105 for(n = 1; n < M; n++){
jamie@70 106 if(withDC){
jamie@70 107 result[n] = (XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n]))
jamie@70 108 / NxN;
jamie@70 109 result[M + n + 1] = n * q;
jamie@70 110 }
jamie@70 111 else {
jamie@70 112 result[n - 1] =
jamie@70 113 (XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) / NxN;
jamie@70 114 result[M + n - 1] = n * q;
jamie@70 115 }
jamie@54 116 }
jamie@54 117 break;
jamie@67 118
jamie@56 119 case XTRACT_LOG_POWER_SPECTRUM:
jamie@67 120 for(n = 1; n < M; n++){
jamie@70 121 if ((temp = XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) >
jamie@67 122 XTRACT_LOG_LIMIT)
jamie@54 123 temp = log(temp / NxN);
jamie@54 124 else
jamie@56 125 temp = XTRACT_LOG_LIMIT_DB;
jamie@70 126 if(withDC){
jamie@70 127 result[n] = (temp + XTRACT_DB_SCALE_OFFSET) /
jamie@70 128 XTRACT_DB_SCALE_OFFSET;
jamie@70 129 result[M + n + 1] = n * q;
jamie@70 130 }
jamie@70 131 else {
jamie@70 132 result[n - 1] = (temp + XTRACT_DB_SCALE_OFFSET) /
jamie@70 133 XTRACT_DB_SCALE_OFFSET;
jamie@70 134 result[M + n - 1] = n * q;
jamie@70 135 }
jamie@54 136 }
jamie@54 137 break;
jamie@67 138
jamie@54 139 default:
jamie@54 140 /* MAGNITUDE_SPECTRUM */
jamie@67 141 for(n = 1; n < M; n++){
jamie@70 142 if(withDC){
jamie@70 143 result[n] = sqrt(XTRACT_SQ(rfft[n]) +
jamie@70 144 XTRACT_SQ(rfft[N - n])) / N;
jamie@70 145 result[M + n + 1] = n * q;
jamie@70 146 }
jamie@70 147 else {
jamie@70 148 result[n - 1] = sqrt(XTRACT_SQ(rfft[n]) +
jamie@70 149 XTRACT_SQ(rfft[N - n])) / N;
jamie@70 150 result[M + n - 1] = n * q;
jamie@70 151 }
jamie@54 152 }
jamie@54 153 break;
jamie@1 154 }
jamie@1 155
jamie@70 156 if(withDC){
jamie@70 157 /* The DC component */
jamie@70 158 result[0] = XTRACT_SQ(rfft[0]);
jamie@70 159 result[M + 1] = 0.f;
jamie@70 160 /* The Nyquist */
jamie@70 161 result[M] = XTRACT_SQ(rfft[M]);
jamie@70 162 result[N + 1] = q * M;
jamie@70 163 }
jamie@70 164 else {
jamie@70 165 /* The Nyquist */
jamie@98 166 result[M - 1] = (float)XTRACT_SQ(rfft[M]);
jamie@70 167 result[N - 1] = q * M;
jamie@70 168 }
jamie@1 169
jamie@54 170 fftwf_free(rfft);
jamie@43 171 free(input);
jamie@1 172
jamie@56 173 return XTRACT_SUCCESS;
jamie@1 174 }
jamie@1 175
jamie@43 176 int xtract_autocorrelation_fft(const float *data, const int N, const void *argv, float *result){
jamie@1 177
jamie@75 178 float *freq, *time;
jamie@75 179 int n, M;
jamie@98 180 //fftwf_plan plan;
jamie@1 181
jamie@75 182 M = N << 1;
jamie@43 183
jamie@75 184 freq = (float *)fftwf_malloc(M * sizeof(float));
jamie@75 185 /* Zero pad the input vector */
jamie@75 186 time = (float *)calloc(M, sizeof(float));
jamie@75 187 time = memcpy(time, data, N * sizeof(float));
jamie@75 188
jamie@102 189 fftwf_execute_r2r(fft_plans.autocorrelation_fft_plan_1, time, freq);
jamie@98 190 //plan = fftwf_plan_r2r_1d(M, time, freq, FFTW_R2HC, FFTW_ESTIMATE);
jamie@1 191
jamie@98 192 //fftwf_execute(plan);
jamie@75 193
jamie@76 194 for(n = 1; n < N; n++){
jamie@75 195 freq[n] = XTRACT_SQ(freq[n]) + XTRACT_SQ(freq[M - n]);
jamie@75 196 freq[M - n] = 0.f;
jamie@75 197 }
jamie@1 198
jamie@75 199 freq[0] = XTRACT_SQ(freq[0]);
jamie@75 200 freq[N] = XTRACT_SQ(freq[N]);
jamie@75 201
jamie@98 202 //plan = fftwf_plan_r2r_1d(M, freq, time, FFTW_HC2R, FFTW_ESTIMATE);
jamie@75 203
jamie@98 204 //fftwf_execute(plan);
jamie@98 205
jamie@102 206 fftwf_execute_r2r(fft_plans.autocorrelation_fft_plan_2, freq, time);
jamie@75 207
jamie@75 208 /* Normalisation factor */
jamie@75 209 M = M * N;
jamie@75 210
jamie@75 211 for(n = 0; n < N; n++)
jamie@75 212 result[n] = time[n] / (float)M;
jamie@75 213 /* result[n] = time[n+1] / (float)M; */
jamie@75 214
jamie@98 215 //fftwf_destroy_plan(plan);
jamie@75 216 fftwf_free(freq);
jamie@75 217 free(time);
jamie@38 218
jamie@56 219 return XTRACT_SUCCESS;
jamie@1 220 }
jamie@1 221
jamie@43 222 int xtract_mfcc(const float *data, const int N, const void *argv, float *result){
jamie@30 223
jamie@30 224 xtract_mel_filter *f;
jamie@30 225 int n, filter;
jamie@30 226
jamie@30 227 f = (xtract_mel_filter *)argv;
jamie@39 228
jamie@30 229 for(filter = 0; filter < f->n_filters; filter++){
danstowell@68 230 result[filter] = 0.f;
jamie@30 231 for(n = 0; n < N; n++){
jamie@71 232 result[filter] += data[n] * f->filters[filter][n];
jamie@30 233 }
danstowell@69 234 result[filter] = log(result[filter] < XTRACT_LOG_LIMIT ? XTRACT_LOG_LIMIT : result[filter]);
jamie@30 235 }
jamie@30 236
jamie@30 237 xtract_dct(result, f->n_filters, NULL, result);
jamie@43 238
jamie@56 239 return XTRACT_SUCCESS;
jamie@30 240 }
jamie@30 241
jamie@43 242 int xtract_dct(const float *data, const int N, const void *argv, float *result){
jamie@30 243
jamie@98 244 //fftwf_plan plan;
jamie@43 245
jamie@98 246 //plan =
jamie@98 247 // fftwf_plan_r2r_1d(N, (float *) data, result, FFTW_REDFT00, FFTW_ESTIMATE);
jamie@30 248
jamie@102 249 fftwf_execute_r2r(fft_plans.dct_plan, (float *)data, result);
jamie@98 250 //fftwf_execute(plan);
jamie@98 251 //fftwf_destroy_plan(plan);
jamie@38 252
jamie@56 253 return XTRACT_SUCCESS;
jamie@30 254 }
jamie@30 255
jamie@30 256 #else
jamie@30 257
jamie@67 258 int xtract_spectrum(const float *data, const int N, const void *argv, float *result){
jamie@30 259
danstowell@66 260 XTRACT_NEEDS_FFTW;
danstowell@66 261 return XTRACT_NO_RESULT;
jamie@30 262
jamie@30 263 }
jamie@30 264
jamie@43 265 int xtract_autocorrelation_fft(const float *data, const int N, const void *argv, float *result){
jamie@30 266
danstowell@66 267 XTRACT_NEEDS_FFTW;
danstowell@66 268 return XTRACT_NO_RESULT;
jamie@30 269
jamie@30 270 }
jamie@30 271
jamie@43 272 int xtract_mfcc(const float *data, const int N, const void *argv, float *result){
jamie@30 273
danstowell@66 274 XTRACT_NEEDS_FFTW;
danstowell@66 275 return XTRACT_NO_RESULT;
jamie@30 276
jamie@30 277 }
jamie@30 278
jamie@43 279 int xtract_dct(const float *data, const int N, const void *argv, float *result){
jamie@30 280
danstowell@66 281 XTRACT_NEEDS_FFTW;
danstowell@66 282 return XTRACT_NO_RESULT;
jamie@30 283
jamie@30 284 }
jamie@30 285
jamie@30 286 #endif
jamie@30 287
jamie@43 288 int xtract_autocorrelation(const float *data, const int N, const void *argv, float *result){
jamie@30 289
jamie@30 290 /* Naive time domain implementation */
jamie@30 291
jamie@30 292 int n = N, i;
jamie@30 293
jamie@30 294 float corr;
jamie@30 295
jamie@30 296 while(n--){
jamie@30 297 corr = 0;
jamie@30 298 for(i = 0; i < N - n; i++){
jamie@30 299 corr += data[i] * data[i + n];
jamie@30 300 }
jamie@30 301 result[n] = corr / N;
jamie@30 302 }
jamie@38 303
jamie@56 304 return XTRACT_SUCCESS;
jamie@30 305 }
jamie@30 306
jamie@43 307 int xtract_amdf(const float *data, const int N, const void *argv, float *result){
jamie@1 308
jamie@1 309 int n = N, i;
jamie@1 310
jamie@6 311 float md, temp;
jamie@1 312
jamie@1 313 while(n--){
jamie@1 314 md = 0;
jamie@1 315 for(i = 0; i < N - n; i++){
jamie@6 316 temp = data[i] - data[i + n];
jamie@6 317 temp = (temp < 0 ? -temp : temp);
jamie@6 318 md += temp;
jamie@1 319 }
jamie@1 320 result[n] = md / N;
jamie@1 321 }
jamie@38 322
jamie@56 323 return XTRACT_SUCCESS;
jamie@1 324 }
jamie@1 325
jamie@43 326 int xtract_asdf(const float *data, const int N, const void *argv, float *result){
jamie@1 327
jamie@1 328 int n = N, i;
jamie@1 329
jamie@1 330 float sd;
jamie@1 331
jamie@1 332 while(n--){
jamie@1 333 sd = 0;
jamie@1 334 for(i = 0; i < N - n; i++){
jamie@6 335 /*sd = 1;*/
jamie@56 336 sd += XTRACT_SQ(data[i] - data[i + n]);
jamie@1 337 }
jamie@1 338 result[n] = sd / N;
jamie@1 339 }
jamie@38 340
jamie@56 341 return XTRACT_SUCCESS;
jamie@1 342 }
jamie@1 343
jamie@43 344 int xtract_bark_coefficients(const float *data, const int N, const void *argv, float *result){
jamie@1 345
jamie@1 346 int *limits, band, n;
jamie@1 347
jamie@1 348 limits = (int *)argv;
jamie@1 349
jamie@59 350 for(band = 0; band < XTRACT_BARK_BANDS - 1; band++){
jamie@1 351 for(n = limits[band]; n < limits[band + 1]; n++)
jamie@1 352 result[band] += data[n];
jamie@1 353 }
jamie@38 354
jamie@56 355 return XTRACT_SUCCESS;
jamie@1 356 }
jamie@1 357
jamie@52 358 int xtract_peak_spectrum(const float *data, const int N, const void *argv, float *result){
jamie@1 359
jamie@56 360 float threshold, max, y, y2, y3, p, q, *input = NULL;
jamie@43 361 size_t bytes;
jamie@59 362 int n = N, rv = XTRACT_SUCCESS;
jamie@49 363
jamie@56 364 threshold = max = y = y2 = y3 = p = q = 0.f;
jamie@1 365
jamie@1 366 if(argv != NULL){
jamie@56 367 q = ((float *)argv)[0];
jamie@55 368 threshold = ((float *)argv)[1];
jamie@1 369 }
jamie@49 370 else
jamie@56 371 rv = XTRACT_BAD_ARGV;
jamie@49 372
jamie@55 373 if(threshold < 0 || threshold > 100){
jamie@55 374 threshold = 0;
jamie@56 375 rv = XTRACT_BAD_ARGV;
jamie@1 376 }
jamie@1 377
jamie@56 378 XTRACT_CHECK_q;
jamie@49 379
jamie@98 380 input = (float *)calloc(N, sizeof(float));
jamie@98 381
jamie@98 382 bytes = N * sizeof(float);
jamie@43 383
jamie@43 384 if(input != NULL)
jamie@43 385 input = memcpy(input, data, bytes);
jamie@43 386 else
jamie@56 387 return XTRACT_MALLOC_FAILED;
jamie@43 388
jamie@45 389 while(n--)
jamie@56 390 max = XTRACT_MAX(max, input[n]);
jamie@1 391
jamie@55 392 threshold *= .01 * max;
jamie@1 393
jamie@1 394 result[0] = 0;
jamie@59 395 result[N] = 0;
jamie@1 396
jamie@59 397 for(n = 1; n < N; n++){
jamie@55 398 if(input[n] >= threshold){
jamie@43 399 if(input[n] > input[n - 1] && input[n] > input[n + 1]){
jamie@59 400 result[N + n] = q * (n + (p = .5 * (y = input[n-1] -
jamie@52 401 (y3 = input[n+1])) / (input[n - 1] - 2 *
jamie@52 402 (y2 = input[n]) + input[n + 1])));
jamie@52 403 result[n] = y2 - .25 * (y - y3) * p;
jamie@1 404 }
jamie@1 405 else{
jamie@1 406 result[n] = 0;
jamie@59 407 result[N + n] = 0;
jamie@1 408 }
jamie@1 409 }
jamie@1 410 else{
jamie@1 411 result[n] = 0;
jamie@59 412 result[N + n] = 0;
jamie@1 413 }
jamie@1 414 }
jamie@1 415
jamie@43 416 free(input);
jamie@56 417 return (rv ? rv : XTRACT_SUCCESS);
jamie@1 418 }
jamie@41 419
jamie@52 420 int xtract_harmonic_spectrum(const float *data, const int N, const void *argv, float *result){
jamie@38 421
jamie@38 422 int n = (N >> 1), M = n;
jamie@38 423
jamie@43 424 const float *freqs, *amps;
jamie@55 425 float f0, threshold, ratio, nearest, distance;
jamie@38 426
jamie@52 427 amps = data;
jamie@52 428 freqs = data + n;
jamie@38 429 f0 = *((float *)argv);
jamie@55 430 threshold = *((float *)argv+1);
jamie@38 431
jamie@38 432 ratio = nearest = distance = 0.f;
jamie@38 433
jamie@38 434 while(n--){
jamie@38 435 if(freqs[n]){
jamie@38 436 ratio = freqs[n] / f0;
jamie@85 437 nearest = roundf(ratio);
jamie@38 438 distance = fabs(nearest - ratio);
jamie@55 439 if(distance > threshold)
jamie@38 440 result[n] = result[M + n] = 0.f;
jamie@42 441 else {
jamie@52 442 result[n] = amps[n];
jamie@52 443 result[M + n] = freqs[n];
jamie@42 444 }
jamie@38 445 }
jamie@38 446 else
jamie@38 447 result[n] = result[M + n] = 0.f;
jamie@38 448 }
jamie@56 449 return XTRACT_SUCCESS;
jamie@38 450 }
jamie@38 451
jamie@104 452 int xtract_lpc(const float *data, const int N, const void *argv, float *result){
jamie@104 453
jamie@104 454 int i, j, k, M, L;
jamie@104 455 float r = 0.f,
jamie@104 456 error = 0.f;
jamie@104 457
jamie@104 458 float *ref = NULL,
jamie@104 459 *lpc = NULL ;
jamie@104 460
jamie@104 461 error = data[0];
jamie@104 462 k = N; /* The length of *data */
jamie@104 463 L = N - 1; /* The number of LPC coefficients */
jamie@104 464 M = L * 2; /* The length of *result */
jamie@104 465 ref = result;
jamie@104 466 lpc = result+L;
jamie@104 467
jamie@104 468 if(error == 0.0){
jamie@104 469 for(i = 0; i < M; i++)
jamie@104 470 result[i] = 0.f;
jamie@104 471 return XTRACT_NO_RESULT;
jamie@104 472 }
jamie@104 473
jamie@104 474 memset(result, 0, M * sizeof(float));
jamie@104 475
jamie@104 476 for (i = 0; i < L; i++) {
jamie@104 477
jamie@104 478 /* Sum up this iteration's reflection coefficient. */
jamie@104 479 r = -data[i + 1];
jamie@104 480 for (j = 0; j < i; j++)
jamie@104 481 r -= lpc[j] * data[i - j];
jamie@104 482 ref[i] = r /= error;
jamie@104 483
jamie@104 484 /* Update LPC coefficients and total error. */
jamie@104 485 lpc[i] = r;
jamie@104 486 for (j = 0; j < i / 2; j++) {
jamie@104 487 float tmp = lpc[j];
jamie@104 488 lpc[j] = r * lpc[i - 1 - j];
jamie@104 489 lpc[i - 1 - j] += r * tmp;
jamie@104 490 }
jamie@104 491 if (i % 2) lpc[j] += lpc[j] * r;
jamie@104 492
jamie@104 493 error *= 1 - r * r;
jamie@104 494 }
jamie@104 495
jamie@104 496 return XTRACT_SUCCESS;
jamie@104 497 }
jamie@104 498
jamie@104 499 int xtract_lpcc(const float *data, const int N, const void *argv, float *result){
jamie@104 500
jamie@104 501 /* Given N lpc coefficients extract an LPC cepstrum of size argv[0] */
jamie@104 502 /* Based on an an algorithm by rabiner and Juang */
jamie@104 503
jamie@104 504 int n, k;
jamie@104 505 float sum;
jamie@104 506 int order = N - 1; /* Eventually change this to Q = 3/2 p as suggested in Rabiner */
jamie@104 507 int cep_length;
jamie@104 508
jamie@104 509 if(argv == NULL)
jamie@104 510 cep_length = N - 1;
jamie@104 511 else
jamie@104 512 cep_length = (int)((float *)argv)[0];
jamie@104 513
jamie@104 514 memset(result, 0, cep_length * sizeof(float));
jamie@104 515
jamie@104 516 for (n = 1; n <= order && n <= cep_length; n++){
jamie@104 517 sum = 0.f;
jamie@104 518 for (k = 1; k < n; k++)
jamie@104 519 sum += k * result[k-1] * data[n - k];
jamie@104 520 result[n-1] = data[n] + sum / n;
jamie@104 521 }
jamie@104 522
jamie@104 523 /* be wary of these interpolated values */
jamie@104 524 for(n = order + 1; n <= cep_length; n++){
jamie@104 525 sum = 0.f;
jamie@104 526 for (k = n - (order - 1); k < n; k++)
jamie@104 527 sum += k * result[k-1] * data[n - k];
jamie@104 528 result[n-1] = sum / n;
jamie@104 529 }
jamie@104 530
jamie@104 531 return XTRACT_SUCCESS;
jamie@104 532
jamie@104 533 }
jamie@104 534 //int xtract_lpcc_s(const float *data, const int N, const void *argv, float *result){
jamie@104 535 // return XTRACT_SUCCESS;
jamie@104 536 //}
jamie@104 537
jamie@104 538