這裡用 fftwf_ 表示精度為float,另外,fftwf_plan_dft_r2c_1d 結果的長度會是輸入Buffer的一半,後面全部會是0。所以output長度選用 BUFFER_SIZE/2+1 即可。

#include <stdio.h>
#include <fftw3.h>
#include <complex.h>

...

int main(){
	fftwf_complex input[BUFFER_SIZE];
  fftwf_plan plan;
  fftwf_complex output[BUFFER_SIZE/2+1];
	// Do FFT
	plan = fftwf_plan_dft_r2c_1d(Buffer_size, input, output, FFTW_ESTIMATE);
	fftwf_execute(plan);

	// Do IFFT
	plan = fftwf_plan_dft_c2r_1d(Buffer_size, input, output, FFTW_ESTIMATE);
	fftwf_execute(plan);

}

#Compile and link

gcc filename.c -lportaudio -lgsl -lgslcblas -fftwf3f -lm

若有很多個輸入,則用for跑遍 切記並非使用 fftwf_plan_dft_r2c_2d ,兩個是不一樣的意思!

// in Callback.c

float in_sort=[USED_CH][FRAME_BLOCK_LEN];
float input_fft_data[USED_CH][FRAME_BLOCK_LEN/2+1];

for(int i=0;i<USED_CH;i++){
        plan = fftwf_plan_dft_r2c_1d(FRAME_BLOCK_LEN, in_sort[i], input_fft_data[i], FFTW_ESTIMATE);
        fftwf_execute(plan);
    }