Hi Ron, Today, I tried to create an OOT block to compute FFT based on your good instructions. However, I must be doing something wrong because when I build my grc flowgraph to test (I run a complex sinusoid into a throttle which connects to a stream-to-vector, then to my fft block which takes in a vector and outputs a vector, then connects to a vector-to-stream which outputs to a file sink to collect data for me to view) it outputs zeros.
I tried to Debug using a small data size of 8 samples in a QA file because I can easily compute the fft of 8 samples to know what to expect if the block is working properly. This way, I can single step through the code to Debug. When I ran the Debugger, it fails to get inside the my_fft_cc.impl.cc code and gave the error message: itemsize mismatch: vector_source0:0 using 8, my_fft_cc0:0 using 64 However, I explicitly set the vector length inside my_fft_cc.impl.cc with a #define vlength 8, unless the fft function forces things to a minimum of 64 samples I will appreciate any suggestions you can offer here. Regards, George On Thu, Dec 16, 2021 at 8:14 PM Ron Economos <[email protected]> wrote: > Comments in-line. > > Ron > On 12/16/21 12:47 PM, George Edwards wrote: > > Hi Ron, > > Thanks again for sending the links and annotating the lines of interest. I > have looked through links and have some questions: > Q1. The lib/CMakeList.txt file I can identify easily, but I am not sure > which is the top level CMakeList.txt file. There are CMakeList.txt files > in directories "apps" and "grc" in my project directory and I am not sure > which is considered the top level. I do not know if you can help me here > (thing is, in my project the contents of these CMakefileList.txt files > are small and do not mimic that in the link you sent, so I have no clue). > > Let's say you have an OOT in your home directory. > > ~/gr-something > > The top level CMakeLists.txt is in ~/gr-something. > > > Q2. I am reading in a fixed size vector of floats to compute the fft and > output a vector of fft values (complex) the same size as the block of > input, so I assumed the OOT block should be a "sync" block, right? > > Yes. If you want to use vectors on your input and output pins, change the > signature to (where vlength is your vector size): > > gr::io_signature::make(1, 1, sizeof(input_type) * vlength), > gr::io_signature::make(1, 1, sizeof(output_type) * vlength)), > > Then in the block .yml file, use the vlen tag. > > inputs: > - domain: stream > dtype: complex > vlen: ${vlength} > > outputs: > - domain: stream > dtype: complex > vlen: ${vlength} > > Note that when you use vectors, noutput_items will be the number of > vectors, not the number of items in each vector. > > > Q3. Assuming the input vector comes in on the variable "in" and the output > vector is on the variable "out" how do I taylor the expression in the link > which I copied below to compute the fft and pass it to the output (plus, is > volk_32fc_s32fc_multiply_32fc(...) a function in the fft computation > module?): > [image: df0555eb-9839-457b-ac3d-0a4c9d17c662.png] > > I was using an IFFT in that example, and it's almost always required to > normalize the output. So that's what the volk_32fc_s32fc_multiply_32fc() > was for. Here's the code for just a simple in to out IFFT. Also, the > variable names don't have to be "ofdm_fft". You can use something more > descriptive. > > gr_complex* dst; > dst = ofdm_fft.get_inbuf(); > memcpy(&dst[ofdm_fft_size / 2], &in[0], sizeof(gr_complex) * > ofdm_fft_size / 2); > memcpy(&dst[0], &in[ofdm_fft_size / 2], sizeof(gr_complex) * > ofdm_fft_size / 2); > > ofdm_fft.execute(); > > memcpy(&out[0], ofdm_fft.get_outbuf(), sizeof(gr_complex) * > ofdm_fft_size); > > Note that for a forward FFT, you have to do the shift *after* the FFT. > Also, the example is complex in and complex out. > > Thank you very much! > George > > > On Wed, Dec 15, 2021 at 12:32 AM Ron Economos <[email protected]> wrote: > >> FFT support is built in to GNU Radio with FFTW. Here's how it's done. >> First, define it in your foo_impl.h file. The options are fft_complex_fwd, >> fft_complex_rev, fft_real_fwd and fft_real_rev. >> >> https://github.com/drmpeg/gr-paint/blob/master/lib/paint_bc_impl.h#L25 >> >> https://github.com/drmpeg/gr-paint/blob/master/lib/paint_bc_impl.h#L41 >> >> Then initialize it in your foo_impl.cc constructor. >> >> https://github.com/drmpeg/gr-paint/blob/master/lib/paint_bc_impl.cc#L47 >> >> Then execute it. >> >> >> https://github.com/drmpeg/gr-paint/blob/master/lib/paint_bc_impl.cc#L175-L179 >> >> You'll need to add the component in the top level CMakeLists.txt. >> >> https://github.com/drmpeg/gr-paint/blob/master/CMakeLists.txt#L78 >> >> And link with it in lib/CMakeLists.txt >> >> https://github.com/drmpeg/gr-paint/blob/master/lib/CMakeLists.txt#L25 >> >> If you need a window, you can look at the block implementation file for >> details. >> >> https://github.com/gnuradio/gnuradio/blob/master/gr-fft/lib/fft_v_fftw.cc >> >> Ron >> On 12/14/21 7:53 PM, George Edwards wrote: >> >> Dear GNURadio Community: >> >> I am writing a C++ OOT block where the signal processing requires >> the computation of both fft and ifft. Is there any Gnuradio C++ functions >> for the fft and ifft? If not, is there any way to wrap in Python's >> libraries with these methods into C++ OOT? >> >> Thank you! >> >> Regards, >> George >> >>
