版权声明:转载请注释 https://blog.csdn.net/xinshuwei/article/details/83819820
//窗函数
VectorXd calc_window(int half, int n, int window)
{
VectorXd x(half);
//x.setllinspace((Type)0, (Type)(half - 1), half) / (Type)(n - 1));
x.setLinSpaced(half, 0, (half - 1));
x = x.array() / (n - 1);
VectorXd w(half);
if (window == 0)//hamming
w = (Type)0.54 - (Type)0.46*(2 * M_PI*x).array().cos();
else if (window == 1)//hann
w = (Type)0.5 - (Type)0.5*(2 * M_PI*x.array()).cos();
else if (window == 2)//blackman
{
w = (Type)0.42 - (Type)0.5*((Type)2 * M_PI*x.array()).cos() + (Type)0.08*(4 * M_PI*x.array()).cos();
w[0] = 0;
}
else
{
Type a0 = 0.21557895;
Type a1 = 0.41663158;
Type a2 = 0.277263158;
Type a3 = 0.083578947;
Type a4 = 0.006947368;
w = a0 - a1*(2 * M_PI*x.array()).cos() + a2*(4 * M_PI*x.array()).cos() - a3*(6 * M_PI*x.array()).cos() + a4*(8 * M_PI*x.array()).cos();
}
return w;
}
// window =0 'hamming', 1 'hann', 2 'blackman' 3 'flattopwin'. n 阶数
VectorXd sym_window(int n, int window)
{
int half;
VectorXd w1, w2;
if (n % 2 == 0)//偶数阶
{
half = n / 2;
w1 = calc_window(half, n, window);
w2 = w1.reverse();
}
else
{
half = (n + 1) / 2;
w1 = calc_window(half, n, window);
w2 = w1.reverse().segment(1,n-half);
}
VectorXd w(w1.size() + w2.size());
w << w1, w2;
return w;
}
//n 阶数 type: true->symmetric 对称 false->periodic
// window =0 'hamming', 1 'hann', 2 'blackman'.
VectorXd gencoswin(int n, int window, bool type)
{
if (type)
{
VectorXd w = sym_window(n, window);
return w;
}
else
{
VectorXd w = sym_window(n + 1, window);
w.resize(n);
return w;
}
}