Changeset 20c8769
- Timestamp:
- Oct 1, 2017, 8:04:30 PM (7 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
- Children:
- f080cbf
- Parents:
- 25cf957 (diff), 799d992 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
src/aubio_priv.h
r25cf957 r20c8769 124 124 #endif /* HAVE_ATLAS */ 125 125 126 #if !defined(HAVE_MEMCPY_HACKS) && !defined(HAVE_ACCELERATE) && !defined(HAVE_ATLAS) 126 #if defined HAVE_INTEL_IPP 127 #include <ippcore.h> 128 #include <ippvm.h> 129 #include <ipps.h> 130 #ifndef HAVE_AUBIO_DOUBLE 131 #define aubio_ippsSet ippsSet_32f 132 #define aubio_ippsZero ippsZero_32f 133 #define aubio_ippsCopy ippsCopy_32f 134 #define aubio_ippsMul ippsMul_32f 135 #define aubio_ippsMulC ippsMulC_32f 136 #define aubio_ippsAddC ippsAddC_32f 137 #define aubio_ippsLn ippsLn_32f_A21 138 #define aubio_ippsMean(a,b,c) ippsMean_32f(a, b, c, ippAlgHintFast) 139 #define aubio_ippsSum(a,b,c) ippsSum_32f(a, b, c, ippAlgHintFast) 140 #define aubio_ippsMax ippsMax_32f 141 #define aubio_ippsMin ippsMin_32f 142 #else /* HAVE_AUBIO_DOUBLE */ 143 #define aubio_ippsSet ippsSet_64f 144 #define aubio_ippsZero ippsZero_64f 145 #define aubio_ippsCopy ippsCopy_64f 146 #define aubio_ippsMul ippsMul_64f 147 #define aubio_ippsMulC ippsMulC_64f 148 #define aubio_ippsAddC ippsAddC_64f 149 #define aubio_ippsLn ippsLn_64f_A26 150 #define aubio_ippsMean ippsMean_64f 151 #define aubio_ippsSum ippsSum_64f 152 #define aubio_ippsMax ippsMax_64f 153 #define aubio_ippsMin ippsMin_64f 154 #endif /* HAVE_AUBIO_DOUBLE */ 155 #endif 156 157 #if !defined(HAVE_MEMCPY_HACKS) && !defined(HAVE_ACCELERATE) && !defined(HAVE_ATLAS) && !defined(HAVE_INTEL_IPP) 127 158 #define HAVE_NOOPT 1 128 159 #else -
src/cvec.c
r25cf957 r20c8769 86 86 return; 87 87 } 88 #ifdef HAVE_MEMCPY_HACKS 88 #if defined(HAVE_INTEL_IPP) 89 aubio_ippsCopy(s->phas, t->phas, (int)s->length); 90 aubio_ippsCopy(s->norm, t->norm, (int)s->length); 91 #elif defined(HAVE_MEMCPY_HACKS) 89 92 memcpy(t->norm, s->norm, t->length * sizeof(smpl_t)); 90 93 memcpy(t->phas, s->phas, t->length * sizeof(smpl_t)); 91 #else /* HAVE_MEMCPY_HACKS */94 #else 92 95 uint_t j; 93 96 for (j=0; j< t->length; j++) { … … 95 98 t->phas[j] = s->phas[j]; 96 99 } 97 #endif /* HAVE_MEMCPY_HACKS */100 #endif 98 101 } 99 102 100 void cvec_norm_set_all (cvec_t *s, smpl_t val) { 103 void cvec_norm_set_all(cvec_t *s, smpl_t val) { 104 #if defined(HAVE_INTEL_IPP) 105 aubio_ippsSet(val, s->norm, (int)s->length); 106 #else 101 107 uint_t j; 102 108 for (j=0; j< s->length; j++) { 103 109 s->norm[j] = val; 104 110 } 111 #endif 105 112 } 106 113 107 114 void cvec_norm_zeros(cvec_t *s) { 108 #ifdef HAVE_MEMCPY_HACKS 115 #if defined(HAVE_INTEL_IPP) 116 aubio_ippsZero(s->norm, (int)s->length); 117 #elif defined(HAVE_MEMCPY_HACKS) 109 118 memset(s->norm, 0, s->length * sizeof(smpl_t)); 110 #else /* HAVE_MEMCPY_HACKS */119 #else 111 120 cvec_norm_set_all (s, 0.); 112 #endif /* HAVE_MEMCPY_HACKS */121 #endif 113 122 } 114 123 … … 118 127 119 128 void cvec_phas_set_all (cvec_t *s, smpl_t val) { 129 #if defined(HAVE_INTEL_IPP) 130 aubio_ippsSet(val, s->phas, (int)s->length); 131 #else 120 132 uint_t j; 121 133 for (j=0; j< s->length; j++) { 122 134 s->phas[j] = val; 123 135 } 136 #endif 124 137 } 125 138 126 139 void cvec_phas_zeros(cvec_t *s) { 127 #ifdef HAVE_MEMCPY_HACKS 140 #if defined(HAVE_INTEL_IPP) 141 aubio_ippsZero(s->phas, (int)s->length); 142 #elif defined(HAVE_MEMCPY_HACKS) 128 143 memset(s->phas, 0, s->length * sizeof(smpl_t)); 129 144 #else … … 142 157 143 158 void cvec_logmag(cvec_t *s, smpl_t lambda) { 144 uint_t j; 145 for (j=0; j< s->length; j++) { 146 s->norm[j] = LOG(lambda * s->norm[j] + 1); 147 } 159 #if defined(HAVE_INTEL_IPP) 160 aubio_ippsMulC(s->norm, lambda, s->norm, (int)s->length); 161 aubio_ippsAddC(s->norm, 1.0, s->norm, (int)s->length); 162 aubio_ippsLn(s->norm, s->norm, (int)s->length); 163 #else 164 uint_t j; 165 for (j=0; j< s->length; j++) { 166 s->norm[j] = LOG(lambda * s->norm[j] + 1); 167 } 168 #endif 148 169 } -
src/fvec.c
r25cf957 r20c8769 61 61 62 62 void fvec_set_all (fvec_t *s, smpl_t val) { 63 #if !defined(HAVE_ACCELERATE) && !defined(HAVE_ATLAS) 64 uint_t j; 65 for (j=0; j< s->length; j++) { 66 s->data[j] = val; 67 } 63 #if defined(HAVE_INTEL_IPP) 64 aubio_ippsSet(val, s->data, (int)s->length); 68 65 #elif defined(HAVE_ATLAS) 69 66 aubio_catlas_set(s->length, val, s->data, 1); 70 67 #elif defined(HAVE_ACCELERATE) 71 68 aubio_vDSP_vfill(&val, s->data, 1, s->length); 69 #else 70 uint_t j; 71 for ( j = 0; j< s->length; j++ ) 72 { 73 s->data[j] = val; 74 } 72 75 #endif 73 76 } 74 77 75 78 void fvec_zeros(fvec_t *s) { 76 #if !defined(HAVE_MEMCPY_HACKS) && !defined(HAVE_ACCELERATE) 77 fvec_set_all (s, 0.); 78 #else 79 #if defined(HAVE_MEMCPY_HACKS) 79 #if defined(HAVE_INTEL_IPP) 80 aubio_ippsZero(s->data, (int)s->length); 81 #elif defined(HAVE_ACCELERATE) 82 aubio_vDSP_vclr(s->data, 1, s->length); 83 #elif defined(HAVE_MEMCPY_HACKS) 80 84 memset(s->data, 0, s->length * sizeof(smpl_t)); 81 85 #else 82 aubio_vDSP_vclr(s->data, 1, s->length); 83 #endif 86 fvec_set_all(s, 0.); 84 87 #endif 85 88 } … … 97 100 98 101 void fvec_weight(fvec_t *s, const fvec_t *weight) { 99 #ifndef HAVE_ACCELERATE 102 uint_t length = MIN(s->length, weight->length); 103 #if defined(HAVE_INTEL_IPP) 104 aubio_ippsMul(s->data, weight->data, s->data, (int)length); 105 #elif defined(HAVE_ACCELERATE) 106 aubio_vDSP_vmul( s->data, 1, weight->data, 1, s->data, 1, length ); 107 #else 100 108 uint_t j; 101 uint_t length = MIN(s->length, weight->length); 102 for (j=0; j< length; j++) { 109 for (j = 0; j < length; j++) { 103 110 s->data[j] *= weight->data[j]; 104 111 } 105 #else106 aubio_vDSP_vmul(s->data, 1, weight->data, 1, s->data, 1, s->length);107 112 #endif /* HAVE_ACCELERATE */ 108 113 } 109 114 110 115 void fvec_weighted_copy(const fvec_t *in, const fvec_t *weight, fvec_t *out) { 111 #ifndef HAVE_ACCELERATE 116 uint_t length = MIN(in->length, MIN(out->length, weight->length)); 117 #if defined(HAVE_INTEL_IPP) 118 aubio_ippsMul(in->data, weight->data, out->data, (int)length); 119 #elif defined(HAVE_ACCELERATE) 120 aubio_vDSP_vmul(in->data, 1, weight->data, 1, out->data, 1, length); 121 #else 112 122 uint_t j; 113 uint_t length = MIN(out->length, weight->length); 114 for (j=0; j< length; j++) { 123 for (j = 0; j < length; j++) { 115 124 out->data[j] = in->data[j] * weight->data[j]; 116 125 } 117 #else 118 aubio_vDSP_vmul(in->data, 1, weight->data, 1, out->data, 1, out->length); 119 #endif /* HAVE_ACCELERATE */ 126 #endif 120 127 } 121 128 … … 126 133 return; 127 134 } 128 #ifdef HAVE_NOOPT 129 uint_t j; 130 for (j=0; j< t->length; j++) { 131 t->data[j] = s->data[j]; 132 } 133 #elif defined(HAVE_MEMCPY_HACKS) 134 memcpy(t->data, s->data, t->length * sizeof(smpl_t)); 135 #if defined(HAVE_INTEL_IPP) 136 aubio_ippsCopy(s->data, t->data, (int)s->length); 135 137 #elif defined(HAVE_ATLAS) 136 138 aubio_cblas_copy(s->length, s->data, 1, t->data, 1); 137 139 #elif defined(HAVE_ACCELERATE) 138 140 aubio_vDSP_mmov(s->data, t->data, 1, s->length, 1, 1); 141 #elif defined(HAVE_MEMCPY_HACKS) 142 memcpy(t->data, s->data, t->length * sizeof(smpl_t)); 143 #else 144 uint_t j; 145 for (j = 0; j < t->length; j++) { 146 t->data[j] = s->data[j]; 147 } 139 148 #endif 140 149 } -
src/mathutils.c
r25cf957 r20c8769 160 160 { 161 161 smpl_t tmp = 0.0; 162 #ifndef HAVE_ACCELERATE 162 #if defined(HAVE_INTEL_IPP) 163 aubio_ippsMean(s->data, (int)s->length, &tmp); 164 return tmp; 165 #elif defined(HAVE_ACCELERATE) 166 aubio_vDSP_meanv(s->data, 1, &tmp, s->length); 167 return tmp; 168 #else 163 169 uint_t j; 164 170 for (j = 0; j < s->length; j++) { 165 171 tmp += s->data[j]; 166 172 } 167 return tmp / (smpl_t) (s->length); 168 #else 169 aubio_vDSP_meanv(s->data, 1, &tmp, s->length); 170 return tmp; 171 #endif /* HAVE_ACCELERATE */ 173 return tmp / (smpl_t)(s->length); 174 #endif 172 175 } 173 176 … … 176 179 { 177 180 smpl_t tmp = 0.0; 178 #ifndef HAVE_ACCELERATE 181 #if defined(HAVE_INTEL_IPP) 182 aubio_ippsSum(s->data, (int)s->length, &tmp); 183 #elif defined(HAVE_ACCELERATE) 184 aubio_vDSP_sve(s->data, 1, &tmp, s->length); 185 #else 179 186 uint_t j; 180 187 for (j = 0; j < s->length; j++) { 181 188 tmp += s->data[j]; 182 189 } 183 #else 184 aubio_vDSP_sve(s->data, 1, &tmp, s->length); 185 #endif /* HAVE_ACCELERATE */ 190 #endif 186 191 return tmp; 187 192 } … … 190 195 fvec_max (fvec_t * s) 191 196 { 192 #ifndef HAVE_ACCELERATE 193 uint_t j; 194 smpl_t tmp = 0.0; 195 for (j = 0; j < s->length; j++) { 197 #if defined(HAVE_INTEL_IPP) 198 smpl_t tmp = 0.; 199 aubio_ippsMax( s->data, (int)s->length, &tmp); 200 #elif defined(HAVE_ACCELERATE) 201 smpl_t tmp = 0.; 202 aubio_vDSP_maxv( s->data, 1, &tmp, s->length ); 203 #else 204 uint_t j; 205 smpl_t tmp = s->data[0]; 206 for (j = 1; j < s->length; j++) { 196 207 tmp = (tmp > s->data[j]) ? tmp : s->data[j]; 197 208 } 198 #else 209 #endif 210 return tmp; 211 } 212 213 smpl_t 214 fvec_min (fvec_t * s) 215 { 216 #if defined(HAVE_INTEL_IPP) 199 217 smpl_t tmp = 0.; 200 aubio_vDSP_maxv(s->data, 1, &tmp, s->length); 201 #endif 202 return tmp; 203 } 204 205 smpl_t 206 fvec_min (fvec_t * s) 207 { 208 #ifndef HAVE_ACCELERATE 209 uint_t j; 210 smpl_t tmp = s->data[0]; 211 for (j = 0; j < s->length; j++) { 212 tmp = (tmp < s->data[j]) ? tmp : s->data[j]; 213 } 214 #else 218 aubio_ippsMin(s->data, (int)s->length, &tmp); 219 #elif defined(HAVE_ACCELERATE) 215 220 smpl_t tmp = 0.; 216 221 aubio_vDSP_minv(s->data, 1, &tmp, s->length); 222 #else 223 uint_t j; 224 smpl_t tmp = s->data[0]; 225 for (j = 1; j < s->length; j++) { 226 tmp = (tmp < s->data[j]) ? tmp : s->data[j]; 227 } 217 228 #endif 218 229 return tmp; … … 575 586 } 576 587 588 uint_t 589 aubio_power_of_two_order (uint_t a) 590 { 591 int order = 0; 592 int temp = aubio_next_power_of_two(a); 593 while (temp >>= 1) { 594 ++order; 595 } 596 return order; 597 } 598 577 599 smpl_t 578 600 aubio_db_spl (const fvec_t * o) -
src/mathutils.h
r25cf957 r20c8769 313 313 uint_t aubio_next_power_of_two(uint_t a); 314 314 315 /** return the log2 factor of the given power of 2 value a */ 316 uint_t aubio_power_of_two_order(uint_t a); 317 315 318 /** compute normalised autocorrelation function 316 319 -
src/spectral/fft.c
r25cf957 r20c8769 78 78 pthread_mutex_t aubio_fftw_mutex = PTHREAD_MUTEX_INITIALIZER; 79 79 80 #else 81 #ifdef HAVE_ACCELERATE // using ACCELERATE 80 #elif defined HAVE_ACCELERATE // using ACCELERATE 82 81 // https://developer.apple.com/library/mac/#documentation/Accelerate/Reference/vDSPRef/Reference/reference.html 83 82 #include <Accelerate/Accelerate.h> … … 113 112 #endif /* HAVE_AUBIO_DOUBLE */ 114 113 115 #else // using OOURA 114 #elif defined HAVE_INTEL_IPP // using INTEL IPP 115 116 #if !HAVE_AUBIO_DOUBLE 117 #define aubio_IppFloat Ipp32f 118 #define aubio_IppComplex Ipp32fc 119 #define aubio_FFTSpec FFTSpec_R_32f 120 #define aubio_ippsMalloc_complex ippsMalloc_32fc 121 #define aubio_ippsFFTInit_R ippsFFTInit_R_32f 122 #define aubio_ippsFFTGetSize_R ippsFFTGetSize_R_32f 123 #define aubio_ippsFFTInv_CCSToR ippsFFTInv_CCSToR_32f 124 #define aubio_ippsFFTFwd_RToCCS ippsFFTFwd_RToCCS_32f 125 #define aubio_ippsAtan2 ippsAtan2_32f_A21 126 #else /* HAVE_AUBIO_DOUBLE */ 127 #define aubio_IppFloat Ipp64f 128 #define aubio_IppComplex Ipp64fc 129 #define aubio_FFTSpec FFTSpec_R_64f 130 #define aubio_ippsMalloc_complex ippsMalloc_64fc 131 #define aubio_ippsFFTInit_R ippsFFTInit_R_64f 132 #define aubio_ippsFFTGetSize_R ippsFFTGetSize_R_64f 133 #define aubio_ippsFFTInv_CCSToR ippsFFTInv_CCSToR_64f 134 #define aubio_ippsFFTFwd_RToCCS ippsFFTFwd_RToCCS_64f 135 #define aubio_ippsAtan2 ippsAtan2_64f_A50 136 #endif 137 138 139 #else // using OOURA 116 140 // let's use ooura instead 117 141 extern void aubio_ooura_rdft(int, int, smpl_t *, int *, smpl_t *); 118 142 119 #endif /* HAVE_ACCELERATE */ 120 #endif /* HAVE_FFTW3 */ 143 #endif 121 144 122 145 struct _aubio_fft_t { 123 146 uint_t winsize; 124 147 uint_t fft_size; 148 125 149 #ifdef HAVE_FFTW3 // using FFTW3 126 150 real_t *in, *out; 127 151 fftw_plan pfw, pbw; 128 fft_data_t * specdata; 129 #else 130 # ifdef HAVE_ACCELERATE// using ACCELERATE152 fft_data_t * specdata; /* complex spectral data */ 153 154 #elif defined HAVE_ACCELERATE // using ACCELERATE 131 155 int log2fftsize; 132 156 aubio_FFTSetup fftSetup; 133 157 aubio_DSPSplitComplex spec; 134 158 smpl_t *in, *out; 159 160 #elif defined HAVE_INTEL_IPP // using Intel IPP 161 smpl_t *in, *out; 162 Ipp8u* memSpec; 163 Ipp8u* memInit; 164 Ipp8u* memBuffer; 165 struct aubio_FFTSpec* fftSpec; 166 aubio_IppComplex* complexOut; 135 167 #else // using OOURA 136 168 smpl_t *in, *out; 137 169 smpl_t *w; 138 170 int *ip; 139 #endif /* HAVE_ACCELERATE*/140 #endif /* HAVE_FFTW3 */ 171 #endif /* using OOURA */ 172 141 173 fvec_t * compspec; 142 174 }; … … 148 180 goto beach; 149 181 } 182 150 183 #ifdef HAVE_FFTW3 151 184 uint_t i; … … 176 209 s->specdata[i] = 0.; 177 210 } 178 #else 179 # ifdef HAVE_ACCELERATE// using ACCELERATE211 212 #elif defined HAVE_ACCELERATE // using ACCELERATE 180 213 s->winsize = winsize; 181 214 s->fft_size = winsize; 182 215 s->compspec = new_fvec(winsize); 183 s->log2fftsize = (uint_t)log2f(s->fft_size);216 s->log2fftsize = aubio_power_of_two_order(s->fft_size); 184 217 s->in = AUBIO_ARRAY(smpl_t, s->fft_size); 185 218 s->out = AUBIO_ARRAY(smpl_t, s->fft_size); … … 187 220 s->spec.imagp = AUBIO_ARRAY(smpl_t, s->fft_size/2); 188 221 s->fftSetup = aubio_vDSP_create_fftsetup(s->log2fftsize, FFT_RADIX2); 222 223 #elif defined HAVE_INTEL_IPP // using Intel IPP 224 const IppHintAlgorithm qualityHint = ippAlgHintAccurate; // OR ippAlgHintFast; 225 const int flags = IPP_FFT_NODIV_BY_ANY; // we're scaling manually afterwards 226 int order = aubio_power_of_two_order(winsize); 227 int sizeSpec, sizeInit, sizeBuffer; 228 IppStatus status; 229 230 if (winsize <= 4 || aubio_is_power_of_two(winsize) != 1) 231 { 232 AUBIO_ERR("intel IPP fft: can only create with sizes > 4 and power of two, requested %d," 233 " try recompiling aubio with --enable-fftw3\n", winsize); 234 goto beach; 235 } 236 237 status = aubio_ippsFFTGetSize_R(order, flags, qualityHint, 238 &sizeSpec, &sizeInit, &sizeBuffer); 239 if (status != ippStsNoErr) { 240 AUBIO_ERR("fft: failed to initialize fft. IPP error: %d\n", status); 241 goto beach; 242 } 243 s->fft_size = s->winsize = winsize; 244 s->compspec = new_fvec(winsize); 245 s->in = AUBIO_ARRAY(smpl_t, s->winsize); 246 s->out = AUBIO_ARRAY(smpl_t, s->winsize); 247 s->memSpec = ippsMalloc_8u(sizeSpec); 248 s->memBuffer = ippsMalloc_8u(sizeBuffer); 249 if (sizeInit > 0 ) { 250 s->memInit = ippsMalloc_8u(sizeInit); 251 } 252 s->complexOut = aubio_ippsMalloc_complex(s->fft_size / 2 + 1); 253 status = aubio_ippsFFTInit_R( 254 &s->fftSpec, order, flags, qualityHint, s->memSpec, s->memInit); 255 if (status != ippStsNoErr) { 256 AUBIO_ERR("fft: failed to initialize. IPP error: %d\n", status); 257 goto beach; 258 } 259 189 260 #else // using OOURA 190 261 if (aubio_is_power_of_two(winsize) != 1) { … … 201 272 s->w = AUBIO_ARRAY(smpl_t, s->fft_size); 202 273 s->ip[0] = 0; 203 #endif /* HAVE_ACCELERATE*/204 #endif /* HAVE_FFTW3 */ 274 #endif /* using OOURA */ 275 205 276 return s; 277 206 278 beach: 207 279 AUBIO_FREE(s); … … 211 283 void del_aubio_fft(aubio_fft_t * s) { 212 284 /* destroy data */ 213 del_fvec(s->compspec);214 285 #ifdef HAVE_FFTW3 // using FFTW3 215 286 pthread_mutex_lock(&aubio_fftw_mutex); … … 218 289 fftw_free(s->specdata); 219 290 pthread_mutex_unlock(&aubio_fftw_mutex); 220 #else /* HAVE_FFTW3 */ 221 # ifdef HAVE_ACCELERATE// using ACCELERATE291 292 #elif defined HAVE_ACCELERATE // using ACCELERATE 222 293 AUBIO_FREE(s->spec.realp); 223 294 AUBIO_FREE(s->spec.imagp); 224 295 aubio_vDSP_destroy_fftsetup(s->fftSetup); 296 297 #elif defined HAVE_INTEL_IPP // using Intel IPP 298 ippFree(s->memSpec); 299 ippFree(s->memInit); 300 ippFree(s->memBuffer); 301 ippFree(s->complexOut); 302 225 303 #else // using OOURA 226 304 AUBIO_FREE(s->w); 227 305 AUBIO_FREE(s->ip); 228 #endif /* HAVE_ACCELERATE */ 229 #endif /* HAVE_FFTW3 */ 306 #endif 307 308 del_fvec(s->compspec); 309 AUBIO_FREE(s->in); 230 310 AUBIO_FREE(s->out); 231 AUBIO_FREE(s->in);232 311 AUBIO_FREE(s); 233 312 } … … 252 331 memcpy(s->in, input->data, s->winsize * sizeof(smpl_t)); 253 332 #endif /* HAVE_MEMCPY_HACKS */ 333 254 334 #ifdef HAVE_FFTW3 // using FFTW3 255 335 fftw_execute(s->pfw); … … 266 346 } 267 347 #endif /* HAVE_COMPLEX_H */ 268 #else /* HAVE_FFTW3 */ 269 # ifdef HAVE_ACCELERATE// using ACCELERATE348 349 #elif defined HAVE_ACCELERATE // using ACCELERATE 270 350 // convert real data to even/odd format used in vDSP 271 351 aubio_vDSP_ctoz((aubio_DSPComplex*)s->in, 2, &s->spec, 1, s->fft_size/2); … … 282 362 smpl_t scale = 1./2.; 283 363 aubio_vDSP_vsmul(compspec->data, 1, &scale, compspec->data, 1, s->fft_size); 364 365 #elif defined HAVE_INTEL_IPP // using Intel IPP 366 367 // apply fft 368 aubio_ippsFFTFwd_RToCCS(s->in, (aubio_IppFloat*)s->complexOut, s->fftSpec, s->memBuffer); 369 // convert complex buffer to [ r0, r1, ..., rN, iN-1, .., i2, i1] 370 compspec->data[0] = s->complexOut[0].re; 371 compspec->data[s->fft_size / 2] = s->complexOut[s->fft_size / 2].re; 372 for (i = 1; i < s->fft_size / 2; i++) { 373 compspec->data[i] = s->complexOut[i].re; 374 compspec->data[s->fft_size - i] = s->complexOut[i].im; 375 } 376 284 377 #else // using OOURA 285 378 aubio_ooura_rdft(s->winsize, 1, s->in, s->ip, s->w); … … 290 383 compspec->data[s->winsize - i] = - s->in[2 * i + 1]; 291 384 } 292 #endif /* HAVE_ACCELERATE */ 293 #endif /* HAVE_FFTW3 */ 385 #endif /* using OOURA */ 294 386 } 295 387 … … 314 406 output->data[i] = s->out[i]*renorm; 315 407 } 316 #else /* HAVE_FFTW3 */ 317 # ifdef HAVE_ACCELERATE// using ACCELERATE408 409 #elif defined HAVE_ACCELERATE // using ACCELERATE 318 410 // convert from real imag [ r0, r1, ..., rN, iN-1, .., i2, i1] 319 411 // to vDSP packed format [ r0, rN, r1, i1, ..., rN-1, iN-1 ] … … 333 425 smpl_t scale = 1.0 / s->winsize; 334 426 aubio_vDSP_vsmul(output->data, 1, &scale, output->data, 1, s->fft_size); 427 428 #elif defined HAVE_INTEL_IPP // using Intel IPP 429 430 // convert from real imag [ r0, 0, ..., rN, iN-1, .., i2, i1, iN-1] to complex format 431 s->complexOut[0].re = compspec->data[0]; 432 s->complexOut[0].im = 0; 433 s->complexOut[s->fft_size / 2].re = compspec->data[s->fft_size / 2]; 434 s->complexOut[s->fft_size / 2].im = 0.0; 435 for (i = 1; i < s->fft_size / 2; i++) { 436 s->complexOut[i].re = compspec->data[i]; 437 s->complexOut[i].im = compspec->data[s->fft_size - i]; 438 } 439 // apply fft 440 aubio_ippsFFTInv_CCSToR((const aubio_IppFloat *)s->complexOut, output->data, s->fftSpec, s->memBuffer); 441 // apply scaling 442 aubio_ippsMulC(output->data, 1.0 / s->winsize, output->data, s->fft_size); 443 335 444 #else // using OOURA 336 445 smpl_t scale = 2.0 / s->winsize; … … 345 454 output->data[i] = s->out[i] * scale; 346 455 } 347 #endif /* HAVE_ACCELERATE */ 348 #endif /* HAVE_FFTW3 */ 456 #endif 349 457 } 350 458 … … 366 474 spectrum->phas[0] = 0.; 367 475 } 476 #if defined(HAVE_INTEL_IPP) 477 // convert from real imag [ r0, r1, ..., rN, iN-1, ..., i2, i1, i0] 478 // to [ r0, r1, ..., rN, i0, i1, i2, ..., iN-1] 479 for (i = 1; i < spectrum->length / 2; i++) { 480 ELEM_SWAP(compspec->data[compspec->length - i], 481 compspec->data[spectrum->length + i - 1]); 482 } 483 aubio_ippsAtan2(compspec->data + spectrum->length, 484 compspec->data + 1, spectrum->phas + 1, spectrum->length - 1); 485 // revert the imaginary part back again 486 for (i = 1; i < spectrum->length / 2; i++) { 487 ELEM_SWAP(compspec->data[spectrum->length + i - 1], 488 compspec->data[compspec->length - i]); 489 } 490 #else 368 491 for (i=1; i < spectrum->length - 1; i++) { 369 492 spectrum->phas[i] = ATAN2(compspec->data[compspec->length-i], 370 493 compspec->data[i]); 371 494 } 495 #endif 372 496 if (compspec->data[compspec->length/2] < 0) { 373 497 spectrum->phas[spectrum->length - 1] = PI; -
src/wscript_build
r25cf957 r20c8769 4 4 uselib += ['M'] 5 5 uselib += ['FFTW3', 'FFTW3F'] 6 uselib += ['INTEL_IPP'] 6 7 uselib += ['SAMPLERATE'] 7 8 uselib += ['SNDFILE'] -
wscript
r25cf957 r20c8769 51 51 help_str = 'compile with fftw3 instead of ooura', 52 52 help_disable_str = 'do not compile with fftw3') 53 add_option_enable_disable(ctx, 'intelipp', default = False, 54 help_str = 'use Intel IPP libraries (auto)', 55 help_disable_str = 'do not use Intel IPP libraries') 53 56 add_option_enable_disable(ctx, 'complex', default = False, 54 57 help_str ='compile with C99 complex', … … 156 159 # configure warnings 157 160 ctx.env.CFLAGS += ['/W4', '/D_CRT_SECURE_NO_WARNINGS'] 161 # ignore "possible loss of data" warnings 162 ctx.env.CFLAGS += ['/wd4305', '/wd4244', '/wd4245', '/wd4267'] 163 # ignore "unreferenced formal parameter" warnings 164 ctx.env.CFLAGS += ['/wd4100'] 158 165 # set optimization level and runtime libs 159 166 if (ctx.options.build_type == "release"): … … 245 252 246 253 # tell emscripten functions we want to expose 247 from python.lib.gen_external import get_c_declarations, get_cpp_objects_from_c_declarations, get_all_func_names_from_lib, generate_lib_from_c_declarations 254 from python.lib.gen_external import get_c_declarations, \ 255 get_cpp_objects_from_c_declarations, get_all_func_names_from_lib, \ 256 generate_lib_from_c_declarations 248 257 c_decls = get_c_declarations(usedouble=False) # emscripten can't use double 249 258 objects = list(get_cpp_objects_from_c_declarations(c_decls)) … … 283 292 else: 284 293 ctx.msg('Checking if complex.h is enabled', 'no') 294 295 # check for Intel IPP 296 if (ctx.options.enable_intelipp != False): 297 has_ipp_headers = ctx.check(header_name=['ippcore.h', 'ippvm.h', 'ipps.h'], 298 mandatory = False) 299 has_ipp_libs = ctx.check(lib=['ippcore', 'ippvm', 'ipps'], 300 uselib_store='INTEL_IPP', mandatory = False) 301 if (has_ipp_headers and has_ipp_libs): 302 ctx.msg('Checking if Intel IPP is available', 'yes') 303 ctx.define('HAVE_INTEL_IPP', 1) 304 if ctx.env.CC_NAME == 'msvc': 305 # force linking multi-threaded static IPP libraries on Windows with msvc 306 ctx.define('_IPP_SEQUENTIAL_STATIC', 1) 307 else: 308 ctx.msg('Checking if Intel IPP is available', 'no') 285 309 286 310 # check for fftw3 … … 307 331 ctx.define('HAVE_FFTW3', 1) 308 332 309 # fftw not enabled, use vDSP or ooura333 # fftw not enabled, use vDSP, intelIPP or ooura 310 334 if 'HAVE_FFTW3F' in ctx.env.define_key: 311 335 ctx.msg('Checking for FFT implementation', 'fftw3f') … … 314 338 elif 'HAVE_ACCELERATE' in ctx.env.define_key: 315 339 ctx.msg('Checking for FFT implementation', 'vDSP') 340 elif 'HAVE_INTEL_IPP' in ctx.env.define_key: 341 ctx.msg('Checking for FFT implementation', 'Intel IPP') 316 342 else: 317 343 ctx.msg('Checking for FFT implementation', 'ooura')
Note: See TracChangeset
for help on using the changeset viewer.