Originally committed as revision 22933 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.6
| @@ -114,7 +114,7 @@ void ff_acelp_high_pass_filter(int16_t* out, int hpf_f[2], | |||||
| } | } | ||||
| } | } | ||||
| void ff_acelp_apply_order_2_transfer_function(float *buf, | |||||
| void ff_acelp_apply_order_2_transfer_function(float *out, const float *in, | |||||
| const float zero_coeffs[2], | const float zero_coeffs[2], | ||||
| const float pole_coeffs[2], | const float pole_coeffs[2], | ||||
| float gain, float mem[2], int n) | float gain, float mem[2], int n) | ||||
| @@ -123,8 +123,8 @@ void ff_acelp_apply_order_2_transfer_function(float *buf, | |||||
| float tmp; | float tmp; | ||||
| for (i = 0; i < n; i++) { | for (i = 0; i < n; i++) { | ||||
| tmp = gain * buf[i] - pole_coeffs[0] * mem[0] - pole_coeffs[1] * mem[1]; | |||||
| buf[i] = tmp + zero_coeffs[0] * mem[0] + zero_coeffs[1] * mem[1]; | |||||
| tmp = gain * in[i] - pole_coeffs[0] * mem[0] - pole_coeffs[1] * mem[1]; | |||||
| out[i] = tmp + zero_coeffs[0] * mem[0] + zero_coeffs[1] * mem[1]; | |||||
| mem[1] = mem[0]; | mem[1] = mem[0]; | ||||
| mem[0] = tmp; | mem[0] = tmp; | ||||
| @@ -92,14 +92,15 @@ void ff_acelp_high_pass_filter(int16_t* out, int hpf_f[2], | |||||
| /** | /** | ||||
| * Apply an order 2 rational transfer function in-place. | * Apply an order 2 rational transfer function in-place. | ||||
| * | * | ||||
| * @param samples [in/out] | |||||
| * @param out output buffer for filtered speech samples | |||||
| * @param in input buffer containing speech data (may be the same as out) | |||||
| * @param zero_coeffs z^-1 and z^-2 coefficients of the numerator | * @param zero_coeffs z^-1 and z^-2 coefficients of the numerator | ||||
| * @param pole_coeffs z^-1 and z^-2 coefficients of the denominator | * @param pole_coeffs z^-1 and z^-2 coefficients of the denominator | ||||
| * @param gain scale factor for final output | * @param gain scale factor for final output | ||||
| * @param mem intermediate values used by filter (should be 0 initially) | * @param mem intermediate values used by filter (should be 0 initially) | ||||
| * @param n number of samples | * @param n number of samples | ||||
| */ | */ | ||||
| void ff_acelp_apply_order_2_transfer_function(float *samples, | |||||
| void ff_acelp_apply_order_2_transfer_function(float *out, const float *in, | |||||
| const float zero_coeffs[2], | const float zero_coeffs[2], | ||||
| const float pole_coeffs[2], | const float pole_coeffs[2], | ||||
| float gain, | float gain, | ||||
| @@ -1044,7 +1044,7 @@ static int amrnb_decode_frame(AVCodecContext *avctx, void *data, int *data_size, | |||||
| update_state(p); | update_state(p); | ||||
| } | } | ||||
| ff_acelp_apply_order_2_transfer_function(buf_out, highpass_zeros, | |||||
| ff_acelp_apply_order_2_transfer_function(buf_out, buf_out, highpass_zeros, | |||||
| highpass_poles, highpass_gain, | highpass_poles, highpass_gain, | ||||
| p->high_pass_mem, AMR_BLOCK_SIZE); | p->high_pass_mem, AMR_BLOCK_SIZE); | ||||
| @@ -490,14 +490,14 @@ static void decode_frame(SiprContext *ctx, SiprParameters *params, | |||||
| memcpy(ctx->excitation, excitation - PITCH_DELAY_MAX - L_INTERPOL, | memcpy(ctx->excitation, excitation - PITCH_DELAY_MAX - L_INTERPOL, | ||||
| (PITCH_DELAY_MAX + L_INTERPOL) * sizeof(float)); | (PITCH_DELAY_MAX + L_INTERPOL) * sizeof(float)); | ||||
| ff_acelp_apply_order_2_transfer_function(synth, | |||||
| ff_acelp_apply_order_2_transfer_function(out_data, synth, | |||||
| (const float[2]) {-1.99997 , 1.000000000}, | (const float[2]) {-1.99997 , 1.000000000}, | ||||
| (const float[2]) {-1.93307352, 0.935891986}, | (const float[2]) {-1.93307352, 0.935891986}, | ||||
| 0.939805806, | 0.939805806, | ||||
| ctx->highpass_filt_mem, | ctx->highpass_filt_mem, | ||||
| frame_size); | frame_size); | ||||
| ctx->dsp.vector_clipf(out_data, synth, -1, 32767./(1<<15), frame_size); | |||||
| ctx->dsp.vector_clipf(out_data, out_data, -1, 32767./(1<<15), frame_size); | |||||
| } | } | ||||