#include <stdio.h> #include <stdlib.h> #include <math.h> #include <fftw3.h> #include "fftfilt.h" #include <cmath> #define min(a,b) (((a) < (b)) ? (a):(b)) void fftfilt::compute(double *dataArray, int sizeArray, double *irArray, int sizeIR){ //Variables int nx = sizeArray; int nb = sizeIR; int nfft = 2048; //FFT size to a power of 2 for speed int ppw = 0; while (nfft<nb){ nfft = pow(2,ppw); ppw++; } int L = nfft - nb + 1; //FFT of IR fftw_complex *out_cpx_ir; fftw_plan fft_ir; out_cpx_ir = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*nfft); fft_ir = fftw_plan_dft_r2c_1d(nfft, irArray, out_cpx_ir, FFTW_ESTIMATE); fftw_execute(fft_ir); //Result allocation double *y; y = (double *) malloc(sizeArray*sizeof(double)); //More variables int istart = 0; int iend; fftw_complex *out_cpx_voice; fftw_plan fft_voice; out_cpx_voice = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*nfft); fftw_complex *out_cpx_total; out_cpx_total = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*nfft); double *out_local; out_local = (double *) malloc(nfft*sizeof(double)); fftw_plan ifft; ifft = fftw_plan_dft_c2r_1d(nfft, out_cpx_total, out_local, FFTW_ESTIMATE); //Filtering in Freq domain while (istart <= nx){ iend = min(istart+L-1,nx); //Local data - save memory double *x; x = (double *) malloc((iend-istart+1)*sizeof(double)); int index =0; for(int i=istart;i<iend;i++){ x [index] = dataArray[i]; index++; } fft_voice = fftw_plan_dft_r2c_1d(nfft, x, out_cpx_voice, FFTW_ESTIMATE); fftw_execute(fft_voice); for(int j=1; j<nfft;j++){ out_cpx_total[j][0] = out_cpx_voice[j][0]*out_cpx_ir[j][0]; out_cpx_total[j][1] = out_cpx_voice[j][1]*out_cpx_ir[j][1]; } fftw_execute(ifft); for (int i=0;i<nfft;i++){ out_local[i] = out_local[i]/nfft; } int yend = min(nx,istart+nfft-1); int loc_pos = 0; int p; for (p=istart;p<yend;p++){ y[p] = y[p] + out_local[loc_pos]; loc_pos++; } istart = istart + L; finalsize(p); } finalarray(y); } |
[New Thread 4888.0x1334] [New Thread 4888.0x10b4] warning: (Internal error: pc 0xc7 in read in psymtab, but not in symtab.) warning: (Internal error: pc 0xc7 in read in psymtab, but not in symtab.) |