示例#1
0
//input sample array, # of points
void FFT(Complex *data, Complex const *factor, int num, int series)
{
    //temporary storage variables 
    Complex topData;
    Complex lowData;
    Complex dataIndex;
    //difference between top/lower leg
    int leg_diff;
    int lower_leg;
    //index/step through twiddle constant 
    int index = 0;
    //step between values
    int step = 1;
    //difference between upper & lower legs
    leg_diff = num / 2;
    
    imagSetToZero(data, num);
    
    //for N-point FFT
    for (int i = 0; i < series; i++)                   
    {
        index = 0;
        for (int j = 0; j < leg_diff; j++) {
            for (int upper_leg = j; upper_leg < num; upper_leg += (2 * leg_diff)) {
                lower_leg = upper_leg + leg_diff;

                addComplex(&topData, (data + upper_leg), (data + lower_leg));
                subComplex(&lowData, (data + upper_leg), (data + lower_leg));
                dataIndex.real = (factor + index)->real;
                dataIndex.imag = (factor + index)->imag;
                mulComplex((data + lower_leg), &lowData, &dataIndex);
                (data + upper_leg)->real = topData.real;
                (data + upper_leg)->imag = topData.imag;
            }
            index += step;
        }

        leg_diff >>= 1;
        step *= 2;
    }
    inReverse(data, num);
}
示例#2
0
void CxCore_MulSpectrumsTest::prepare_to_validation( int /*test_case_idx*/ )
{
    Mat* src1 = &test_mat[INPUT][0];
    Mat* src2 = &test_mat[INPUT][1];
    Mat& dst = test_mat[OUTPUT][0];
    Mat& dst0 = test_mat[REF_OUTPUT][0];
    int cn = src1->channels();

    if( cn == 1 )
    {
        convertFromCCS( *src1, *src1, dst, flags );
        convertFromCCS( *src2, *src2, dst0, flags );
        src1 = &dst;
        src2 = &dst0;
    }

    mulComplex( *src1, *src2, dst0, flags );
    if( cn == 1 )
    {
        Mat& temp = test_mat[TEMP][0];
        convertFromCCS( temp, temp, dst, flags );
    }
}