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 <tj...@virginia.edu> 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
_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to