示例#1
0
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;
}
示例#2
0
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);
}