基于Eigen 的hanning窗计算

版权声明:转载请注释 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;
}

猜你喜欢

转载自blog.csdn.net/xinshuwei/article/details/83785711