void samples_to_rmlt_coefs(new_samples, coefs, dct_size) float *new_samples; float *coefs; int dct_size; { extern void dct_type_iv(float *, float *, long); static float old_samples[MAX_DCT_SIZE]; static float window[MAX_DCT_SIZE]; static int here_before = 0; int index, vals_left; float sum; double angle; float windowed_data[MAX_DCT_SIZE]; float *new_ptr, *old_ptr, *sam_low, *sam_high; float *win_low, *win_high; float *dst_ptr; int half_dct_size; half_dct_size = dct_size>>1; /*++++++++++++++++++++++++++++++++++++++*/ /* Set up some data the first time here */ /*++++++++++++++++++++++++++++++++++++++*/ if (here_before == 0) { for (index = 0; index < dct_size; index++) { angle = (PI/2.0) * ((double) index + 0.5) / (double)dct_size; window[index] = (float)sin(angle); } for (index = 0; index < dct_size; index++) old_samples[index] = 0.0; here_before = 1; } /*++++++++++++++++++++++++++++++++++++++++++++*/ /* Get the first half of the windowed samples */ /*++++++++++++++++++++++++++++++++++++++++++++*/ dst_ptr = windowed_data; win_high = window + half_dct_size; win_low = win_high; sam_high = old_samples + half_dct_size; sam_low = sam_high; for (vals_left = half_dct_size; vals_left > 0; vals_left--) { sum = *--win_low * *--sam_low; sum += *win_high++ * *sam_high++; *dst_ptr++ = sum; } /*+++++++++++++++++++++++++++++++++++++++++++++*/ /* Get the second half of the windowed samples */ /*+++++++++++++++++++++++++++++++++++++++++++++*/ sam_low = new_samples; sam_high = new_samples + dct_size; for (vals_left = half_dct_size; vals_left > 0; vals_left--) { sum = *--win_high * *sam_low++; sum -= *win_low++ * *--sam_high; *dst_ptr++ = sum; } /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* Save the new samples for next time, when they will be the old samples */ /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ new_ptr = new_samples; old_ptr = old_samples; for (vals_left = dct_size; vals_left > 0; vals_left--) *old_ptr++ = *new_ptr++; /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* Perform a Type IV DCT on the windowed data to get the coefficients */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ dct_type_iv(windowed_data, coefs, dct_size); }