On 03/31/2018 01:35 AM, Gilad Beeri (ApolloShield) wrote:
Marcus:

Yes, but he computes a sum of N power figures (for N samples), so for it to be 0, there should be N consecutive 0 samples, so the statistics are lower.
Looking at the source code, he uses N == 1024.


Sure, but not infinitely so.

Herr Mueller already pointed out why division in DSP flows is tricky, and hardly ever used. Dealing with the INFINITY case is one of those reasons.



On Sat, Mar 31, 2018 at 8:28 AM Gilad Beeri (ApolloShield) <[email protected] <mailto:[email protected]>> wrote:

    "if x != 0" will be translated to a super-speedy test both in C++
    and in Python. It is almost guaranteed that your flowgraph
    bottleneck will be in another place. My suggestion will be to just
    add this if statement and to think about it again only if you
    prove this is a bottleneck you want to optimize.

    Regarding your flowgraph vs. unit test question, I think you're
    right (you have a flowgraph also in the unit tests).


    On Sat, Mar 31, 2018 at 8:18 AM Anshul Thakur
    <[email protected] <mailto:[email protected]>>
    wrote:

        Hi Gilad,

        You are correct about getting zeros when using history and I
        am using history. But, I am accounting for that by using the
        offset:

        const gr_complex *current = (const gr_complex *)&((const
        gr_complex *)input_items[0])[(history() -1)];

        Also, if that is the case, shouldn't the behaviour be
        consistent across unit-tests and flowgraph usage?

        Regarding getting 0s from the device, I went through the
        discussion. I agree to it. So, I'll have to account for the
        zero values. Any ideas on how to do that?

        The reason why I don't want to use an 'if' block is simply
        because the situation of 0 values is expected to share a very
        small fraction of the entire run and
        to handle that small case, the regular cases will also
        necessarily have to go through that additional 'if' check. I
        wanted to avoid that.

        Regards,
        Anshul

        On 31 March 2018 at 10:37, Gilad Beeri (ApolloShield)
        <[email protected] <mailto:[email protected]>> wrote:

            Disclosure: I haven't looked at your code.

            0 values can be presented in GNU Radio when you use
            history, because if your history is N, the first N-1 items
            are going to be zeros.

            Anyway, regarding your comment "it is not expected that a
            device/stream would ever spit out zero values.",
            I did have 0 values from a USRP device, see discussion in
            
http://lists.ettus.com/pipermail/usrp-users_lists.ettus.com/2017-October/026851.html.



            On Sat, Mar 31, 2018 at 6:52 AM Anshul Thakur
            <[email protected]
            <mailto:[email protected]>> wrote:

                Michael, Marcus,

                Right now, the code is a work in progress so I haven't
                made a git repository out of it. However, I have it on
                dropbox. Here's the link to the source
                folder(p1_detector_impl.cc is the source in question):

                
