IT++ Logo
window.cpp
Go to the documentation of this file.
00001 
00030 #include <itpp/base/itcompat.h>
00031 #include <itpp/signal/window.h>
00032 #include <itpp/signal/poly.h>
00033 #include <itpp/base/specmat.h>
00034 #include <itpp/base/converters.h>
00035 #include <itpp/base/math/trig_hyp.h>
00036 #include <itpp/signal/transforms.h>
00037 #include <itpp/base/operators.h>
00038 
00039 namespace itpp
00040 {
00041 
00042 
00043 vec hamming(int n)
00044 {
00045   vec t(n);
00046 
00047   if (n == 1)
00048     t(0) = 0.08;
00049   else
00050     for (int i = 0;i < n;i++)
00051       t[i] = (0.54 - 0.46 * std::cos(2.0 * pi * i / (n - 1)));
00052 
00053   return t;
00054 }
00055 
00056 vec hanning(int n)
00057 {
00058   vec t(n);
00059 
00060   for (int i = 0;i < n;i++)
00061     t(i) = 0.5 * (1.0 - std::cos(2.0 * pi * (i + 1) / (n + 1)));
00062 
00063   return t;
00064 }
00065 
00066 // matlab version
00067 vec hann(int n)
00068 {
00069   vec t(n);
00070 
00071   for (int i = 0;i < n;i++)
00072     t(i) = 0.5 * (1.0 - std::cos(2.0 * pi * i / (n - 1)));
00073 
00074   return t;
00075 }
00076 
00077 vec blackman(int n)
00078 {
00079   vec t(n);
00080 
00081   for (int i = 0;i < n;i++)
00082     t(i) = 0.42 - 0.5 * std::cos(2.0 * pi * i / (n - 1)) + 0.08 * std::cos(4.0 * pi * i / (n - 1));
00083 
00084   return t;
00085 }
00086 
00087 vec triang(int n)
00088 {
00089   vec t(n);
00090 
00091   if (n % 2) { // Odd
00092     for (int i = 0; i < n / 2; i++)
00093       t(i) = t(n - i - 1) = 2.0 * (i + 1) / (n + 1);
00094     t(n / 2) = 1.0;
00095   }
00096   else
00097     for (int i = 0; i < n / 2; i++)
00098       t(i) = t(n - i - 1) = (2.0 * i + 1) / n;
00099 
00100   return t;
00101 }
00102 
00103 vec sqrt_win(int n)
00104 {
00105   vec t(n);
00106 
00107   if (n % 2) { // Odd
00108     for (int i = 0; i < n / 2; i++)
00109       t(i) = t(n - i - 1) = std::sqrt(2.0 * (i + 1) / (n + 1));
00110     t(n / 2) = 1.0;
00111   }
00112   else
00113     for (int i = 0; i < n / 2; i++)
00114       t(i) = t(n - i - 1) = std::sqrt((2.0 * i + 1) / n);
00115 
00116   return t;
00117 }
00118 
00119 vec chebwin(int n, double at)
00120 {
00121   it_assert((n > 0), "chebwin(): need a positive order n!");
00122 
00123   if (n == 1) {
00124     return vec("1");
00125   }
00126 
00127   at = at < 0 ? -at : at;
00128   // compute the parameter beta
00129   double beta = std::cosh(::acosh(pow10(at / 20)) / (n - 1));
00130   vec k = (pi / n) * linspace(0, n - 1, n);
00131   vec cos_k = cos(k);
00132   // find the window's DFT coefficients
00133   vec p = cheb(n - 1, beta * cos_k);
00134 
00135   vec w(n); // the window vector
00136   // Appropriate IDFT and filling up depending on even/odd n
00137   if (is_even(n)) {
00138     w = ifft_real(to_cvec(elem_mult(p, cos_k), elem_mult(p, -sin(k))));
00139     int half_length = n / 2 + 1;
00140     w = w.left(half_length) / w(1);
00141     w = concat(reverse(w), w.right(n - half_length));
00142   }
00143   else {
00144     w = ifft_real(to_cvec(p));
00145     int half_length = (n + 1) / 2;
00146     w = w.left(half_length) / w(0);
00147     w = concat(reverse(w), w.right(n - half_length));
00148   }
00149   return w;
00150 }
00151 
00152 
00153 } // namespace itpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
SourceForge Logo

Generated on Wed Jul 27 2011 16:27:05 for IT++ by Doxygen 1.7.4