static void equalizer_state_compute_impulse_response(EqualizerState *s){ void *fft_handle=ms_fft_init(s->nfft); ms_message("Spectral domain:"); dump_table(s->fft_cpx,s->nfft); ms_ifft(fft_handle,s->fft_cpx,s->fir); ms_fft_destroy(fft_handle); /* ms_message("Inverse fft result:"); dump_table(s->fir,s->fir_len); */ time_shift(s->fir,s->fir_len); /* ms_message("Time shifted:"); dump_table(s->fir,s->fir_len); */ norm_and_apodize(s->fir,s->fir_len); ms_message("Apodized impulse response:"); dump_table(s->fir,s->fir_len); s->needs_update=FALSE; }
void generic_plc_fftbf(plc_context_t *context, int16_t *input_buffer, int16_t *output_buffer, size_t input_buffer_len) { /* Allocate temporary buffers to perform FFT-> double buffer size in frequency domain -> inverse FFT */ ms_word16_t *time_domain_buffer = ms_malloc0(input_buffer_len*sizeof(ms_word16_t)); ms_word16_t *freq_domain_buffer = ms_malloc0(input_buffer_len*sizeof(ms_word16_t)); ms_word16_t *freq_domain_buffer_double = ms_malloc0(2*input_buffer_len*sizeof(ms_word16_t)); ms_word16_t *time_domain_buffer_double = ms_malloc0(2*input_buffer_len*sizeof(ms_word16_t)); size_t i; /* convert to ms_word16_t the input buffer */ for (i=0; i<input_buffer_len; i++) { time_domain_buffer[i] = (ms_word16_t)((float)input_buffer[i]*context->hamming_window[i]); } /* FFT */ ms_fft(context->fft_to_frequency_context, time_domain_buffer, freq_domain_buffer); /* double the number of sample in frequency domain */ for (i=0; i<input_buffer_len; i++) { freq_domain_buffer_double[2*i] = freq_domain_buffer[i]*ENERGY_ATTENUATION; freq_domain_buffer_double[2*i+1] = 0;//freq_domain_buffer[i]/2 ; } /* inverse FFT, we have twice the number of original samples, discard the first half and use the second as new samples */ ms_ifft(context->fft_to_time_context, freq_domain_buffer_double, time_domain_buffer_double); ms_free(time_domain_buffer); ms_free(freq_domain_buffer); ms_free(freq_domain_buffer_double); /* copy generated signal to the plc_out_buffer */ for (i=0; i<2*input_buffer_len; i++) { output_buffer[i] = (int16_t)(time_domain_buffer_double[i]); } ms_free(time_domain_buffer_double); }