_https://www.dropbox.com/sh/blfmxsaidrkh28t/AAArp8IHavzCGFlJs6E6-Hrca?dl=0_

                As for Marcus's question regarding why use a circular
                buffer?

                It isn't exactly a circular buffer now, but more of a
                shift register. The reasons are as follows:
                1. I needed running sums for correlations in B-Branch
                and C-Branch correlators, and Power Sums (for average
                power) to normalize them. Then, I also needed a finite
                delay buffer to delay the C-Branch before it gets
                multiplied with the B-Branch.
                2. It kind of carried over from the last
                implementation attempt:

                Assertion: If a peak is detected after the
                multiplication, the signal boundary is 1024 samples
                behind that index.

                Once the correlations crossed a threshold (the code
                entered state=1), /instead of looking back, I then
                needed to look forward to see if it were a false alarm
                or not/. So, I compute the correlations across all
                available current inputs and try to find a peak. If a
                peak is found, enter state=3 where we do a correlation
                with the carrier distribution sequence after FFT of
                all signals of interest. So, here, I not only needed
                just the single value (the running sum), but the
                entire state of the delay register and the B-Branch
                correlator.

                I hope I am able to convey the reason for implementing
                one myself.

                In the current implementation, I make an assumption
                that the threshold is so high that only the desired
                signals would cross it (100-150 times the average). So
                I skip the state=1 logic and directly go into state=2
                logic of aggressively doing a FFT and correlation with
                the CDS.

                However, I don't think this has a binding on the
                incoming values. Use of buffers is internal to the
                implementation, I am just printing out the current
                values as they arrive.

                For example, when I use the test file in 'make test',
                the values fed in are non-zero from t=1. However, when
                using gnuradio-companion, t=56 line is where the file
                source starts yielding proper inputs to my block. The
                stdout prints of the initial values in both GRC and
                make tests are attached. The gnuradio-companion
                version has my first 55 samples zeroed and the 56th
                input onward is then same for both.


                P.S.: The source stream is a 1.2 Gigs file, so haven't
                uploaded it. If you'd like I can do that too. It was
                generated by using a DVB-T2 Tx block and writing the
                output into a file sink.

                Warm regards,
                Anshul Thakur

                On 31 March 2018 at 02:27, Müller, Marcus (CEL)
                <[email protected] <mailto:[email protected]>> wrote:

                    Hi Anshul,

                    you shouldn't have to have your own buffer for a
                    running sum – can you
                    explain why you're doing that?
                    A running sum can trivially be implemented with
                    the IIR filter block
                    with Feed-Forward taps (1,) and Feed-back taps (1,0)!
                    Where does in a running sum does a division take
                    place?

                    > (a) Why am I getting the initial zero samples
                    from the file block in
                    > gnuradio_companion and non-zero values when
                    using a vector_source in
                    > unit tests?

                    If these zeros are not in the file you're reading,
                    your block has a
                    bug!


                    > (b) What can I do about it (here specifically as
                    a fix to the
                    > situation, and a general guideline to always
                    remember)?

                    good question, but we'd need to know your code,
                    your motivation for a
                    circular buffer, and why you're implementing a
                    running sum yourself!

                    Best regards,
                    Marcus

                    On Fri, 2018-03-30 at 23:19 +0530, Anshul Thakur
                    wrote:
                    > Hi,
                    >
                    > I used a circular buffer of finite size to keep
                    the past 'N' power
                    > values of the sample stream in my block as a
                    part of creating a
                    > running sum. This buffer is initialized to 0 in
                    the constructor.
                    > The running sum of powers is used to compute the
                    average power used
                    > in computing signal correlation.
                    >
                    > I have a capture stream (cfile) to test the
                    operation of the block.
                    > The test case uses a vector_source_c block to
                    read the contents of
                    > the file into memory. The unit tests pass
                    without error.
                    >
                    > However, when I use the block in a flowgraph in
                    that reads the same
                    > file from a file source block
                    gnuradio_companion, I am getting the
                    > first few sample values as 0 which cause a
                    divide by zero
                    > problem. This messes up the rest of the running
                    sum. I don't want to
                    > put an 'if' block that checks for the zero
                    condition as it is not
                    > expected that a device/stream would ever spit
                    out zero values.
                    >
                    > (a) Why am I getting the initial zero samples
                    from the file block in
                    > gnuradio_companion and non-zero values when
                    using a vector_source in
                    > unit tests?
                    >
                    > (b) What can I do about it (here specifically as
                    a fix to the
                    > situation, and a general guideline to always
                    remember)?
                    >
                    > I am using GNURadio version 3.7.12.
                    >
                    > Regards,
                    > Anshul
                    > _______________________________________________
                    > Discuss-gnuradio mailing list
                    > [email protected]
                    <mailto:[email protected]>
                    >
                    https://lists.gnu.org/mailman/listinfo/discuss-gnuradio


                _______________________________________________
                Discuss-gnuradio mailing list
                [email protected] <mailto:[email protected]>
                https://lists.gnu.org/mailman/listinfo/discuss-gnuradio




_______________________________________________
Discuss-gnuradio mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

_______________________________________________
Discuss-gnuradio mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to