// Creates a blank/empty frame (interpolate() must later be called). FFTFrame::FFTFrame() : m_FFTSize(0) , m_log2FFTSize(0) , m_complexData(0) { int fftLength = gst_fft_next_fast_length(m_FFTSize); m_fft = gst_fft_f32_new(fftLength, FALSE); m_inverseFft = gst_fft_f32_new(fftLength, TRUE); }
// Normal constructor: allocates for a given fftSize. FFTFrame::FFTFrame(unsigned fftSize) : m_FFTSize(fftSize) , m_log2FFTSize(static_cast<unsigned>(log2(fftSize))) , m_realData(unpackedFFTDataSize(m_FFTSize)) , m_imagData(unpackedFFTDataSize(m_FFTSize)) { m_complexData = WTF::fastNewArray<GstFFTF32Complex>(unpackedFFTDataSize(m_FFTSize)); int fftLength = gst_fft_next_fast_length(m_FFTSize); m_fft = gst_fft_f32_new(fftLength, FALSE); m_inverseFft = gst_fft_f32_new(fftLength, TRUE); }
static void update_spectrum_bands (GstElement * spectrum) { guint bands = spect_bands; gchar str[50]; if (fast) bands = ((gst_fft_next_fast_length (2 * bands - 2) + 2) / 2); sprintf (str, "using %u bands", bands); g_object_set (bands_used, "label", str, NULL); g_object_set (G_OBJECT (spectrum), "bands", bands, NULL); }
// Copy constructor. FFTFrame::FFTFrame(const FFTFrame& frame) : m_FFTSize(frame.m_FFTSize) , m_log2FFTSize(frame.m_log2FFTSize) , m_realData(unpackedFFTDataSize(frame.m_FFTSize)) , m_imagData(unpackedFFTDataSize(frame.m_FFTSize)) { m_complexData = WTF::fastNewArray<GstFFTF32Complex>(unpackedFFTDataSize(m_FFTSize)); int fftLength = gst_fft_next_fast_length(m_FFTSize); m_fft = gst_fft_f32_new(fftLength, FALSE); m_inverseFft = gst_fft_f32_new(fftLength, TRUE); // Copy/setup frame data. memcpy(realData(), frame.realData(), sizeof(float) * unpackedFFTDataSize(m_FFTSize)); memcpy(imagData(), frame.imagData(), sizeof(float) * unpackedFFTDataSize(m_FFTSize)); }
/* Element class */ static void gst_audio_fx_base_fir_filter_calculate_frequency_response (GstAudioFXBaseFIRFilter * self) { gst_fft_f64_free (self->fft); self->fft = NULL; gst_fft_f64_free (self->ifft); self->ifft = NULL; g_free (self->frequency_response); self->frequency_response_length = 0; g_free (self->fft_buffer); self->fft_buffer = NULL; if (self->kernel && self->kernel_length >= FFT_THRESHOLD && !self->low_latency) { guint block_length, i; gdouble *kernel_tmp, *kernel = self->kernel; /* We process 4 * kernel_length samples per pass in FFT mode */ block_length = 4 * self->kernel_length; block_length = gst_fft_next_fast_length (block_length); self->block_length = block_length; kernel_tmp = g_new0 (gdouble, block_length); memcpy (kernel_tmp, kernel, self->kernel_length * sizeof (gdouble)); self->fft = gst_fft_f64_new (block_length, FALSE); self->ifft = gst_fft_f64_new (block_length, TRUE); self->frequency_response_length = block_length / 2 + 1; self->frequency_response = g_new (GstFFTF64Complex, self->frequency_response_length); gst_fft_f64_fft (self->fft, kernel_tmp, self->frequency_response); g_free (kernel_tmp); /* Normalize to make sure IFFT(FFT(x)) == x */ for (i = 0; i < self->frequency_response_length; i++) { self->frequency_response[i].r /= block_length; self->frequency_response[i].i /= block_length; } } }