00001 #ifndef FOURIER_H
00002 #define FOURIER_H
00003
00004
00005
00006 #include <stdint.h>
00007 #include <fftw3.h>
00008
00009 #include "mutex.h"
00010
00011 typedef struct fftw_plan_desc {
00012 int samples;
00013 fftw_plan plan_forward;
00014 fftw_plan plan_backward;
00015 fftw_plan_desc *next;
00016 };
00017
00018 class FFT
00019 {
00020 public:
00021 FFT();
00022 ~FFT();
00023
00024 int do_fft(unsigned int samples,
00025 int inverse,
00026 double *real_in,
00027 double *imag_in,
00028 double *real_out,
00029 double *imag_out);
00030 int symmetry(int size, double *freq_real, double *freq_imag);
00031 unsigned int samples_to_bits(unsigned int samples);
00032 unsigned int reverse_bits(unsigned int index, unsigned int bits);
00033 virtual int update_progress(int current_position);
00034
00035 fftw_plan_desc *my_fftw_plan;
00036 int ready_fftw(unsigned int samples);
00037 int do_fftw_inplace(unsigned int samples,
00038 int inverse,
00039 fftw_complex *data);
00040
00041
00042 static fftw_plan_desc *fftw_plans;
00043 static Mutex plans_lock;
00044
00045
00046 };
00047
00048
00049 class CrossfadeFFT : public FFT
00050 {
00051 public:
00052 CrossfadeFFT();
00053 virtual ~CrossfadeFFT();
00054
00055 int reset();
00056 int initialize(int window_size);
00057 long get_delay();
00058 int reconfigure();
00059 int fix_window_size();
00060 int delete_fft();
00061
00062 void set_oversample(int oversample);
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 int process_buffer(int64_t output_sample,
00074 long size,
00075 double *output_ptr,
00076 int direction);
00077
00078 int process_buffer_oversample(int64_t output_sample,
00079 long size,
00080 double *output_ptr,
00081 int direction);
00082
00083
00084
00085 virtual int read_samples(int64_t output_sample,
00086 int samples,
00087 double *buffer);
00088
00089
00090 virtual int signal_process();
00091
00092
00093
00094 virtual int signal_process_oversample(int reset);
00095
00096
00097
00098 long window_size;
00099
00100
00101 double *freq_real;
00102 double *freq_imag;
00103
00104 fftw_complex *fftw_data;
00105
00106 private:
00107
00108
00109 double *input_buffer;
00110
00111 double *output_buffer;
00112
00113 double *temp_real;
00114 double *temp_imag;
00115
00116
00117 long input_size;
00118
00119 long input_allocation;
00120
00121 long output_size;
00122
00123 long output_allocation;
00124
00125 int64_t output_sample;
00126
00127 int64_t input_sample;
00128
00129 int first_window;
00130
00131
00132
00133 int samples_ready;
00134
00135 double *pre_window;
00136
00137 double *post_window;
00138 protected:
00139
00140 int oversample;
00141
00142 };
00143
00144 #endif