4

ここに表示されている関数を複製しようとしています: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;
}

あなたの助けをたくさんありがとう。

4

1 に答える 1

4

ウィンドウを関数全体として定義します。

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の値が得られます

(より大きなウィンドウを使用すると、この値が変更されるため、少し低くなる前に指定した値になります)。

混乱をお詫びします

于 2012-05-19T07:39:59.043 に答える