Changeset 8244
- Timestamp:
- 04/22/08 16:24:16
- Files:
-
- gnuradio/trunk/config/Makefile.am (modified) (1 diff)
- gnuradio/trunk/config/grc_gcell.m4 (modified) (1 diff)
- gnuradio/trunk/config/grc_gr_gcell.m4 (copied) (copied from gnuradio/branches/developers/eb/gcell/config/grc_gr_gcell.m4)
- gnuradio/trunk/configure.ac (modified) (1 diff)
- gnuradio/trunk/gcell/src/lib/runtime/Makefile.am (modified) (2 diffs)
- gnuradio/trunk/gcell/src/lib/runtime/gc_aligned_alloc.cc (copied) (copied from gnuradio/branches/developers/eb/gcell/gcell/src/lib/runtime/gc_aligned_alloc.cc)
- gnuradio/trunk/gcell/src/lib/runtime/gc_aligned_alloc.h (copied) (copied from gnuradio/branches/developers/eb/gcell/gcell/src/lib/runtime/gc_aligned_alloc.h)
- gnuradio/trunk/gcell/src/lib/runtime/gc_job_manager.cc (modified) (2 diffs)
- gnuradio/trunk/gcell/src/lib/runtime/gc_job_manager.h (modified) (4 diffs)
- gnuradio/trunk/gcell/src/lib/runtime/gc_job_manager_impl.cc (modified) (8 diffs)
- gnuradio/trunk/gcell/src/lib/wrapper/gcp_fft_1d_r2.cc (modified) (4 diffs)
- gnuradio/trunk/gcell/src/lib/wrapper/gcp_fft_1d_r2.h (modified) (1 diff)
- gnuradio/trunk/gcell/src/lib/wrapper/qa_gcp_fft_1d_r2.cc (modified) (4 diffs)
- gnuradio/trunk/gcell/src/lib/wrapper/spu/gcs_fft_1d_r2.c (modified) (2 diffs)
- gnuradio/trunk/gnuradio-core/src/lib/general/Makefile.am (modified) (2 diffs)
- gnuradio/trunk/gnuradio-core/src/lib/general/gr_fft_vcc.cc (modified) (4 diffs)
- gnuradio/trunk/gnuradio-core/src/lib/general/gr_fft_vcc.h (modified) (2 diffs)
- gnuradio/trunk/gnuradio-core/src/lib/general/gr_fft_vcc.i (modified) (2 diffs)
- gnuradio/trunk/gnuradio-core/src/lib/general/gr_fft_vcc_fftw.cc (copied) (copied from gnuradio/branches/developers/eb/gcell/gnuradio-core/src/lib/general/gr_fft_vcc_fftw.cc)
- gnuradio/trunk/gnuradio-core/src/lib/general/gr_fft_vcc_fftw.h (copied) (copied from gnuradio/branches/developers/eb/gcell/gnuradio-core/src/lib/general/gr_fft_vcc_fftw.h)
- gnuradio/trunk/gnuradio-core/src/lib/general/gr_math.h (modified) (1 diff)
- gnuradio/trunk/gnuradio-core/src/python/gnuradio/gr/Makefile.am (modified) (1 diff)
- gnuradio/trunk/gnuradio-core/src/python/gnuradio/gr/qa_fft.py (copied) (copied from gnuradio/branches/developers/eb/gcell/gnuradio-core/src/python/gnuradio/gr/qa_fft.py)
- gnuradio/trunk/gr-gcell (copied) (copied from gnuradio/branches/developers/eb/gcell/gr-gcell)
- gnuradio/trunk/gr-gcell/Makefile.am (copied) (copied from gnuradio/branches/developers/eb/gcell/gr-gcell/Makefile.am)
- gnuradio/trunk/gr-gcell/src (copied) (copied from gnuradio/branches/developers/eb/gcell/gr-gcell/src)
- gnuradio/trunk/gr-gcell/src/Makefile.am (copied) (copied from gnuradio/branches/developers/eb/gcell/gr-gcell/src/Makefile.am)
- gnuradio/trunk/gr-gcell/src/examples (copied) (copied from gnuradio/branches/developers/eb/gcell/gr-gcell/src/examples)
- gnuradio/trunk/gr-gcell/src/examples/Makefile.am (copied) (copied from gnuradio/branches/developers/eb/gcell/gr-gcell/src/examples/Makefile.am)
- gnuradio/trunk/gr-gcell/src/gc_job_manager.i (copied) (copied from gnuradio/branches/developers/eb/gcell/gr-gcell/src/gc_job_manager.i)
- gnuradio/trunk/gr-gcell/src/gcell.i (copied) (copied from gnuradio/branches/developers/eb/gcell/gr-gcell/src/gcell.i)
- gnuradio/trunk/gr-gcell/src/gcell_fft_vcc.cc (copied) (copied from gnuradio/branches/developers/eb/gcell/gr-gcell/src/gcell_fft_vcc.cc)
- gnuradio/trunk/gr-gcell/src/gcell_fft_vcc.h (copied) (copied from gnuradio/branches/developers/eb/gcell/gr-gcell/src/gcell_fft_vcc.h)
- gnuradio/trunk/gr-gcell/src/gcell_fft_vcc.i (copied) (copied from gnuradio/branches/developers/eb/gcell/gr-gcell/src/gcell_fft_vcc.i)
- gnuradio/trunk/gr-gcell/src/qa_fft.py (copied) (copied from gnuradio/branches/developers/eb/gcell/gr-gcell/src/qa_fft.py)
- gnuradio/trunk/gr-gcell/src/run_tests.in (copied) (copied from gnuradio/branches/developers/eb/gcell/gr-gcell/src/run_tests.in)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
gnuradio/trunk/config/Makefile.am
r8086 r8244 43 43 grc_gr_audio_windows.m4 \ 44 44 grc_gr_comedi.m4 \ 45 grc_gr_gcell.m4 \ 45 46 grc_gr_gpio.m4 \ 46 47 grc_gr_gsm_fr_vocoder.m4 \ gnuradio/trunk/config/grc_gcell.m4
r8209 r8244 66 66 AC_SUBST(gcell_spu_INCLUDES) 67 67 AC_SUBST(gcell_spu_LA) 68 69 dnl kludge up initial swig dependency files 70 AC_CONFIG_COMMANDS([swig_gcell_deps], [ 71 touch gr-gcell/src/gcell.d 72 ]) 68 73 fi 69 74 gnuradio/trunk/configure.ac
r8086 r8244 246 246 GRC_USRP 247 247 GRC_GR_USRP dnl this must come after GRC_USRP 248 GRC_GR_GCELL dnl this must come after GRC_GCELL and GRC_GNURADIO_CORE 248 249 GRC_GR_MSDD6000 249 250 GRC_GR_AUDIO_ALSA gnuradio/trunk/gcell/src/lib/runtime/Makefile.am
r8209 r8244 33 33 34 34 libruntime_la_SOURCES = \ 35 gc_aligned_alloc.cc \ 35 36 gc_job_manager.cc \ 36 37 gc_job_manager_impl.cc \ … … 47 48 48 49 gcellinclude_HEADERS = \ 50 gc_aligned_alloc.h \ 49 51 gc_job_manager.h 50 52 gnuradio/trunk/gcell/src/lib/runtime/gc_job_manager.cc
r8209 r8244 30 30 31 31 static boost::weak_ptr<gc_job_manager> s_singleton; 32 33 34 // custom deleter of gc_job_desc allocated via alloc_job_desc_sptr 35 class job_desc_deleter { 36 gc_job_manager_sptr d_mgr; 37 public: 38 job_desc_deleter(gc_job_manager_sptr mgr) : d_mgr(mgr) {} 39 40 void operator()(gc_job_desc *jd) { 41 d_mgr->free_job_desc(jd); 42 } 43 }; 44 32 45 33 46 … … 71 84 return gc_job_manager_sptr(s_singleton); 72 85 } 86 87 gc_job_desc_sptr 88 gc_job_manager::make_jd_sptr(gc_job_manager_sptr mgr, gc_job_desc *jd) 89 { 90 return gc_job_desc_sptr(jd, job_desc_deleter(mgr)); 91 } 92 93 gc_job_desc_sptr 94 gc_job_manager::alloc_job_desc(gc_job_manager_sptr mgr) 95 { 96 return make_jd_sptr(mgr, mgr->alloc_job_desc()); 97 } 98 73 99 74 100 // ------------------------------------------------------------------------ gnuradio/trunk/gcell/src/lib/runtime/gc_job_manager.h
r8209 r8244 34 34 typedef boost::shared_ptr<gc_job_manager> gc_job_manager_sptr; 35 35 typedef boost::shared_ptr<spe_program_handle_t> spe_program_handle_sptr; 36 typedef boost::shared_ptr<gc_job_desc> gc_job_desc_sptr; 36 37 37 38 /*! … … 87 88 gc_jm_options() : 88 89 max_jobs(0), max_client_threads(0), nspes(0), 89 gang_schedule( true), use_affinity(false),90 gang_schedule(false), use_affinity(false), 90 91 enable_logging(false), log2_nlog_entries(12) 92 { 93 } 94 95 gc_jm_options(spe_program_handle_sptr program_handle_, 96 unsigned int nspes_ = 0) : 97 max_jobs(0), max_client_threads(0), nspes(nspes_), 98 gang_schedule(false), use_affinity(false), 99 enable_logging(false), log2_nlog_entries(12), 100 program_handle(program_handle_) 91 101 { 92 102 } … … 237 247 virtual std::vector<std::string> proc_names() = 0; 238 248 249 virtual void set_debug(int debug); 250 virtual int debug(); 251 252 /* ----- static methods ----- */ 253 239 254 /*! 240 255 * \brief Set the singleton gc_job_manager instance. … … 257 272 static gc_job_manager_sptr singleton(); 258 273 259 260 virtual void set_debug(int debug); 261 virtual int debug(); 274 /*! 275 * \brief return a boost::shared_ptr to a job descriptor. 276 */ 277 static gc_job_desc_sptr make_jd_sptr(gc_job_manager_sptr mgr, gc_job_desc *jd); 278 279 /*! 280 * \brief allocate a job descriptor and return a boost::shared_ptr to it. 281 */ 282 static gc_job_desc_sptr alloc_job_desc(gc_job_manager_sptr mgr); 262 283 }; 263 284 gnuradio/trunk/gcell/src/lib/runtime/gc_job_manager_impl.cc
r8209 r8244 26 26 #include <gc_mbox.h> 27 27 #include <gc_proc_def_utils.h> 28 28 #include <gc_aligned_alloc.h> 29 29 #include <stdio.h> 30 30 #include <stdexcept> … … 84 84 { 85 85 ((gc_client_thread_info *) p)->d_free = 1; 86 }87 88 /*89 * Return pointer to cache-aligned chunk of storage of size size bytes.90 * Throw if can't allocate memory. The storage should be freed91 * with "free" when done. The memory is initialized to zero.92 */93 static void *94 aligned_alloc(size_t size, size_t alignment = CACHE_LINE_SIZE)95 {96 void *p = 0;97 if (posix_memalign(&p, alignment, size) != 0){98 perror("posix_memalign");99 throw std::runtime_error("memory");100 }101 memset(p, 0, size); // zero the memory102 return p;103 86 } 104 87 … … 197 180 // initalize the job queue 198 181 199 d_queue = (gc_jd_queue_t *) aligned_alloc(sizeof(gc_jd_queue_t));182 d_queue = (gc_jd_queue_t *) gc_aligned_alloc(sizeof(gc_jd_queue_t), CACHE_LINE_SIZE); 200 183 _d_queue_boost = 201 184 boost::shared_ptr<void>((void *) d_queue, free_deleter()); … … 209 192 assert(sizeof(gc_spu_args_t) % 16 == 0); 210 193 d_spu_args = 211 (gc_spu_args_t *) aligned_alloc(MAX_SPES * sizeof(gc_spu_args_t), 16);194 (gc_spu_args_t *) gc_aligned_alloc(MAX_SPES * sizeof(gc_spu_args_t), 16); 212 195 _d_spu_args_boost = 213 196 boost::shared_ptr<void>((void *) d_spu_args, free_deleter()); … … 216 199 assert(sizeof(gc_comp_info_t) % CACHE_LINE_SIZE == 0); 217 200 d_comp_info = 218 (gc_comp_info_t *) aligned_alloc(2 * MAX_SPES * sizeof(gc_comp_info_t),219 CACHE_LINE_SIZE);201 (gc_comp_info_t *) gc_aligned_alloc(2 * MAX_SPES * sizeof(gc_comp_info_t), 202 CACHE_LINE_SIZE); 220 203 _d_comp_info_boost = 221 204 boost::shared_ptr<void>((void *) d_comp_info, free_deleter()); … … 270 253 // initalize the free list of job descriptors 271 254 272 d_free_list = (gc_jd_stack_t *) aligned_alloc(sizeof(gc_jd_stack_t));255 d_free_list = (gc_jd_stack_t *) gc_aligned_alloc(sizeof(gc_jd_stack_t), CACHE_LINE_SIZE); 273 256 // This ensures that the memory associated with d_free_list is 274 257 // automatically freed in the destructor or if an exception occurs … … 284 267 285 268 // Initialize the array of job descriptors. 286 d_jd = (gc_job_desc_t *) aligned_alloc(sizeof(d_jd[0]) * d_options.max_jobs);269 d_jd = (gc_job_desc_t *) gc_aligned_alloc(sizeof(d_jd[0]) * d_options.max_jobs, CACHE_LINE_SIZE); 287 270 _d_jd_boost = boost::shared_ptr<void>((void *) d_jd, free_deleter()); 288 271 … … 318 301 // allocate all bitvectors in a single cache-aligned chunk 319 302 size_t nlongs = d_bvlen * d_options.max_client_threads; 320 void *p = aligned_alloc(nlongs * sizeof(unsigned long));303 void *p = gc_aligned_alloc(nlongs * sizeof(unsigned long), CACHE_LINE_SIZE); 321 304 _d_all_bitvectors = boost::shared_ptr<void>(p, free_deleter()); 322 305 gnuradio/trunk/gcell/src/lib/wrapper/gcp_fft_1d_r2.cc
r8211 r8244 31 31 gc_proc_id_t proc_id, 32 32 unsigned log2_fft_length, 33 bool forward,33 bool shift, 34 34 std::complex<float> *out, 35 35 const std::complex<float> *in, 36 const std::complex<float> *W) 36 const std::complex<float> *twiddle, 37 const float *window) 37 38 { 38 39 jd->proc_id = proc_id; 39 40 jd->input.nargs = 2; 40 41 jd->output.nargs = 0; 41 jd->eaa.nargs = 3;42 jd->eaa.nargs = 4; 42 43 43 44 jd->input.arg[0].u32 = log2_fft_length; 44 jd->input.arg[1].u32 = forward;45 jd->input.arg[1].u32 = shift; 45 46 unsigned int fft_length = 1 << log2_fft_length; 46 47 … … 53 54 jd->eaa.arg[1].get_size = sizeof(std::complex<float>) * fft_length; 54 55 55 jd->eaa.arg[2].ea_addr = ptr_to_ea(const_cast<std::complex<float>*>( W));56 jd->eaa.arg[2].ea_addr = ptr_to_ea(const_cast<std::complex<float>*>(twiddle)); 56 57 jd->eaa.arg[2].direction = GCJD_DMA_GET; 57 58 jd->eaa.arg[2].get_size = sizeof(std::complex<float>) * fft_length / 4; 59 60 jd->eaa.arg[3].ea_addr = ptr_to_ea(const_cast<float*>(window)); 61 jd->eaa.arg[3].direction = GCJD_DMA_GET; 62 if (window == 0) 63 jd->eaa.arg[3].get_size = 0; 64 else 65 jd->eaa.arg[3].get_size = sizeof(float) * fft_length; 58 66 } 59 67 60 61 gc_job_desc *68 69 gc_job_desc_sptr 62 70 gcp_fft_1d_r2_submit(gc_job_manager_sptr mgr, 63 71 unsigned int log2_fft_length, 64 72 bool forward, 73 bool shift, 65 74 std::complex<float> *out, 66 75 const std::complex<float> *in, 67 const std::complex<float> *W) 76 const std::complex<float> *twiddle, 77 const float *window) 68 78 { 69 79 unsigned int fft_length = 1 << log2_fft_length; … … 75 85 if ((intptr_t)in & 0xf) 76 86 throw gc_bad_align("in"); 77 if ((intptr_t)W & 0xf) 78 throw gc_bad_align("W"); 87 if ((intptr_t)twiddle & 0xf) 88 throw gc_bad_align("twiddle"); 89 if ((intptr_t)window & 0xf) 90 throw gc_bad_align("window"); 79 91 80 gc_proc_id_t fft_id = mgr->lookup_proc("fft_1d_r2"); 81 gc_job_desc *jd = mgr->alloc_job_desc(); 82 init_jd(jd, fft_id, log2_fft_length, forward, out, in, W); 83 if (!mgr->submit_job(jd)){ 92 std::string proc_name; 93 if (forward) 94 proc_name = "fwd_fft_1d_r2"; 95 else 96 proc_name = "inv_fft_1d_r2"; 97 98 gc_proc_id_t fft_id = mgr->lookup_proc(proc_name); 99 gc_job_desc_sptr jd = gc_job_manager::alloc_job_desc(mgr); 100 init_jd(jd.get(), fft_id, log2_fft_length, shift, out, in, twiddle, window); 101 if (!mgr->submit_job(jd.get())){ 84 102 gc_job_status_t s = jd->status; 85 mgr->free_job_desc(jd); 86 throw gc_bad_submit("fft_1d_r2", s); 103 throw gc_bad_submit(proc_name, s); 87 104 } 88 105 return jd; … … 90 107 91 108 void 92 gcp_fft_1d_r2_twiddle(unsigned int log2_fft_length, std::complex<float> * W)109 gcp_fft_1d_r2_twiddle(unsigned int log2_fft_length, std::complex<float> *twiddle) 93 110 { 94 111 unsigned int n = 1 << log2_fft_length; 95 112 96 W[0].real() = 1.0;97 W[0].imag() = 0.0;113 twiddle[0].real() = 1.0; 114 twiddle[0].imag() = 0.0; 98 115 for (unsigned i=1; i < n/4; i++){ 99 W[i].real() = cos(i * 2*M_PI/n);100 W[n/4 - i].imag() = -W[i].real();116 twiddle[i].real() = cos(i * 2*M_PI/n); 117 twiddle[n/4 - i].imag() = -twiddle[i].real(); 101 118 } 102 119 } gnuradio/trunk/gcell/src/lib/wrapper/gcp_fft_1d_r2.h
r8211 r8244 26 26 27 27 /*! 28 * \brief Submit a job that computes the forward or reverse FFT.28 * \brief Submit a job that computes the forward or inverse FFT. 29 29 * 30 30 * \param mgr is the job manager instance 31 31 * \param log2_fft_length is the log2 of the fft_length (4 <= x <= 12). 32 * \param forward is true to compute the forward xform 32 * \param forward is true to compute the forward transform, else the inverse. 33 * \param shift indicates if an "fftshift" should be applied to the output data 33 34 * \param out is the fft_length output from FFT (must be 16-byte aligned). 34 35 * \param in is the fft_length input to FFT (must be 16-byte aligned). 35 * \param W is fft_length/4 twiddle factor input to FFT (must be 16-byte aligned). 36 * \param twiddle is fft_length/4 twiddle factor input to FFT (must be 16-byte aligned). 37 * \param window is the window to be applied to the input data. 38 * The window length must be either 0 or fft_length (must be 16-byte aligned). 36 39 * 37 * Returns a job descriptor which should be passed to wait_job*.40 * Returns a shared_ptr to a job descriptor which should be passed to wait_job*. 38 41 * Throws an exception in the event of a problem. 42 * This uses the FFTW conventions for scaling. That is, neither the forward nor inverse 43 * are scaled by 1/fft_length. 39 44 */ 40 gc_job_desc *45 gc_job_desc_sptr 41 46 gcp_fft_1d_r2_submit(gc_job_manager_sptr mgr, 42 47 unsigned int log2_fft_length, 43 48 bool forward, 49 bool shift, 44 50 std::complex<float> *out, 45 51 const std::complex<float> *in, 46 const std::complex<float> *W); 52 const std::complex<float> *twiddle, 53 const float *window); 47 54 48 55 /*! gnuradio/trunk/gcell/src/lib/wrapper/qa_gcp_fft_1d_r2.cc
r8211 r8244 81 81 } 82 82 83 // test reverse FFT83 // test inverse FFT 84 84 void 85 85 qa_gcp_fft_1d_r2::t2() … … 102 102 qa_gcp_fft_1d_r2::t3() 103 103 { 104 // FIXME Test fwd and inv with windowing option 104 105 } 105 106 … … 107 108 qa_gcp_fft_1d_r2::t4() 108 109 { 110 // FIXME Test fwd and inv with shift option 109 111 } 110 112 … … 179 181 // ------------------------------------------------------------------------ 180 182 // compute the answer on the cell 181 gc_job_desc *jd = gcp_fft_1d_r2_submit(mgr, log2_fft_size, forward,182 cell_out, cell_in, cell_twiddle);183 if (!mgr->wait_job(jd )){183 gc_job_desc_sptr jd = gcp_fft_1d_r2_submit(mgr, log2_fft_size, forward, false, 184 cell_out, cell_in, cell_twiddle, 0); 185 if (!mgr->wait_job(jd.get())){ 184 186 fprintf(stderr, "wait_job failed: %s\n", gc_job_status_string(jd->status).c_str()); 185 mgr->free_job_desc(jd);186 187 CPPUNIT_ASSERT(0); 187 188 } 188 mgr->free_job_desc(jd);189 189 190 190 // ------------------------------------------------------------------------ gnuradio/trunk/gcell/src/lib/wrapper/spu/gcs_fft_1d_r2.c
r8211 r8244 22 22 #include <gc_declare_proc.h> 23 23 #include <libfft.h> 24 #include <assert.h> 24 25 25 26 /* … … 36 37 37 38 static void 38 gcs_f ft_1d_r2(const gc_job_direct_args_t *input,39 gc_job_direct_args_t *output __attribute__((unused)),40 const gc_job_ea_args_t *eaa)39 gcs_fwd_fft_1d_r2(const gc_job_direct_args_t *input, 40 gc_job_direct_args_t *output __attribute__((unused)), 41 const gc_job_ea_args_t *eaa) 41 42 { 42 vector float *out = (vector float *) eaa->arg[0].ls_addr; 43 vector float *in = (vector float *) eaa->arg[1].ls_addr; 44 vector float *W = (vector float *) eaa->arg[2].ls_addr; 43 vector float *out = (vector float *) eaa->arg[0].ls_addr; // complex 44 vector float *in = (vector float *) eaa->arg[1].ls_addr; // complex 45 vector float *twiddle = (vector float *) eaa->arg[2].ls_addr; // complex 46 vector float *window = (vector float *) eaa->arg[3].ls_addr; // float 47 45 48 int log2_fft_length = input->arg[0].u32; 46 int forward = input->arg[1].u32; // non-zero if forward xform49 int shift = input->arg[1].u32; // non-zero if we should apply fftshift 47 50 48 if (forward){ 49 fft_1d_r2(out, in, W, log2_fft_length); 51 if (eaa->arg[3].get_size){ // apply window 52 // FIXME pointwise multiply in *= window 53 assert(0); 50 54 } 51 else { 52 conjugate_vector(in, 1 << (log2_fft_length - 1)); 53 fft_1d_r2(out, in, W, log2_fft_length); 54 conjugate_vector(out, 1 << (log2_fft_length - 1)); 55 56 fft_1d_r2(out, in, twiddle, log2_fft_length); 57 58 if (shift){ 59 // FIXME apply "fftshift" to output data in-place 60 assert(0); 55 61 } 56 62 } 57 63 58 GC_DECLARE_PROC(gcs_fft_1d_r2, "fft_1d_r2"); 64 GC_DECLARE_PROC(gcs_fwd_fft_1d_r2, "fwd_fft_1d_r2"); 65 66 static void 67 gcs_inv_fft_1d_r2(const gc_job_direct_args_t *input, 68 gc_job_direct_args_t *output __attribute__((unused)), 69 const gc_job_ea_args_t *eaa) 70 { 71 vector float *out = (vector float *) eaa->arg[0].ls_addr; // complex 72 vector float *in = (vector float *) eaa->arg[1].ls_addr; // complex 73 vector float *twiddle = (vector float *) eaa->arg[2].ls_addr; // complex 74 vector float *window = (vector float *) eaa->arg[3].ls_addr; // float 75 76 int log2_fft_length = input->arg[0].u32; 77 int shift = input->arg[1].u32; // non-zero if we should apply fftshift 78 79 if (eaa->arg[3].get_size){ // apply window 80 // FIXME pointwise multiply in *= window 81 assert(0); 82 } 83 84 if (shift){ 85 // FIXME apply "fftshift" to input data in-place 86 assert(0); 87 } 88 89 conjugate_vector(in, 1 << (log2_fft_length - 1)); 90 fft_1d_r2(out, in, twiddle, log2_fft_length); 91 conjugate_vector(out, 1 << (log2_fft_length - 1)); 92 } 93 94 GC_DECLARE_PROC(gcs_inv_fft_1d_r2, "inv_fft_1d_r2"); gnuradio/trunk/gnuradio-core/src/lib/general/Makefile.am
r8206 r8244 73 73 gr_feval.cc \ 74 74 gr_fft_vcc.cc \ 75 gr_fft_vcc_fftw.cc \ 75 76 gr_fft_vfc.cc \ 76 77 gr_firdes.cc \ … … 216 217 gr_feval.h \ 217 218 gr_fft_vcc.h \ 219 gr_fft_vcc_fftw.h \ 218 220 gr_fft_vfc.h \ 219 221 gr_firdes.h \ gnuradio/trunk/gnuradio-core/src/lib/general/gr_fft_vcc.cc
r6044 r8244 1 1 /* -*- c++ -*- */ 2 2 /* 3 * Copyright 2004,2007 Free Software Foundation, Inc.3 * Copyright 2004,2007,2008 Free Software Foundation, Inc. 4 4 * 5 5 * This file is part of GNU Radio … … 25 25 #endif 26 26 27 #include <gr_fft_vcc.h> 27 #include <gr_fft_vcc.h> // abstract class 28 #include <gr_fft_vcc_fftw.h> // concrete class 28 29 #include <gr_io_signature.h> 29 30 #include <gri_fft.h> … … 31 32 32 33 gr_fft_vcc_sptr 33 gr_make_fft_vcc (int fft_size, bool forward,const std::vector<float> window, bool shift)34 gr_make_fft_vcc (int fft_size, bool forward,const std::vector<float> &window, bool shift) 34 35 { 35 return gr_ fft_vcc_sptr (new gr_fft_vcc (fft_size, forward, window, shift));36 return gr_make_fft_vcc_fftw(fft_size, forward, window, shift); 36 37 } 37 38 38 gr_fft_vcc::gr_fft_vcc (int fft_size, bool forward, const std::vector<float> window, bool shift) 39 : gr_sync_block ("fft_vcc", 39 gr_fft_vcc::gr_fft_vcc (const std::string &name, 40 int fft_size, bool forward, const std::vector<float> &window, 41 bool shift) 42 : gr_sync_block (name, 40 43 gr_make_io_signature (1, 1, fft_size * sizeof (gr_complex)), 41 44 gr_make_io_signature (1, 1, fft_size * sizeof (gr_complex))), 42 45 d_fft_size(fft_size), d_forward(forward), d_shift(shift) 43 46 { 44 d_fft = new gri_fft_complex (d_fft_size, forward);45 46 47 set_window(window); 47 48 48 } 49 49 50 50 gr_fft_vcc::~gr_fft_vcc () 51 51 { 52 delete d_fft;53 }54 55 int56 gr_fft_vcc::work (int noutput_items,57 gr_vector_const_void_star &input_items,58 gr_vector_void_star &output_items)59 {60 const gr_complex *in = (const gr_complex *) input_items[0];61 gr_complex *out = (gr_complex *) output_items[0];62 63 unsigned int input_data_size = input_signature()->sizeof_stream_item (0);64 unsigned int output_data_size = output_signature()->sizeof_stream_item (0);65 66 int count = 0;67 68 while (count++ < noutput_items){69 70 // copy input into optimally aligned buffer71 72 if (d_window.size()){73 gr_complex *dst = d_fft->get_inbuf();74 for (unsigned int i = 0; i < d_fft_size; i++) // apply window75 dst[i] = in[i] * d_window[i];76 }77 else {78 if(!d_forward && d_shift) { // apply an ifft shift on the data79 gr_complex *dst = d_fft->get_inbuf();80 unsigned int len = (unsigned int)(floor(d_fft_size/2.0)); // half length of complex array81 memcpy(&dst[0], &in[len], sizeof(gr_complex)*(d_fft_size - len));82 memcpy(&dst[d_fft_size - len], &in[0], sizeof(gr_complex)*len);83 }84 else {85 memcpy (d_fft->get_inbuf(), in, input_data_size);86 }87 }88 89 // compute the fft90 d_fft->execute ();91 92 // copy result to our output93 if(d_forward && d_shift) { // apply a fft shift on the data94 unsigned int len = (unsigned int)(ceil(d_fft_size/2.0));95 memcpy(&out[0], &d_fft->get_outbuf()[len], sizeof(gr_complex)*(d_fft_size - len));96 memcpy(&out[d_fft_size - len], &d_fft->get_outbuf()[0], sizeof(gr_complex)*len);97 }98 else {99 memcpy (out, d_fft->get_outbuf (), output_data_size);100 }101 102 in += d_fft_size;103 out += d_fft_size;104 }105 106 return noutput_items;107 52 } 108 53 109 54 bool 110 gr_fft_vcc::set_window(const std::vector<float> window)55 gr_fft_vcc::set_window(const std::vector<float> &window) 111 56 { 112 57 if(window.size()==0 || window.size()==d_fft_size) { … … 117 62 return false; 118 63 } 119 120 /*121 fftshift122 123 for(i=0; i < ceil(d_occupied_carriers/2.0); i++) {124 unsigned int k=ceil(d_occupied_carriers/2.0);125 out[i] = gr_complex(-1+2*in[i+k],0);126 }127 for(; i < d_vlen - ceil(d_occupied_carriers/2.0); i++) {128 out[i]=gr_complex(0,0);129 }130 for(unsigned int j=0;i<d_vlen;i++,j++) {131 out[i]= gr_complex((-1+2*in[j]),0);132 }133 */gnuradio/trunk/gnuradio-core/src/lib/general/gr_fft_vcc.h
r7504 r8244 1 1 /* -*- c++ -*- */ 2 2 /* 3 * Copyright 2004,2007 Free Software Foundation, Inc.3 * Copyright 2004,2007,2008 Free Software Foundation, Inc. 4 4 * 5 5 * This file is part of GNU Radio … … 26 26 #include <gr_sync_block.h> 27 27 28 class gri_fft_complex;29 30 28 class gr_fft_vcc; 31 29 typedef boost::shared_ptr<gr_fft_vcc> gr_fft_vcc_sptr; 32 30 33 31 gr_fft_vcc_sptr 34 gr_make_fft_vcc (int fft_size, bool forward, const std::vector<float> window, bool shift=false);32 gr_make_fft_vcc (int fft_size, bool forward, const std::vector<float> &window, bool shift=false); 35 33 36 34 /*! 37 35 * \brief Compute forward or reverse FFT. complex vector in / complex vector out. 38 36 * \ingroup dft 37 * 38 * Abstract base class 39 39 */ 40 41 40 class gr_fft_vcc : public gr_sync_block 42 41 { 42 protected: 43 43 friend gr_fft_vcc_sptr 44 gr_make_fft_vcc (int fft_size, bool forward, const std::vector<float> window, bool shift);44 gr_make_fft_vcc (int fft_size, bool forward, const std::vector<float> &window, bool shift); 45 45 46 unsigned int d_fft_size;46 unsigned int d_fft_size; 47 47 std::vector<float> d_window; 48 gri_fft_complex *d_fft;49 48 bool d_forward; 50 49 bool d_shift; 51 50 52 gr_fft_vcc (int fft_size, bool forward, const std::vector<float> window, bool shift); 51 gr_fft_vcc (const std::string &name, int fft_size, bool forward, 52 const std::vector<float> &window, bool shift); 53 53 54 54 public: 55 55 ~gr_fft_vcc (); 56 56 57 int work (int noutput_items, 58 gr_vector_const_void_star &input_items, 59 gr_vector_void_star &output_items); 60 bool set_window(const std::vector<float> window); 57 bool set_window(const std::vector<float> &window); 61 58 }; 62 59 63 64 60 #endif /* INCLUDED_GR_FFT_VCC_H */ gnuradio/trunk/gnuradio-core/src/lib/general/gr_fft_vcc.i
r6044 r8244 1 1 /* -*- c++ -*- */ 2 2 /* 3 * Copyright 2004,2007 Free Software Foundation, Inc.3 * Copyright 2004,2007,2008 Free Software Foundation, Inc. 4 4 * 5 5 * This file is part of GNU Radio … … 29 29 { 30 30 protected: 31 gr_fft_vcc (int fft_size, bool forward, const std::vector<float> window, bool shift);31 gr_fft_vcc (int fft_size, bool forward, const std::vector<float> &window, bool shift); 32 32 33 33 public: 34 bool set_window(const std::vector<float> window);34 bool set_window(const std::vector<float> &window); 35 35 }; gnuradio/trunk/gnuradio-core/src/lib/general/gr_math.h
r7504 r8244 29 29 30 30 #include <gr_complex.h> 31 32 static inline bool 33 gr_is_power_of_2(long x) 34 { 35 return x != 0 && (x & (x-1)) == 0; 36 } 31 37 32 38 long gr_gcd (long m, long n); gnuradio/trunk/gnuradio-core/src/python/gnuradio/gr/Makefile.am
r8207 r8244 59 59 qa_ecc_ccsds_27.py \ 60 60 qa_feval.py \ 61 qa_fft.py \ 61 62 qa_fft_filter.py \ 62 63 qa_filter_delay_fc.py \
