//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); }
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 ); } }