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
Generated on Sat Jul 9 2011 15:21:33 for IT++ by Doxygen 1.7.4