diff options
Diffstat (limited to 'gr-fft/include/gnuradio/fft/window.h')
-rw-r--r-- | gr-fft/include/gnuradio/fft/window.h | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/gr-fft/include/gnuradio/fft/window.h b/gr-fft/include/gnuradio/fft/window.h new file mode 100644 index 0000000000..b7479f48fb --- /dev/null +++ b/gr-fft/include/gnuradio/fft/window.h @@ -0,0 +1,270 @@ +/* -*- c++ -*- */ +/* + * Copyright 2002,2007,2008,2012,2013 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include <gnuradio/fft/api.h> +#include <vector> +#include <cmath> +#include <gnuradio/gr_complex.h> + +namespace gr { + namespace fft { + + class FFT_API window { + public: + + enum win_type { + WIN_NONE = -1, //!< don't use a window + WIN_HAMMING = 0, //!< Hamming window; max attenuation 53 dB + WIN_HANN = 1, //!< Hann window; max attenuation 44 dB + WIN_BLACKMAN = 2, //!< Blackman window; max attenuation 74 dB + WIN_RECTANGULAR = 3, //!< Basic rectangular window + WIN_KAISER = 4, //!< Kaiser window; max attenuation a function of beta, google it + WIN_BLACKMAN_hARRIS = 5, //!< Blackman-harris window + WIN_BLACKMAN_HARRIS = 5, //!< alias to WIN_BLACKMAN_hARRIS for capitalization consistency + WIN_BARTLETT = 6, //!< Barlett (triangular) window + WIN_FLATTOP = 7, //!< flat top window; useful in FFTs + }; + + /*! + * \brief Helper function to build cosine-based windows. 3-coefficient version. + */ + static std::vector<float> coswindow(int ntaps, float c0, float c1, float c2); + + /*! + * \brief Helper function to build cosine-based windows. 4-coefficient version. + */ + static std::vector<float> coswindow(int ntaps, float c0, float c1, float c2, float c3); + + /*! + * \brief Helper function to build cosine-based windows. 5-coefficient version. + */ + static std::vector<float> coswindow(int ntaps, float c0, float c1, float c2, float c3, float c4); + + /*! + * \brief Build a rectangular window. + * + * Taps are flat across the window. + * + * \param ntaps Number of coefficients in the window. + */ + static std::vector<float> rectangular(int ntaps); + + /*! + * \brief Build a Hamming window. + * + * See: + * <pre> + * A. V. Oppenheim and R. W. Schafer, "Discrete-Time + * Signal Processing," Upper Saddle River, N.J.: Prentice + * Hall, 2010, pp. 535-538. + * </pre> + * + * \param ntaps Number of coefficients in the window. + */ + static std::vector<float> hamming(int ntaps); + + /*! + * \brief Build a Hann window (sometimes known as Hanning). + * + * See: + * <pre> + * A. V. Oppenheim and R. W. Schafer, "Discrete-Time + * Signal Processing," Upper Saddle River, N.J.: Prentice + * Hall, 2010, pp. 535-538. + * </pre> + * + * \param ntaps Number of coefficients in the window. + */ + static std::vector<float> hann(int ntaps); + + /*! + * \brief Alias to build a Hann window. + * + * \param ntaps Number of coefficients in the window. + */ + static std::vector<float> hanning(int ntaps); + + /*! + * \brief Build an exact Blackman window. + * + * See: + * <pre> + * A. V. Oppenheim and R. W. Schafer, "Discrete-Time + * Signal Processing," Upper Saddle River, N.J.: Prentice + * Hall, 2010, pp. 535-538. + * </pre> + * + * \param ntaps Number of coefficients in the window. + */ + static std::vector<float> blackman(int ntaps); + + /*! + * \brief Build Blackman window, variation 1. + */ + static std::vector<float> blackman2(int ntaps); + + /*! + * \brief Build Blackman window, variation 2. + */ + static std::vector<float> blackman3(int ntaps); + + /*! + * \brief Build Blackman window, variation 3. + */ + static std::vector<float> blackman4(int ntaps); + + /*! + * \brief Build a Blackman-harris window with a given attenuation. + * + * <pre> + * f. j. harris, "On the use of windows for harmonic analysis + * with the discrete Fourier transforms," Proc. IEEE, Vol. 66, + * ppg. 51-83, Jan. 1978. + * </pre> + * + * \param ntaps Number of coefficients in the window. + + * \param atten Attenuation factor. Must be [61, 67, 74, 92]. + * See the above paper for details. + */ + static std::vector<float> blackman_harris(int ntaps, int atten=92); + + /*! + * Alias to gr::fft::window::blakcman_harris. + */ + static std::vector<float> blackmanharris(int ntaps, int atten=92); + + /*! + * \brief Build a Nuttal (or Blackman-Nuttal) window. + * + * See: http://en.wikipedia.org/wiki/Window_function#Blackman.E2.80.93Nuttall_window + * + * \param ntaps Number of coefficients in the window. + */ + static std::vector<float> nuttal(int ntaps); + + /*! + * \brief Alias to the Nuttal window. + * + * \param ntaps Number of coefficients in the window. + */ + static std::vector<float> blackman_nuttal(int ntaps); + + /*! + * \brief Build a Nuttal continuous first derivative window. + * + * See: http://en.wikipedia.org/wiki/Window_function#Nuttall_window.2C_continuous_first_derivative + * + * \param ntaps Number of coefficients in the window. + */ + static std::vector<float> nuttal_cfd(int ntaps); + + /*! + * \brief Build a Nuttal continuous first derivative window. + * + * See: http://en.wikipedia.org/wiki/Window_function#Flat_top_window + * + * \param ntaps Number of coefficients in the window. + */ + static std::vector<float> flattop(int ntaps); + + /*! + * \brief Build a Kaiser window with a given beta. + * + * See: + * <pre> + * A. V. Oppenheim and R. W. Schafer, "Discrete-Time + * Signal Processing," Upper Saddle River, N.J.: Prentice + * Hall, 2010, pp. 541-545. + * </pre> + * + * \param ntaps Number of coefficients in the window. + * \param beta Shaping parameter of the window. See the + * discussion in Oppenheim and Schafer. + */ + static std::vector<float> kaiser(int ntaps, double beta); + + /*! + * \brief Build a Barlett (triangular) window. + * + * See: + * <pre> + * A. V. Oppenheim and R. W. Schafer, "Discrete-Time + * Signal Processing," Upper Saddle River, N.J.: Prentice + * Hall, 2010, pp. 535-538. + * </pre> + * + * \param ntaps Number of coefficients in the window. + */ + static std::vector<float> bartlett(int ntaps); + + static std::vector<float> welch(int ntaps); + + /*! + * \brief Build a Parzen (or de la Valle-Poussin) window. + * + * See: + * <pre> + * A. D. Poularikas, "Handbook of Formulas and Tables for + * Signal Processing," Springer, Oct 28, 1998 + * </pre> + * + * \param ntaps Number of coefficients in the window. + */ + static std::vector<float> parzen(int ntaps); + + /*! + * \brief Build an exponential window with a given decay. + * + * See: http://en.wikipedia.org/wiki/Window_function#Exponential_or_Poisson_window + * + * \param ntaps Number of coefficients in the window. + * \param d Decay of \p d dB over half the window length. + */ + static std::vector<float> exponential(int ntaps, double d); + + /*! + * \brief Build a Riemann window. + * + * See: + * <pre> + * A. D. Poularikas, "Handbook of Formulas and Tables for + * Signal Processing," Springer, Oct 28, 1998 + * </pre> + * + * \param ntaps Number of coefficients in the window. + */ + static std::vector<float> riemann(int ntaps); + + /*! + * \brief Build a window using gr::fft::win_type to index the + * type of window desired. + * + * \param type a gr::fft::win_type index for the type of window. + * \param ntaps Number of coefficients in the window. + * \param beta Used only for building Kaiser windows. + */ + static std::vector<float> build(win_type type, int ntaps, double beta); + }; + + } /* namespace fft */ +} /* namespace gr */ |