kfr

Fast, modern C++ DSP framework, FFT, Sample Rate Conversion, FIR/IIR/Biquad Filters (SSE, AVX, AVX-512, ARM NEON)
Log | Files | Refs | README

commit e89649c454cfab1d3a275ac1d79000f6038fada6
parent 5e976f4c9200700b2c4b63859a49af65198ef198
Author: d.levin256@gmail.com <d.levin256@gmail.com>
Date:   Fri, 14 Jun 2019 09:36:18 +0000

DFT shared library

Diffstat:
Mdft/CMakeLists.txt | 53++++++++++++++++++++++++++++++++++++++++++++++++++---
Mexamples/CMakeLists.txt | 4++++
Mexamples/dft.cpp | 8+++++++-
Minclude/kfr/cident.h | 24+++++++++++++++++++++++-
Minclude/kfr/dft/dft_c.h | 78+++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
Minclude/kfr/dft/fft.hpp | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Minclude/kfr/dft/impl/dft-src.cpp | 63+++++++++++++++++++++++++++++++++++++++++++++++----------------
Msources.cmake | 1-
Mupdate-sources.py | 9+++++----
9 files changed, 274 insertions(+), 51 deletions(-)

diff --git a/dft/CMakeLists.txt b/dft/CMakeLists.txt @@ -18,6 +18,22 @@ cmake_minimum_required(VERSION 3.1) if (MSVC) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") +endif () + +if(APPLE) + add_compile_options(-mmacosx-version-min=10.9) +endif() + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/bin) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/bin) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/lib) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/lib) + +if (MSVC) set(LIBABI "vc${MSVC_TOOLSET_VERSION}") elseif (WIN32) set(LIBABI "mingw") @@ -44,16 +60,48 @@ message(STATUS "LIBABI = ${LIBABI}") add_custom_target(kfr_multiarch_dft) +add_library(kfr_multidft INTERFACE) +target_link_libraries(kfr_multidft INTERFACE kfr) +if (NOT WIN32) + add_library(kfr_multidft_pic INTERFACE) + target_link_libraries(kfr_multidft_pic INTERFACE kfr) +endif () + function(add_dft_library ARCH) add_library(kfr_dft_${LIBABI}_${ARCH} STATIC ${KFR_DFT_SRC}) target_link_libraries(kfr_dft_${LIBABI}_${ARCH} kfr) - target_set_arch(kfr_dft_${LIBABI}_${ARCH} PUBLIC ${ARCH}) + target_set_arch(kfr_dft_${LIBABI}_${ARCH} PRIVATE ${ARCH}) target_compile_options(kfr_dft_${LIBABI}_${ARCH} PRIVATE -Xclang -ffast-math) add_dependencies(kfr_multiarch_dft kfr_dft_${LIBABI}_${ARCH}) + target_link_libraries(kfr_multidft INTERFACE kfr_dft_${LIBABI}_${ARCH}) + + if (NOT WIN32) + add_library(kfr_dft_${LIBABI}_${ARCH}_pic STATIC ${KFR_DFT_SRC}) + set_property(TARGET kfr_dft_${LIBABI}_${ARCH}_pic PROPERTY POSITION_INDEPENDENT_CODE 1) + target_link_libraries(kfr_dft_${LIBABI}_${ARCH}_pic kfr) + target_set_arch(kfr_dft_${LIBABI}_${ARCH}_pic PRIVATE ${ARCH}) + target_compile_options(kfr_dft_${LIBABI}_${ARCH}_pic PRIVATE -Xclang -ffast-math) + + target_link_libraries(kfr_multidft_pic INTERFACE kfr_dft_${LIBABI}_${ARCH}_pic) + endif() endfunction() add_dft_library(sse2) add_dft_library(sse41) add_dft_library(avx) add_dft_library(avx2) -add_dft_library(avx512) -\ No newline at end of file +add_dft_library(avx512) + +add_library(kfrdft SHARED ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/dft-src.cpp) +target_compile_definitions(kfrdft PRIVATE -DKFR_DFT_MULTI=1 -DKFR_BUILDING_DLL=1) + +if (WIN32) + target_link_libraries(kfrdft PRIVATE kfr kfr_multidft) +else () + target_link_libraries(kfrdft PRIVATE kfr kfr_multidft_pic) + + if (APPLE) + else () + set_property(TARGET kfrdft APPEND PROPERTY LINK_LIBRARIES -nodefaultlibs -Wl,-Bdynamic -lm -lc -Wl,-Bstatic -lstdc++ -lgcc -s) + endif () +endif() diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt @@ -43,4 +43,8 @@ target_link_libraries(sample_rate_conversion kfr kfr_io use_arch) if (ENABLE_DFT) add_executable(dft dft.cpp) target_link_libraries(dft kfr kfr_dft use_arch) + if (ENABLE_DFT_MULTIARCH) + target_link_libraries(dft kfr_multidft) + target_compile_definitions(dft PRIVATE -DKFR_DFT_MULTI=1) + endif () endif () diff --git a/examples/dft.cpp b/examples/dft.cpp @@ -23,7 +23,13 @@ int main() univector<complex<fbase>, size> out = scalar(qnan); // initialize fft - const dft_plan<fbase> dft(size); + const dft_plan<fbase> dft( +#ifdef KFR_DFT_MULTI + cpu_t::runtime, +#endif + size); + + dft.dump(); // allocate work buffer for fft (if needed) univector<u8> temp(dft.temp_size); diff --git a/include/kfr/cident.h b/include/kfr/cident.h @@ -28,6 +28,8 @@ extern char* gets(char* __s); #define CMT_ARCH_AVX512 1 #define CMT_ARCH_AVX2 1 #define CMT_ARCH_AVX 1 +#define CMT_ARCH_SSE4_2 1 +#define CMT_ARCH_SSE4_1 1 #define CMT_ARCH_SSE42 1 #define CMT_ARCH_SSE41 1 #define CMT_ARCH_SSSE3 1 @@ -38,6 +40,8 @@ extern char* gets(char* __s); #if defined __AVX2__ && !defined CMT_ARCH_AVX2 #define CMT_ARCH_AVX2 1 #define CMT_ARCH_AVX 1 +#define CMT_ARCH_SSE4_2 1 +#define CMT_ARCH_SSE4_1 1 #define CMT_ARCH_SSE42 1 #define CMT_ARCH_SSE41 1 #define CMT_ARCH_SSSE3 1 @@ -47,6 +51,8 @@ extern char* gets(char* __s); #endif #if defined __AVX__ && !defined CMT_ARCH_AVX #define CMT_ARCH_AVX 1 +#define CMT_ARCH_SSE4_2 1 +#define CMT_ARCH_SSE4_1 1 #define CMT_ARCH_SSE42 1 #define CMT_ARCH_SSE41 1 #define CMT_ARCH_SSSE3 1 @@ -56,6 +62,8 @@ extern char* gets(char* __s); #endif #if defined __SSE4_2__ && !defined CMT_ARCH_SSE4_2 #define CMT_ARCH_SSE4_2 1 +#define CMT_ARCH_SSE42 1 +#define CMT_ARCH_SSE4_1 1 #define CMT_ARCH_SSE41 1 #define CMT_ARCH_SSSE3 1 #define CMT_ARCH_SSE3 1 @@ -64,6 +72,7 @@ extern char* gets(char* __s); #endif #if defined __SSE4_1__ && !defined CMT_ARCH_SSE4_1 #define CMT_ARCH_SSE4_1 1 +#define CMT_ARCH_SSE41 1 #define CMT_ARCH_SSSE3 1 #define CMT_ARCH_SSE3 1 #define CMT_ARCH_SSE2 1 @@ -115,20 +124,33 @@ extern char* gets(char* __s); #if defined CMT_ARCH_AVX512 #define CMT_ARCH_NAME avx512 +#define CMT_ARCH_IS_AVX512 1 #elif defined CMT_ARCH_AVX2 #define CMT_ARCH_NAME avx2 +#define CMT_ARCH_IS_AVX2 1 #elif defined CMT_ARCH_AVX #define CMT_ARCH_NAME avx -#elif defined CMT_ARCH_SSE4_1 +#define CMT_ARCH_IS_AVX 1 +#elif defined CMT_ARCH_SSE42 +#define CMT_ARCH_NAME sse42 +#define CMT_ARCH_IS_SSE42 1 +#elif defined CMT_ARCH_SSE41 #define CMT_ARCH_NAME sse41 +#define CMT_ARCH_IS_SSE4 1 #elif defined CMT_ARCH_SSSE3 #define CMT_ARCH_NAME ssse3 +#define CMT_ARCH_IS_SSSE3 1 #elif defined CMT_ARCH_SSE3 #define CMT_ARCH_NAME sse3 +#define CMT_ARCH_IS_SSE3 1 #elif defined CMT_ARCH_SSE2 #define CMT_ARCH_NAME sse2 +#define CMT_ARCH_IS_SSE2 1 #elif defined CMT_ARCH_SSE #define CMT_ARCH_NAME sse +#define CMT_ARCH_IS_SSE 1 +#else +#define CMT_ARCH_IS_GENERIC 1 #endif #elif defined(CMT_ARCH_ARM) diff --git a/include/kfr/dft/dft_c.h b/include/kfr/dft/dft_c.h @@ -28,6 +28,26 @@ #include <stddef.h> #include <stdint.h> +#if defined(_M_X64) || defined(__x86_64__) +#define KFR_CDECL +#else +#ifdef _WIN32 +#define KFR_CDECL __cdecl +#else +#define KFR_CDECL __attribute__((__cdecl__)) +#endif +#endif + +#ifdef _WIN32 +#ifdef KFR_BUILDING_DLL +#define KFR_API_SPEC KFR_CDECL __declspec(dllexport) +#else +#define KFR_API_SPEC KFR_CDECL __declspec(dllimport) +#endif +#else +#define KFR_API_SPEC KFR_CDECL +#endif + #ifdef __cplusplus extern "C" { @@ -57,46 +77,54 @@ extern "C" size_t size; } KFR_DFT_REAL_PLAN_F64; - enum KFR_DFT_PACK_FORMAT + typedef enum KFR_DFT_PACK_FORMAT { Perm = 0, CCs = 1 - }; + } KFR_DFT_PACK_FORMAT; // Complex DFT plans - KFR_DFT_PLAN_F32* kfr_dft_create_plan_f32(size_t size); - KFR_DFT_PLAN_F64* kfr_dft_create_plan_f64(size_t size); + KFR_API_SPEC KFR_DFT_PLAN_F32* kfr_dft_create_plan_f32(size_t size); + KFR_API_SPEC KFR_DFT_PLAN_F64* kfr_dft_create_plan_f64(size_t size); - void kfr_dft_execute_f32(KFR_DFT_PLAN_F32* plan, size_t size, float* out, const float* in, uint8_t* temp); - void kfr_dft_execute_f64(KFR_DFT_PLAN_F64* plan, size_t size, double* out, const double* in, - uint8_t* temp); + KFR_API_SPEC void kfr_dft_dump_f32(KFR_DFT_PLAN_F32* plan); + KFR_API_SPEC void kfr_dft_dump_f64(KFR_DFT_PLAN_F64* plan); - void kfr_dft_execute_inverse_f32(KFR_DFT_PLAN_F32* plan, size_t size, float* out, const float* in, - uint8_t* temp); - void kfr_dft_execute_inverse_f64(KFR_DFT_PLAN_F64* plan, size_t size, double* out, const double* in, - uint8_t* temp); + KFR_API_SPEC void kfr_dft_execute_f32(KFR_DFT_PLAN_F32* plan, float* out, const float* in, uint8_t* temp); + KFR_API_SPEC void kfr_dft_execute_f64(KFR_DFT_PLAN_F64* plan, double* out, const double* in, + uint8_t* temp); - void kfr_dft_delete_plan_f32(KFR_DFT_PLAN_F32* plan); - void kfr_dft_delete_plan_f64(KFR_DFT_PLAN_F64* plan); + KFR_API_SPEC void kfr_dft_execute_inverse_f32(KFR_DFT_PLAN_F32* plan, float* out, const float* in, + uint8_t* temp); + KFR_API_SPEC void kfr_dft_execute_inverse_f64(KFR_DFT_PLAN_F64* plan, double* out, const double* in, + uint8_t* temp); + + KFR_API_SPEC void kfr_dft_delete_plan_f32(KFR_DFT_PLAN_F32* plan); + KFR_API_SPEC void kfr_dft_delete_plan_f64(KFR_DFT_PLAN_F64* plan); // Real DFT plans - KFR_DFT_REAL_PLAN_F32* kfr_dft_create_real_plan_f32(size_t size, KFR_DFT_PACK_FORMAT pack_format); - KFR_DFT_REAL_PLAN_F64* kfr_dft_create_real_plan_f64(size_t size, KFR_DFT_PACK_FORMAT pack_format); + KFR_API_SPEC KFR_DFT_REAL_PLAN_F32* kfr_dft_create_real_plan_f32(size_t size, + KFR_DFT_PACK_FORMAT pack_format); + KFR_API_SPEC KFR_DFT_REAL_PLAN_F64* kfr_dft_create_real_plan_f64(size_t size, + KFR_DFT_PACK_FORMAT pack_format); + + KFR_API_SPEC void kfr_dft_dump_real_f32(KFR_DFT_REAL_PLAN_F32* plan); + KFR_API_SPEC void kfr_dft_dump_real_f64(KFR_DFT_REAL_PLAN_F64* plan); - void kfr_dft_execute_real_f32(KFR_DFT_REAL_PLAN_F32* plan, size_t size, float* out, const float* in, - uint8_t* temp); - void kfr_dft_execute_real_f64(KFR_DFT_REAL_PLAN_F64* plan, size_t size, double* out, const double* in, - uint8_t* temp); + KFR_API_SPEC void kfr_dft_execute_real_f32(KFR_DFT_REAL_PLAN_F32* plan, float* out, const float* in, + uint8_t* temp); + KFR_API_SPEC void kfr_dft_execute_real_f64(KFR_DFT_REAL_PLAN_F64* plan, double* out, const double* in, + uint8_t* temp); - void kfr_dft_execute_real_inverse_f32(KFR_DFT_REAL_PLAN_F32* plan, size_t size, float* out, - const float* in, uint8_t* temp); - void kfr_dft_execute_real_inverse_f64(KFR_DFT_REAL_PLAN_F64* plan, size_t size, double* out, - const double* in, uint8_t* temp); + KFR_API_SPEC void kfr_dft_execute_real_inverse_f32(KFR_DFT_REAL_PLAN_F32* plan, float* out, + const float* in, uint8_t* temp); + KFR_API_SPEC void kfr_dft_execute_real_inverse_f64(KFR_DFT_REAL_PLAN_F64* plan, double* out, + const double* in, uint8_t* temp); - void kfr_dft_delete_real_plan_f32(KFR_DFT_REAL_PLAN_F32* plan); - void kfr_dft_delete_real_plan_f64(KFR_DFT_REAL_PLAN_F64* plan); + KFR_API_SPEC void kfr_dft_delete_real_plan_f32(KFR_DFT_REAL_PLAN_F32* plan); + KFR_API_SPEC void kfr_dft_delete_real_plan_f64(KFR_DFT_REAL_PLAN_F64* plan); #ifdef __cplusplus } diff --git a/include/kfr/dft/fft.hpp b/include/kfr/dft/fft.hpp @@ -133,6 +133,35 @@ template <typename T> void dft_real_initialize(dft_plan_real<T>& plan); } // namespace CMT_ARCH_NAME +#ifdef KFR_DFT_MULTI + +#define KFR_DFT_PROTO(arch) \ + namespace arch \ + { \ + template <typename T> \ + void dft_initialize(dft_plan<T>& plan); \ + template <typename T> \ + void dft_real_initialize(dft_plan_real<T>& plan); \ + } + +#if !CMT_ARCH_IS_AVX512 +KFR_DFT_PROTO(avx512) +#endif +#if !CMT_ARCH_IS_AVX2 +KFR_DFT_PROTO(avx2) +#endif +#if !CMT_ARCH_IS_AVX +KFR_DFT_PROTO(avx) +#endif +#if !CMT_ARCH_IS_SSE41 +KFR_DFT_PROTO(sse41) +#endif +#if !CMT_ARCH_IS_SSE2 +KFR_DFT_PROTO(sse2) +#endif + +#endif + /// @brief Class for performing DFT/FFT template <typename T> struct dft_plan @@ -140,6 +169,34 @@ struct dft_plan size_t size; size_t temp_size; +#ifdef KFR_DFT_MULTI + explicit dft_plan(cpu_t cpu, size_t size, dft_order order = dft_order::normal) + : size(size), temp_size(0), data_size(0) + { + if (cpu == cpu_t::runtime) + cpu = get_cpu(); + switch (cpu) + { + case cpu_t::avx512: + avx512::dft_initialize(*this); + break; + case cpu_t::avx2: + avx2::dft_initialize(*this); + break; + case cpu_t::avx: + avx::dft_initialize(*this); + break; + case cpu_t::sse42: + case cpu_t::sse41: + sse41::dft_initialize(*this); + break; + default: + sse2::dft_initialize(*this); + break; + } + } +#endif + explicit dft_plan(size_t size, dft_order order = dft_order::normal) : size(size), temp_size(0), data_size(0) { @@ -277,6 +334,34 @@ struct dft_plan_real : dft_plan<T> dft_pack_format fmt; dft_stage_ptr<T> fmt_stage; +#ifdef KFR_DFT_MULTI + explicit dft_plan_real(cpu_t cpu, size_t size, dft_pack_format fmt = dft_pack_format::CCs) + : dft_plan<T>(typename dft_plan<T>::noinit{}, size / 2), size(size), fmt(fmt) + { + if (cpu == cpu_t::runtime) + cpu = get_cpu(); + switch (cpu) + { + case cpu_t::avx512: + avx512::dft_real_initialize(*this); + break; + case cpu_t::avx2: + avx2::dft_real_initialize(*this); + break; + case cpu_t::avx: + avx::dft_real_initialize(*this); + break; + case cpu_t::sse42: + case cpu_t::sse41: + sse41::dft_real_initialize(*this); + break; + default: + sse2::dft_real_initialize(*this); + break; + } + } +#endif + explicit dft_plan_real(size_t size, dft_pack_format fmt = dft_pack_format::CCs) : dft_plan<T>(typename dft_plan<T>::noinit{}, size / 2), size(size), fmt(fmt) { diff --git a/include/kfr/dft/impl/dft-src.cpp b/include/kfr/dft/impl/dft-src.cpp @@ -33,36 +33,51 @@ namespace kfr extern "C" { +#ifdef KFR_DFT_MULTI +#define KFR_CPU_ARG cpu_t::runtime, +#else +#define KFR_CPU_ARG +#endif + KFR_DFT_PLAN_F32* kfr_dft_create_plan_f32(size_t size) { - return reinterpret_cast<KFR_DFT_PLAN_F32*>(new kfr::dft_plan<float>(size)); + if (size < 2) + return nullptr; + if (size > 16777216) + return nullptr; + return reinterpret_cast<KFR_DFT_PLAN_F32*>(new kfr::dft_plan<float>(KFR_CPU_ARG size)); } KFR_DFT_PLAN_F64* kfr_dft_create_plan_f64(size_t size) { - return reinterpret_cast<KFR_DFT_PLAN_F64*>(new kfr::dft_plan<double>(size)); + if (size < 2) + return nullptr; + if (size > 16777216) + return nullptr; + return reinterpret_cast<KFR_DFT_PLAN_F64*>(new kfr::dft_plan<double>(KFR_CPU_ARG size)); } - void kfr_dft_execute_f32(KFR_DFT_PLAN_F32* plan, size_t, float* out, const float* in, uint8_t* temp) + void kfr_dft_dump_f32(KFR_DFT_PLAN_F32* plan) { reinterpret_cast<kfr::dft_plan<float>*>(plan)->dump(); } + void kfr_dft_dump_f64(KFR_DFT_PLAN_F64* plan) { reinterpret_cast<kfr::dft_plan<double>*>(plan)->dump(); } + + void kfr_dft_execute_f32(KFR_DFT_PLAN_F32* plan, float* out, const float* in, uint8_t* temp) { reinterpret_cast<kfr::dft_plan<float>*>(plan)->execute( reinterpret_cast<kfr::complex<float>*>(out), reinterpret_cast<const kfr::complex<float>*>(in), temp, kfr::cfalse); } - void kfr_dft_execute_f64(KFR_DFT_PLAN_F64* plan, size_t, double* out, const double* in, uint8_t* temp) + void kfr_dft_execute_f64(KFR_DFT_PLAN_F64* plan, double* out, const double* in, uint8_t* temp) { reinterpret_cast<kfr::dft_plan<double>*>(plan)->execute( reinterpret_cast<kfr::complex<double>*>(out), reinterpret_cast<const kfr::complex<double>*>(in), temp, kfr::cfalse); } - void kfr_dft_execute_inverse_f32(KFR_DFT_PLAN_F32* plan, size_t, float* out, const float* in, - uint8_t* temp) + void kfr_dft_execute_inverse_f32(KFR_DFT_PLAN_F32* plan, float* out, const float* in, uint8_t* temp) { reinterpret_cast<kfr::dft_plan<float>*>(plan)->execute( reinterpret_cast<kfr::complex<float>*>(out), reinterpret_cast<const kfr::complex<float>*>(in), temp, kfr::ctrue); } - void kfr_dft_execute_inverse_f64(KFR_DFT_PLAN_F64* plan, size_t, double* out, const double* in, - uint8_t* temp) + void kfr_dft_execute_inverse_f64(KFR_DFT_PLAN_F64* plan, double* out, const double* in, uint8_t* temp) { reinterpret_cast<kfr::dft_plan<double>*>(plan)->execute( reinterpret_cast<kfr::complex<double>*>(out), reinterpret_cast<const kfr::complex<double>*>(in), @@ -82,34 +97,49 @@ extern "C" KFR_DFT_REAL_PLAN_F32* kfr_dft_create_real_plan_f32(size_t size, KFR_DFT_PACK_FORMAT pack_format) { + if (size < 4) + return nullptr; + if (size > 16777216) + return nullptr; return reinterpret_cast<KFR_DFT_REAL_PLAN_F32*>( - new kfr::dft_plan_real<float>(size, static_cast<dft_pack_format>(pack_format))); + new kfr::dft_plan_real<float>(KFR_CPU_ARG size, static_cast<dft_pack_format>(pack_format))); } KFR_DFT_REAL_PLAN_F64* kfr_dft_create_real_plan_f64(size_t size, KFR_DFT_PACK_FORMAT pack_format) { + if (size < 4) + return nullptr; + if (size > 16777216) + return nullptr; return reinterpret_cast<KFR_DFT_REAL_PLAN_F64*>( - new kfr::dft_plan_real<double>(size, static_cast<dft_pack_format>(pack_format))); + new kfr::dft_plan_real<double>(KFR_CPU_ARG size, static_cast<dft_pack_format>(pack_format))); + } + + KFR_API_SPEC void kfr_dft_dump_real_f32(KFR_DFT_REAL_PLAN_F32* plan) + { + reinterpret_cast<kfr::dft_plan_real<float>*>(plan)->dump(); + } + KFR_API_SPEC void kfr_dft_dump_real_f64(KFR_DFT_REAL_PLAN_F64* plan) + { + reinterpret_cast<kfr::dft_plan_real<double>*>(plan)->dump(); } - void kfr_dft_execute_real_f32(KFR_DFT_REAL_PLAN_F32* plan, size_t, float* out, const float* in, - uint8_t* temp) + void kfr_dft_execute_real_f32(KFR_DFT_REAL_PLAN_F32* plan, float* out, const float* in, uint8_t* temp) { reinterpret_cast<kfr::dft_plan_real<float>*>(plan)->execute( reinterpret_cast<kfr::complex<float>*>(out), in, temp); } - void kfr_dft_execute_real_f64(KFR_DFT_REAL_PLAN_F64* plan, size_t, double* out, const double* in, - uint8_t* temp) + void kfr_dft_execute_real_f64(KFR_DFT_REAL_PLAN_F64* plan, double* out, const double* in, uint8_t* temp) { reinterpret_cast<kfr::dft_plan_real<double>*>(plan)->execute( reinterpret_cast<kfr::complex<double>*>(out), in, temp); } - void kfr_dft_execute_real_inverse_f32(KFR_DFT_REAL_PLAN_F32* plan, size_t, float* out, const float* in, + void kfr_dft_execute_real_inverse_f32(KFR_DFT_REAL_PLAN_F32* plan, float* out, const float* in, uint8_t* temp) { reinterpret_cast<kfr::dft_plan_real<float>*>(plan)->execute( out, reinterpret_cast<const kfr::complex<float>*>(in), temp); } - void kfr_dft_execute_real_inverse__f64(KFR_DFT_REAL_PLAN_F64* plan, size_t, double* out, const double* in, + void kfr_dft_execute_real_inverse__f64(KFR_DFT_REAL_PLAN_F64* plan, double* out, const double* in, uint8_t* temp, KFR_DFT_PACK_FORMAT pack_format) { reinterpret_cast<kfr::dft_plan_real<double>*>(plan)->execute( @@ -125,4 +155,5 @@ extern "C" delete reinterpret_cast<kfr::dft_plan_real<double>*>(plan); } } + } // namespace kfr diff --git a/sources.cmake b/sources.cmake @@ -152,7 +152,6 @@ set( ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/convolution-impl.cpp ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/dft-impl-f32.cpp ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/dft-impl-f64.cpp - ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/dft-src.cpp ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/fft-impl-f32.cpp ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/fft-impl-f64.cpp ) diff --git a/update-sources.py b/update-sources.py @@ -7,14 +7,15 @@ import subprocess import sys import glob -def list_sources(name, searchpath, masks): +def list_sources(name, searchpath, masks, exclude = []): global cmake path = os.path.join(os.path.dirname(os.path.realpath(__file__)), searchpath) filenames = [] for root, dirnames, files in os.walk(path, path): for mask in masks: - for filename in fnmatch.filter(files, mask): - filenames.append(os.path.relpath(os.path.join(root, filename), path).replace('\\','/')) + for filename in fnmatch.filter(files, mask):= + if filename not in exclude: + filenames.append(os.path.relpath(os.path.join(root, filename), path).replace('\\','/')) cmake += """ set( @@ -30,7 +31,7 @@ cmake = """ """ list_sources("KFR_SRC", "include", ['*.hpp', '*.h', '*.i', '*.inc']) -list_sources("KFR_DFT_SRC", "include/kfr/dft", ['*.cpp']) +list_sources("KFR_DFT_SRC", "include/kfr/dft", ['*.cpp'], ["dft-src.cpp"]) list_sources("KFR_IO_SRC", "include/kfr/io", ['*.cpp']) list_sources("KFR_UNITTEST_SRC", "tests/unit", ['*.cpp'])