Thanks Ron! I really appreciate your help! George On Wed, Dec 22, 2021, 9:52 PM Ron Economos <w...@comcast.net> wrote:
> Comments in-line. > > Ron > On 12/22/21 1:30 PM, George Edwards wrote: > > 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. > > The FFT of a sine wave is almost all zeroes. Only the center bin will have > a value. Check your output carefully. > > > 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. > > The sizes being reported are in bytes. So you're connecting a complex > vector_source of vector size 1 (8 bytes) to your FFT block of vector size 8 > (64 bytes). > > > Regards, > George > > On Thu, Dec 16, 2021 at 8:14 PM Ron Economos <w...@comcast.net> 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 <w...@comcast.net> 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 >>> >>>