2015-04-22 7 views
5

Мне нужно выполнить преобразования FFT и Inverse-FFT. Входом будет вектор и матрицы двойных. В идеале вывод должен быть массивом std :: complex, но я могу жить с двойным _Complex.Есть ли простой пример C++ о том, как использовать Intel MKL FFT?

Я не нашел простого примера, все примеры из Intel делают много вещей сразу без достаточного количества комментариев.

Я просто хочу, чтобы простой пример в C++ принимал вектор (или матрицу) двойного ввода и выводил результат FFT (в идеале с std :: complex).

+0

Я предполагаю, что вы имеете в виду [этих примеров] (https://software.intel.com/en-us/node/471390), возможно, более конкретно «C Интерфейс» те. Если это так, убедитесь, что вы прочитали следующую ссылку [Фурье преобразования] (https://software.intel.com/en-us/node/470818#8EB0A29C-06D8-4C97-ACD0-C8A320501A6A) вверху. – SleuthEye

+0

@SleuthEye Да, я имел в виду их. Я лично не считаю эти раздутые примеры полезными, но, вероятно, этого достаточно для других. Я бы хотел найти более простые примеры. Кажется, я, вероятно, буду с ними связан. –

+0

Я продолжал проверять официальные примеры, но некоторые из них даже не компилируются ... Это не очень хороший способ начать с ... –

ответ

5

Я закончил тестирование нескольких вещей, и я, наконец, закончил с этими тремя функциями, которые делают то, что я хочу, и что я рассмотрел простые примеры.

Я протестировал его на некоторых входах, и у меня были хорошие результаты. Тем не менее, я не проводил тщательного тестирования.

//Note after each operation status should be 0 on success 

std::vector<std::complex<float>> fft_complex(std::vector<std::complex<float>>& in){ 
    std::vector<std::complex<float>> out(in.size()); 

    DFTI_DESCRIPTOR_HANDLE descriptor; 
    MKL_LONG status; 

    status = DftiCreateDescriptor(&descriptor, DFTI_SINGLE, DFTI_COMPLEX, 1, in.size()); //Specify size and precision 
    status = DftiSetValue(descriptor, DFTI_PLACEMENT, DFTI_NOT_INPLACE); //Out of place FFT 
    status = DftiCommitDescriptor(descriptor); //Finalize the descriptor 
    status = DftiComputeForward(descriptor, in.data(), out.data()); //Compute the Forward FFT 
    status = DftiFreeDescriptor(&descriptor); //Free the descriptor 

    return out; 
} 

std::vector<std::complex<float>> fft_real(std::vector<float>& in_real){ 
    std::vector<std::complex<float>> in(in_real.size()); 

    std::copy(in_real.begin(), in_real.end(), in.begin()); 

    return fft_complex(in); 
} 

std::vector<float> ifft(std::vector<std::complex<float>>& in){ 
    std::vector<std::complex<float>> out(in.size()); 

    DFTI_DESCRIPTOR_HANDLE descriptor; 
    MKL_LONG status; 

    status = DftiCreateDescriptor(&descriptor, DFTI_SINGLE, DFTI_COMPLEX, 1, in.size()); //Specify size and precision 
    status = DftiSetValue(descriptor, DFTI_PLACEMENT, DFTI_NOT_INPLACE); //Out of place FFT 
    status = DftiSetValue(descriptor, DFTI_BACKWARD_SCALE, 1.0f/in.size()); //Scale down the output 
    status = DftiCommitDescriptor(descriptor); //Finalize the descriptor 
    status = DftiComputeBackward(descriptor, in.data(), out.data()); //Compute the Forward FFT 
    status = DftiFreeDescriptor(&descriptor); //Free the descriptor 

    std::vector<float> output(out.size()); 

    for(std::size_t i = 0; i < out.size(); ++i){ 
     output[i] = out[i].real(); 
    } 

    return output; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^