版权声明:转载请注释 https://blog.csdn.net/xinshuwei/article/details/83785711
//hanning窗函数
VectorXd calc_hanning(int m, int n)
{
VectorXd w, w1, w2, w3;
w1.setLinSpaced( m,1, m);
w2 = w1.array()*(2 * M_PI / (n + 1));
w3 = 0.5*w2.array().cos();
w = 0.5 - w3.array();
return w;
//w = 0.5*(1 - cos(2 * PI*w1/(n+1)));
}
VectorXd sym_hanning(int n)
{
int half;
VectorXd w1, w2;
if (n % 2 == 0)//偶数阶
{
half = n / 2;
w1 = calc_hanning(half, n);
w2 = w1.reverse();
}
else
{
half = (n + 1) / 2;
w1 = calc_hanning(half, n);
//w2 = w1.reverse();
//w2 = wkeep(w2, n - half, 1);
w2 = w1.reverse().segment(1,n-half);
}
VectorXd w(w1.size()+w2.size());
w<<w1, w2;
return w;
}
VectorXd hanning_win(int n, bool type)
{
VectorXd w, w1;
if (type) {
w = sym_hanning(n);
return w;
}
else {
VectorXd w2(n);
w2 << 0, sym_hanning(n - 1);
return w2;
}
}
// n 阶数 type: true->symmetric 对称 false->periodic
VectorXd hanning_win(int n)
{
VectorXd w;
bool type = true;
w = hanning_win(n, type);
return w;
}