我正在尝试复制此处看到的功能:http://en.wikipedia.org/wiki/Window_function#Blackman.E2.80.93Harris_window
但我根本无法理解价值观。这是我目前的代码:
double blackman_harris(int n, int N){
double a0, a1, a2, a3, seg1, seg2, seg3, w_n;
a0 = 0.35875;
a1 = 0.48829;
a2 = 0.14128;
a3 = 0.01168;
seg1 = a1 * (double) cos((double)(2*M_PI*n)/(double) (N - 1));
seg2 = a2 * (double) cos((double)(4*M_PI*n)/(double) (N - 1));
seg3 = a3 * (double) cos((double)(6*M_PI*n)/(double) (N - 1));
w_n = a0 - seg1 + seg2 - seg3;
return w_n;
}
非常感谢你的帮助。
答案 0 :(得分:3)
将窗口定义为整个函数。
bool VecBuildBlackmanHarrisWindow( float* pOut, unsigned int num )
{
const float a0 = 0.35875f;
const float a1 = 0.48829f;
const float a2 = 0.14128f;
const float a3 = 0.01168f;
unsigned int idx = 0;
while( idx < num )
{
pOut[idx] = a0 - (a1 * cosf( (2.0f * M_PI * idx) / (num - 1) )) + (a2 * cosf( (4.0f * M_PI * idx) / (num - 1) )) - (a3 * cosf( (6.0f * M_PI * idx) / (num - 1) ));
idx++;
}
return true;
}
然后您可以按如下方式定义窗口函数:
std::vector< float > window( 1024 );
VecBuildBlackmanHarrisWindow( &window.front(), window.size() );
这意味着您可以提前预先计算窗口功能。
此时我很抱歉我误导了你。抱歉。我检查了我的代码并通过将所有窗口样本值平均在一起然后除以2来计算该值(有效地将它们全部加起来并除以N / 2)。
float fTotal = 1.0f;
auto iter = window.begin();
while( iter != window.end() )
{
fTotal += *iter;
iter++;
}
fTotal /= 1024.0f;
fTotal /= 2.0f;
这给我的值为0.17969f
(如果你使用一个更大的窗口,这个值会改变,因此我在稍微降低之前给你的值。)
为混乱道歉