summaryrefslogtreecommitdiff
path: root/gr-fft/include/gnuradio/fft/window.h
diff options
context:
space:
mode:
Diffstat (limited to 'gr-fft/include/gnuradio/fft/window.h')
-rw-r--r--gr-fft/include/gnuradio/fft/window.h270
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 */