discuss-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Discuss-gnuradio] Rounding Error between Python and C++ Blackmanhar


From: Tommy Tracy
Subject: Re: [Discuss-gnuradio] Rounding Error between Python and C++ Blackmanharris Window
Date: Mon, 4 Nov 2013 11:04:34 -0500

Turns out that this is more than a rounding error. it is an off-by-one error at index 1 given N=1024.

In python it is defined as follows in (gnuradio/gr-fft/python/fft/
window.py)
----------
blackmanharris = coswindow((0.35875,0.48829,0.14128,0.01168))
where
def coswindow(coeffs):
    def closure(fft_size):
        window = [0] * fft_size
        #print list(enumerate(coeffs))
        for w_index in range(fft_size):
            for (c_index, coeff) in enumerate(coeffs):
                window[w_index] += (-1)**c_index * coeff * math.cos(2.0*c_index*math.pi*(w_index+0.5)/(fft_size-1))
        return window
    return closure
----------
In c++ it is defined as follows in (gnuradio/gr-filter/lib/firdes.cc)
----------
      case WIN_BLACKMAN_hARRIS:
        for(int n = -ntaps/2; n < ntaps/2; n++)
          taps[n+ntaps/2] = 0.35875 + 0.48829*cos((2*M_PI * n) / (float)M) +
            0.14128*cos((4*M_PI * n) / (float)M) + 0.01168*cos((6*M_PI * n) / (float)M);
        break;
----------

It is not immediately obvious why I'm getting different results. Yes, the two have different levels of precision, but  I see an off-by-one error.

$ head -n 20 indexed_cpp.out
0: 6.01334e-05 - ok
1: 6.01334e-05 - ? no good.
2: 6.12008e-05
3: 6.33369e-05
4: 6.65439e-05
5: 7.08254e-05
6: 7.61861e-05
7: 8.26318e-05
8: 9.01697e-05
9: 9.88079e-05
10: 0.000108556
11: 0.000119424
12: 0.000131425
13: 0.00014457
14: 0.000158875
15: 0.000174354
16: 0.000191023
17: 0.000208902
18: 0.000228007
19: 0.00024836


$ head -n 20 indexed_python.out
0 :  6.013340171e-05
1 :  6.12008358122e-05
2 :  6.33368796032e-05
3 :  6.65438842538e-05
4 :  7.08253765149e-05
5 :  7.61860587111e-05
6 :  8.26318087304e-05
7 :  9.01696800132e-05
8 :  9.88079015359e-05
9 :  0.000108555877792
10 :  0.000119424188766
11 :  0.000131424589909
12 :  0.000144570012099
13 :  0.000158874561602
14 :  0.000174353520023
15 :  0.000191023344246
16 :  0.000208901666371
17 :  0.000228007293632
18 :  0.000248360208308
19 :  0.000269981567623




On Sun, Nov 3, 2013 at 10:34 PM, Tommy Tracy <address@hidden> wrote:
Dear GNU Radio,

This is most likely a shortcoming of how python handles significant digits, but I wanted to point out that creating a Blackmanharris window in Python and C++ result in different results.

In Python:
window = fft.blackmanharris(1024)

In c++:
const std::vector< float >  window = gr::filter::firdes::window(gr::filter::firdes::WIN_BLACKMAN_HARRIS, 1024, NULL);


I have attached an image of two plots. The first plot is of the two windows on top of each other (green and blue), and the second is of their difference:
         differences = python_values - cpp_values;

I was wondering why my c++ and python application were getting different results, and I have found the cause.
--
    Sincerely,
Tommy Tracy II
        UVA




--
    Sincerely,
Tommy Tracy II
        UVA

reply via email to

[Prev in Thread] Current Thread [Next in Thread]