這裡用 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);
}