Hi Ron,

Thank you very much!

I really appreciate your help and patience.

Best Regards,
George

On Fri, Dec 17, 2021 at 12:57 AM Ron Economos <[email protected]> wrote:

> Take a look at the FFT block code.
>
>
> https://github.com/gnuradio/gnuradio/blob/master/gr-fft/lib/fft_v_fftw.cc#L83-L85
>
> Ron
> On 12/16/21 7:19 PM, George Edwards wrote:
>
> Hi Ron,
>
> Thank you very much! I understand most of it, except for how to index
> properly into the values returned by the method ofdm_fft.get_outbuf() to
> do a forward FFT per your instruction to do the shift after the FFT.
>
> Let me write down the code snippet based on my understanding and you can
> instruct me on how to get the 2 nd half of the values returned by
> ofdm_fft.get_outbuf():
>
>     gr_complex* dst;
>     dst = ofdm_fft.get_inbuf();
>     memcpy(&dst[0], &in[0], sizeof(gr_complex) * ofdm_fft_size);     
> //transfer
> the ofdm_fft_size amount of data from input to dst
>
>     ofdm_fft.execute();                 //compute the FFT
>
>     memcpy(&out[ ofdm_fft_size / 2  ], ofdm_fft.get_outbuf(),
> sizeof(gr_complex) * ofdm_fft_size / 2);    //this I think is correct
>
>     memcpy(&out[ 0 ], ofdm_fft.get_outbuf(XXXX), sizeof(gr_complex) *
> ofdm_fft_size / 2);  // Problem here, how to access ofdm_fft.get_outbuf()
>
>
>
> //starting at address ofdm_fft_size/2
> Thank you!
>
> Best 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
>>>
>>>

Reply via email to