- Timestamp:
- Nov 3, 2007, 2:52:34 PM (17 years ago)
- Branches:
- feature/autosink, feature/cnn, feature/cnn_org, feature/constantq, feature/crepe, feature/crepe_org, feature/pitchshift, feature/pydocstrings, feature/timestretch, fix/ffmpeg5, master, pitchshift, sampler, timestretch, yinfft+
- Children:
- 398c1c5
- Parents:
- 01af943
- Location:
- src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/fft.c
r01af943 ra47cd35 24 24 25 25 #if FFTW3F_SUPPORT 26 #define fftw_malloc 27 #define fftw_free 28 #define fftw_execute 29 #define fftw_plan_dft_r2c_1d 30 #define fftw_plan_dft_c2r_1d 31 #define fftw_plan_r2r_1d fftwf_plan_r2r_1d32 #define fftw_plan 33 #define fftw_destroy_plan 26 #define fftw_malloc fftwf_malloc 27 #define fftw_free fftwf_free 28 #define fftw_execute fftwf_execute 29 #define fftw_plan_dft_r2c_1d fftwf_plan_dft_r2c_1d 30 #define fftw_plan_dft_c2r_1d fftwf_plan_dft_c2r_1d 31 #define fftw_plan_r2r_1d fftwf_plan_r2r_1d 32 #define fftw_plan fftwf_plan 33 #define fftw_destroy_plan fftwf_destroy_plan 34 34 #endif 35 35 … … 41 41 42 42 struct _aubio_fft_t { 43 44 45 real_t*in, *out;46 fft_data_t*specdata;47 fftw_planpfw, pbw;43 uint_t fft_size; 44 uint_t channels; 45 real_t *in, *out; 46 fft_data_t *specdata; 47 fftw_plan pfw, pbw; 48 48 }; 49 49 … … 51 51 52 52 aubio_fft_t * new_aubio_fft(uint_t size) { 53 54 55 56 57 53 aubio_fft_t * s = AUBIO_NEW(aubio_fft_t); 54 /* allocate memory */ 55 s->in = AUBIO_ARRAY(real_t,size); 56 s->out = AUBIO_ARRAY(real_t,size); 57 /* create plans */ 58 58 #ifdef HAVE_COMPLEX_H 59 59 s->fft_size = size/2+1; 60 61 62 60 s->specdata = (fft_data_t*)fftw_malloc(sizeof(fft_data_t)*s->fft_size); 61 s->pfw = fftw_plan_dft_r2c_1d(size, s->in, s->specdata, FFTW_ESTIMATE); 62 s->pbw = fftw_plan_dft_c2r_1d(size, s->specdata, s->out, FFTW_ESTIMATE); 63 63 #else 64 64 s->fft_size = size; 65 66 67 65 s->specdata = (fft_data_t*)fftw_malloc(sizeof(fft_data_t)*s->fft_size); 66 s->pfw = fftw_plan_r2r_1d(size, s->in, s->specdata, FFTW_R2HC, FFTW_ESTIMATE); 67 s->pbw = fftw_plan_r2r_1d(size, s->specdata, s->out, FFTW_HC2R, FFTW_ESTIMATE); 68 68 #endif 69 69 return s; 70 70 } 71 71 72 72 void del_aubio_fft(aubio_fft_t * s) { 73 74 75 76 77 78 79 73 /* destroy data */ 74 fftw_destroy_plan(s->pfw); 75 fftw_destroy_plan(s->pbw); 76 fftw_free(s->specdata); 77 AUBIO_FREE(s->out); 78 AUBIO_FREE(s->in ); 79 AUBIO_FREE(s); 80 80 } 81 81 82 82 void aubio_fft_do(const aubio_fft_t * s, 83 const smpl_t * data, fft_data_t * spectrum, 84 const uint_t size) { 85 uint_t i; 86 for (i=0;i<size;i++) s->in[i] = data[i]; 87 fftw_execute(s->pfw); 88 for (i=0; i < s->fft_size; i++) spectrum[i] = s->specdata[i]; 83 const smpl_t * data, fft_data_t * spectrum, const uint_t size) { 84 uint_t i; 85 for (i=0;i<size;i++) s->in[i] = data[i]; 86 fftw_execute(s->pfw); 87 for (i=0; i < s->fft_size; i++) spectrum[i] = s->specdata[i]; 89 88 } 90 89 91 90 void aubio_fft_rdo(const aubio_fft_t * s, 92 const fft_data_t * spectrum, 93 smpl_t * data, 94 const uint_t size) { 95 uint_t i; 96 const smpl_t renorm = 1./(smpl_t)size; 97 for (i=0; i < s->fft_size; i++) s->specdata[i] = spectrum[i]; 98 fftw_execute(s->pbw); 99 for (i=0;i<size;i++) data[i] = s->out[i]*renorm; 91 const fft_data_t * spectrum, smpl_t * data, const uint_t size) { 92 uint_t i; 93 const smpl_t renorm = 1./(smpl_t)size; 94 for (i=0; i < s->fft_size; i++) s->specdata[i] = spectrum[i]; 95 fftw_execute(s->pbw); 96 for (i=0;i<size;i++) data[i] = s->out[i]*renorm; 100 97 } 101 98 … … 103 100 104 101 void aubio_fft_getnorm(smpl_t * norm, fft_data_t * spectrum, uint_t size) { 105 uint_t i; 106 for (i=0;i<size/2+1;i++) norm[i] = ABSC(spectrum[i]); 107 //for (i=0;i<size/2+1;i++) AUBIO_DBG("%f\n", norm[i]); 102 uint_t i; 103 for (i=0;i<size/2+1;i++) norm[i] = ABSC(spectrum[i]); 108 104 } 109 105 110 106 void aubio_fft_getphas(smpl_t * phas, fft_data_t * spectrum, uint_t size) { 111 uint_t i; 112 for (i=0;i<size/2+1;i++) phas[i] = ARGC(spectrum[i]); 113 //for (i=0;i<size/2+1;i++) AUBIO_DBG("%f\n", phas[i]); 107 uint_t i; 108 for (i=0;i<size/2+1;i++) phas[i] = ARGC(spectrum[i]); 114 109 } 115 110 … … 125 120 126 121 void aubio_fft_getnorm(smpl_t * norm, fft_data_t * spectrum, uint_t size) { 127 122 uint_t i; 128 123 norm[0] = SQR(spectrum[0]); 129 for (i=1;i<size/2;i++) norm[i] = (SQR(spectrum[i]) + SQR(spectrum[size-i])); 130 norm[size/2] = SQR(spectrum[size/2]); 131 //for (i=0;i<size/2+1;i++) AUBIO_DBG("%f\n", norm[i]); 124 for (i=1;i<size/2;i++) norm[i] = (SQR(spectrum[i]) + SQR(spectrum[size-i])); 125 norm[size/2] = SQR(spectrum[size/2]); 132 126 } 133 127 134 128 void aubio_fft_getphas(smpl_t * phas, fft_data_t * spectrum, uint_t size) { 135 129 uint_t i; 136 130 phas[0] = 0; 137 131 for (i=1;i<size/2+1;i++) phas[i] = atan2f(spectrum[size-i] , spectrum[i]); 138 132 phas[size/2] = 0; 139 //for (i=0;i<size/2+1;i++) AUBIO_DBG("%f\n", phas[i]);140 133 } 141 134 … … 161 154 162 155 aubio_mfft_t * new_aubio_mfft(uint_t winsize, uint_t channels){ 163 164 165 166 167 168 169 170 171 156 uint_t i; 157 aubio_mfft_t * fft = AUBIO_NEW(aubio_mfft_t); 158 fft->winsize = winsize; 159 fft->channels = channels; 160 fft->fft = new_aubio_fft(winsize); 161 fft->spec = AUBIO_ARRAY(fft_data_t*,channels); 162 for (i=0; i < channels; i++) 163 fft->spec[i] = AUBIO_ARRAY(fft_data_t,winsize); 164 return fft; 172 165 } 173 166 174 167 /* execute stft */ 175 168 void aubio_mfft_do (aubio_mfft_t * fft,fvec_t * in,cvec_t * fftgrain){ 176 177 178 179 180 181 182 183 169 uint_t i=0; 170 /* execute stft */ 171 for (i=0; i < fft->channels; i++) { 172 aubio_fft_do (fft->fft,in->data[i],fft->spec[i],fft->winsize); 173 /* put norm and phase into fftgrain */ 174 aubio_fft_getnorm(fftgrain->norm[i], fft->spec[i], fft->winsize); 175 aubio_fft_getphas(fftgrain->phas[i], fft->spec[i], fft->winsize); 176 } 184 177 } 185 178 186 179 /* execute inverse fourier transform */ 187 180 void aubio_mfft_rdo(aubio_mfft_t * fft,cvec_t * fftgrain, fvec_t * out){ 188 189 190 191 192 181 uint_t i=0; 182 for (i=0; i < fft->channels; i++) { 183 aubio_fft_getspectrum(fft->spec[i],fftgrain->norm[i],fftgrain->phas[i],fft->winsize); 184 aubio_fft_rdo(fft->fft,fft->spec[i],out->data[i],fft->winsize); 185 } 193 186 } 194 187 195 188 void del_aubio_mfft(aubio_mfft_t * fft) { 196 197 198 199 200 201 189 uint_t i; 190 for (i=0; i < fft->channels; i++) 191 AUBIO_FREE(fft->spec[i]); 192 AUBIO_FREE(fft->spec); 193 del_aubio_fft(fft->fft); 194 AUBIO_FREE(fft); 202 195 } -
src/fft.h
r01af943 ra47cd35 1 1 /* 2 2 Copyright (C) 2003 Paul Brossier 3 3 4 5 6 7 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 2 of the License, or 7 (at your option) any later version. 8 8 9 10 11 12 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 13 14 15 16 17 14 You should have received a copy of the GNU General Public License 15 along with this program; if not, write to the Free Software 16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 17 18 18 */ 19 19
Note: See TracChangeset
for help on using the changeset viewer.