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 <http://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 <http://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 <mailto: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?):
    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
    <mailto: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#L25>

        https://github.com/drmpeg/gr-paint/blob/master/lib/paint_bc_impl.h#L41
        <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
        
<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
        
<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
        <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
        <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
        
<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