Changeset 19058 for trunk/psLib/src/fft/psVectorFFT.c
- Timestamp:
- Aug 13, 2008, 5:23:13 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/fft/psVectorFFT.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/fft/psVectorFFT.c
r11719 r19058 6 6 * @author Robert DeSonia, MHPCC 7 7 * 8 * @version $Revision: 1. 39$ $Name: not supported by cvs2svn $9 * @date $Date: 200 7-02-09 00:45:51$8 * @version $Revision: 1.40 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2008-08-14 03:23:13 $ 10 10 * 11 11 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 27 27 #include "psLogMsg.h" 28 28 #include "psConstants.h" 29 #include "psThread.h" 30 #include "psFFT.h" 29 31 #include "psVectorFFT.h" 32 33 // Lock FFTW access 34 #define FFTW_LOCK \ 35 if (threaded) { \ 36 psFFTLock(); \ 37 } 38 // Unlock FFTW access 39 #define FFTW_UNLOCK \ 40 if (threaded) { \ 41 psFFTUnlock(); \ 42 } 30 43 31 44 #define FFTW_PLAN_RIGOR FFTW_ESTIMATE // How rigorous the FFTW planning is … … 40 53 PS_ASSERT_PTR_NON_NULL(imag, false); 41 54 55 bool threaded = psThreadPoolSize(); // Are we running threaded? 56 42 57 // Make sure the system-level wisdom information is imported. 58 FFTW_LOCK; 43 59 if (!fftwWisdomImported) { 44 60 fftwf_import_system_wisdom(); 45 61 fftwWisdomImported = true; 46 62 } 63 FFTW_UNLOCK; 47 64 48 65 long num = in->n; // Number of elements 49 66 50 67 // Do the FFT 68 FFTW_LOCK; 51 69 fftwf_complex *out = fftwf_malloc((num/2 + 1) * sizeof(fftwf_complex)); // Output data 52 70 fftwf_plan plan = fftwf_plan_dft_r2c_1d(num, in->data.F32, out, FFTW_PLAN_RIGOR); 71 FFTW_UNLOCK; 72 53 73 fftwf_execute(plan); 74 75 FFTW_LOCK; 54 76 fftwf_destroy_plan(plan); 77 FFTW_UNLOCK; 55 78 56 79 // Pull the real and imaginary parts out … … 69 92 #endif 70 93 } 94 95 FFTW_LOCK; 71 96 fftwf_free(out); 97 FFTW_UNLOCK; 72 98 73 99 return true; … … 83 109 PS_ASSERT_PTR_NON_NULL(out, false); 84 110 111 bool threaded = psThreadPoolSize(); // Are we running threaded? 112 85 113 // Make sure the system-level wisdom information is imported. 114 FFTW_LOCK; 86 115 if (!fftwWisdomImported) { 87 116 fftwf_import_system_wisdom(); 88 117 fftwWisdomImported = true; 89 118 } 119 FFTW_UNLOCK; 90 120 91 121 long num = real->n; // Number of elements 92 122 93 123 // Stuff the real and imaginary parts in 124 FFTW_LOCK; 94 125 fftwf_complex *in = fftwf_malloc(num * sizeof(fftwf_complex)); // Input data 126 FFTW_UNLOCK; 95 127 for (int i = 0; i < num; i++) { 96 128 #if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I) … … 107 139 // Do the FFT 108 140 *out = psVectorRecycle(*out, origNum, PS_TYPE_F32); 141 FFTW_LOCK; 109 142 fftwf_plan plan = fftwf_plan_dft_c2r_1d(origNum, in, (*out)->data.F32, FFTW_PLAN_RIGOR); 143 FFTW_UNLOCK; 144 110 145 fftwf_execute(plan); 146 147 FFTW_LOCK; 111 148 fftwf_destroy_plan(plan); 112 113 149 fftwf_free(in); 150 FFTW_UNLOCK; 114 151 115 152 return true;
Note:
See TracChangeset
for help on using the changeset viewer.
