diff options
author | Tom Rondeau <tom@trondeau.com> | 2013-11-18 19:31:01 -0500 |
---|---|---|
committer | Tom Rondeau <tom@trondeau.com> | 2013-11-18 20:20:11 -0500 |
commit | 9c154aa9eaf3715ac8d06e56ad725e5be3ff6002 (patch) | |
tree | cd95257781c05ba62a118ca552fa07275b92faa1 | |
parent | 061bb4e56df7fcb093bb1fb0a48e3396f5b0d19e (diff) |
fft: optimization; bug fixes for kaiser window and added windows to win_type.
filter: fixed width_factor to include new window types and add protection around array.
-rw-r--r-- | gr-fft/lib/window.cc | 10 | ||||
-rw-r--r-- | gr-filter/lib/firdes.cc | 11 |
2 files changed, 15 insertions, 6 deletions
diff --git a/gr-fft/lib/window.cc b/gr-fft/lib/window.cc index 5a28b3239d..1610b46f5d 100644 --- a/gr-fft/lib/window.cc +++ b/gr-fft/lib/window.cc @@ -81,7 +81,7 @@ namespace gr { float M = static_cast<float>(ntaps - 1); for(int n = 0; n < ntaps; n++) - taps[n] = c0 - c1*cos((2*M_PI*n)/M) + c2*cos((4*M_PI*n)/M); + taps[n] = c0 - c1*cosf((2.0f*M_PI*n)/M) + c2*cosf((4.0f*M_PI*n)/M); return taps; } @@ -92,7 +92,8 @@ namespace gr { float M = static_cast<float>(ntaps - 1); for(int n = 0; n < ntaps; n++) - taps[n] = c0 - c1*cos((2*M_PI*n)/M) + c2*cos((4*M_PI*n)/M) - c3*cos((6*M_PI*n)/M); + taps[n] = c0 - c1*cosf((2.0f*M_PI*n)/M) + c2*cosf((4.0f*M_PI*n)/M) \ + - c3*cosf((6.0f*M_PI*n)/M); return taps; } @@ -103,7 +104,8 @@ namespace gr { float M = static_cast<float>(ntaps - 1); for(int n = 0; n < ntaps; n++) - taps[n] = c0 - c1*cos((2*M_PI*n)/M) + c2*cos((4*M_PI*n)/M) - c3*cos((6*M_PI*n)/M) + c4*cos((8*M_PI*n)/M); + taps[n] = c0 - c1*cosf((2.0f*M_PI*n)/M) + c2*cosf((4.0f*M_PI*n)/M) \ + - c3*cosf((6.0f*M_PI*n)/M) + c4*cosf((8.0f*M_PI*n)/M); return taps; } @@ -224,7 +226,7 @@ namespace gr { double inm1 = 1.0/((double)(ntaps-1)); double temp; - for(int i = 0; i <= ntaps; i++) { + for(int i = 0; i < ntaps; i++) { temp = 2*i*inm1 - 1; taps[i] = Izero(beta*sqrt(1.0-temp*temp)) * IBeta; } diff --git a/gr-filter/lib/firdes.cc b/gr-filter/lib/firdes.cc index 93dfec5bc8..a52a2ddf63 100644 --- a/gr-filter/lib/firdes.cc +++ b/gr-filter/lib/firdes.cc @@ -659,14 +659,18 @@ namespace gr { // // delta_f / width_factor gives number of taps required. - static const float width_factor[5] = { // indexed by win_type + const int MAX_WIDTH_FACTOR = 8; + static const float width_factor[8] = { // indexed by win_type 3.3, // WIN_HAMMING 3.1, // WIN_HANN 5.5, // WIN_BLACKMAN 2.0, // WIN_RECTANGULAR //5.0 // WIN_KAISER (guesstimate compromise) //2.0 // WIN_KAISER (guesstimate compromise) - 10.0 // WIN_KAISER + 10.0, // WIN_KAISER + 6.0, // WIN_BLACKMAN_HARRIS (est.) + 3.0, // WIN_BARTLETT (est.) + 5.5, // WIN_FLATTOP (est.) }; int @@ -692,6 +696,9 @@ namespace gr { double delta_f = transition_width / sampling_freq; // compute number of taps required for given transition width + if(window_type >= MAX_WIDTH_FACTOR) + throw std::runtime_error("firdes::compute_ntaps: window_type out of range."); + int ntaps = (int)(width_factor[window_type] / delta_f + 0.5); if((ntaps & 1) == 0) // if even... ntaps++; // ...make odd |