45 std::sort (
list.begin(),
list.end(), [] (
Engine*
a,
Engine*
b) { return b->enginePriority < a->enginePriority; });
56 if (
auto* instance =
engine->create (order))
73template <
typename InstanceToUse>
116 const float scaleFactor = 1.0f / (float)
size;
119 output[
i] *= scaleFactor;
172 scratch[
i] = {
d[
i], 0 };
182 input[
i] = std::conj (input[
size -
i]);
184 perform (input, scratch,
true);
188 d[
i] = scratch[
i].real();
189 d[
i +
size] = scratch[
i].imag();
205 auto phase =
i * inverseFactor;
208 (float) std::sin (phase) };
215 auto phase =
i * inverseFactor;
218 (float) std::sin (phase) };
226 inverse ? other.real() : -other.real() };
239 auto root = (
int) std::sqrt ((
double)
fftSize);
244 while ((
n % divisor) != 0)
246 if (divisor == 2) divisor = 3;
247 else if (divisor == 4) divisor = 2;
256 jassert (divisor == 1 || divisor == 2 || divisor == 4);
276 auto factor = *facs++;
277 auto* originalOutput = output;
278 auto* outputEnd = output + factor.radix * factor.length;
280 if (stride == 1 && factor.radix <= 5)
282 for (
int i = 0;
i < factor.radix; ++
i)
283 perform (input + stride * strideIn *
i, output +
i * factor.length, stride * factor.radix, strideIn, facs);
289 if (factor.length == 1)
294 input += stride * strideIn;
296 while (output < outputEnd);
302 perform (input, output, stride * factor.radix, strideIn, facs);
303 input += stride * strideIn;
304 output += factor.length;
306 while (output < outputEnd);
309 butterfly (factor, originalOutput, stride);
314 switch (factor.radix)
326 for (
int i = 0;
i < factor.length; ++
i)
328 for (
int k =
i, q1 = 0; q1 < factor.radix; ++q1)
331 scratch[q1] =
data[
k];
336 for (
int k =
i, q1 = 0; q1 < factor.radix; ++q1)
338 int twiddleIndex = 0;
339 data[
k] = scratch[0];
341 for (
int q = 1;
q < factor.radix; ++
q)
343 twiddleIndex += stride *
k;
368 *dataEnd++ = *
data -
s;
375 auto lengthX2 =
length * 2;
376 auto lengthX3 =
length * 3;
378 auto strideX2 = stride * 2;
379 auto strideX3 = stride * 3;
382 auto* twiddle2 = twiddle1;
383 auto* twiddle3 = twiddle1;
388 auto s1 =
data[lengthX2] * *twiddle2;
389 auto s2 =
data[lengthX3] * *twiddle3;
390 auto s3 = s0; s3 += s2;
391 auto s4 = s0; s4 -= s2;
392 auto s5 = *
data; s5 -= s1;
396 data[lengthX2] -= s3;
398 twiddle2 += strideX2;
399 twiddle3 += strideX3;
405 s5.imag() + s4.real() };
407 data[lengthX3] = { s5.real() + s4.imag(),
408 s5.imag() - s4.real() };
413 s5.imag() - s4.real() };
415 data[lengthX3] = { s5.real() - s4.imag(),
416 s5.imag() + s4.real() };
436#if (JUCE_MAC || JUCE_IOS) && JUCE_USE_VDSP_FRAMEWORK
439 static constexpr int priority = 5;
441 static AppleFFT* create (
int order)
443 return new AppleFFT (order);
446 AppleFFT (
int orderToUse)
447 : order (
static_cast<vDSP_Length
> (orderToUse)),
448 fftSetup (vDSP_create_fftsetup (order, 2)),
449 forwardNormalisation (0.5f),
450 inverseNormalisation (1.0f /
static_cast<float> (1 << order))
455 if (fftSetup !=
nullptr)
457 vDSP_destroy_fftsetup (fftSetup);
464 auto size = (1 << order);
466 DSPSplitComplex splitInput (toSplitComplex (
const_cast<Complex<float>*
> (input)));
467 DSPSplitComplex splitOutput (toSplitComplex (output));
469 vDSP_fft_zop (fftSetup, &splitInput, 2, &splitOutput, 2,
470 order, inverse ? kFFTDirection_Inverse : kFFTDirection_Forward);
472 float factor = (inverse ? inverseNormalisation : forwardNormalisation * 2.0f);
473 vDSP_vsmul ((
float*) output, 1, &factor, (
float*) output, 1,
static_cast<size_t> (
size << 1));
476 void performRealOnlyForwardTransform (
float* inoutData,
bool ignoreNegativeFreqs)
const noexcept override
478 auto size = (1 << order);
480 auto splitInOut (toSplitComplex (inout));
482 inoutData[
size] = 0.0f;
483 vDSP_fft_zrip (fftSetup, &splitInOut, 2, order, kFFTDirection_Forward);
484 vDSP_vsmul (inoutData, 1, &forwardNormalisation, inoutData, 1,
static_cast<size_t> (
size << 1));
486 mirrorResult (inout, ignoreNegativeFreqs);
489 void performRealOnlyInverseTransform (
float* inoutData)
const noexcept override
492 auto size = (1 << order);
493 auto splitInOut (toSplitComplex (inout));
501 vDSP_fft_zrip (fftSetup, &splitInOut, 2, order, kFFTDirection_Inverse);
502 vDSP_vsmul (inoutData, 1, &inverseNormalisation, inoutData, 1,
static_cast<size_t> (
size << 1));
503 vDSP_vclr (inoutData +
size, 1,
static_cast<size_t> (
size));
510 auto size = (1 << order);
516 out[
i++] = {
out[0].imag(), 0.0 };
517 out[0] = {
out[0].real(), 0.0 };
519 if (! ignoreNegativeFreqs)
528 return {
reinterpret_cast<float*
> (
data),
529 reinterpret_cast<float*
> (
data) + 1};
535 float forwardNormalisation, inverseNormalisation;
538FFT::EngineImpl<AppleFFT> appleFFT;
543#if JUCE_DSP_USE_SHARED_FFTW || JUCE_DSP_USE_STATIC_FFTW
545#if JUCE_DSP_USE_STATIC_FFTW
548 void* fftwf_plan_dft_1d (
int,
void*,
void*,
int,
int);
549 void* fftwf_plan_dft_r2c_1d (
int,
void*,
void*,
int);
550 void* fftwf_plan_dft_c2r_1d (
int,
void*,
void*,
int);
551 void fftwf_destroy_plan (
void*);
552 void fftwf_execute_dft (
void*,
void*,
void*);
553 void fftwf_execute_dft_r2c (
void*,
void*,
void*);
554 void fftwf_execute_dft_c2r (
void*,
void*,
void*);
558struct FFTWImpl :
public FFT::Instance
560 #if JUCE_DSP_USE_STATIC_FFTW
563 static constexpr int priority = 10;
565 static constexpr int priority = 3;
569 using FFTWPlanRef = FFTWPlan*;
574 unaligned = (1 << 1),
580 FFTWPlanRef (*plan_dft_fftw) (unsigned, Complex<float>*, Complex<float>*,
int, unsigned);
581 FFTWPlanRef (*plan_r2c_fftw) (unsigned,
float*, Complex<float>*, unsigned);
582 FFTWPlanRef (*plan_c2r_fftw) (unsigned, Complex<float>*,
float*, unsigned);
583 void (*destroy_fftw) (FFTWPlanRef);
585 void (*execute_dft_fftw) (FFTWPlanRef,
const Complex<float>*, Complex<float>*);
586 void (*execute_r2c_fftw) (FFTWPlanRef,
float*, Complex<float>*);
587 void (*execute_c2r_fftw) (FFTWPlanRef, Complex<float>*,
float*);
589 #if JUCE_DSP_USE_STATIC_FFTW
590 template <
typename FuncPtr,
typename ActualSymbolType>
591 static bool symbol (FuncPtr& dst, ActualSymbolType sym)
593 dst =
reinterpret_cast<FuncPtr
> (sym);
597 template <
typename FuncPtr>
598 static bool symbol (DynamicLibrary&
lib, FuncPtr& dst,
const char*
name)
600 dst =
reinterpret_cast<FuncPtr
> (
lib.getFunction (
name));
601 return (dst !=
nullptr);
606 static FFTWImpl* create (
int order)
610 #if ! JUCE_DSP_USE_STATIC_FFTW
612 auto libName =
"libfftw3f.dylib";
614 auto libName =
"libfftw3f.dll";
616 auto libName =
"libfftw3f.so";
619 if (
lib.open (libName))
624 #if JUCE_DSP_USE_STATIC_FFTW
625 if (! Symbols::symbol (symbols.plan_dft_fftw, fftwf_plan_dft_1d))
return nullptr;
626 if (! Symbols::symbol (symbols.plan_r2c_fftw, fftwf_plan_dft_r2c_1d))
return nullptr;
627 if (! Symbols::symbol (symbols.plan_c2r_fftw, fftwf_plan_dft_c2r_1d))
return nullptr;
628 if (! Symbols::symbol (symbols.destroy_fftw, fftwf_destroy_plan))
return nullptr;
630 if (! Symbols::symbol (symbols.execute_dft_fftw, fftwf_execute_dft))
return nullptr;
631 if (! Symbols::symbol (symbols.execute_r2c_fftw, fftwf_execute_dft_r2c))
return nullptr;
632 if (! Symbols::symbol (symbols.execute_c2r_fftw, fftwf_execute_dft_c2r))
return nullptr;
634 if (! Symbols::symbol (
lib, symbols.plan_dft_fftw,
"fftwf_plan_dft_1d"))
return nullptr;
635 if (! Symbols::symbol (
lib, symbols.plan_r2c_fftw,
"fftwf_plan_dft_r2c_1d"))
return nullptr;
636 if (! Symbols::symbol (
lib, symbols.plan_c2r_fftw,
"fftwf_plan_dft_c2r_1d"))
return nullptr;
637 if (! Symbols::symbol (
lib, symbols.destroy_fftw,
"fftwf_destroy_plan"))
return nullptr;
639 if (! Symbols::symbol (
lib, symbols.execute_dft_fftw,
"fftwf_execute_dft"))
return nullptr;
640 if (! Symbols::symbol (
lib, symbols.execute_r2c_fftw,
"fftwf_execute_dft_r2c"))
return nullptr;
641 if (! Symbols::symbol (
lib, symbols.execute_c2r_fftw,
"fftwf_execute_dft_c2r"))
return nullptr;
644 return new FFTWImpl (
static_cast<size_t> (order), std::move (
lib), symbols);
650 FFTWImpl (
size_t orderToUse, DynamicLibrary&& libraryToUse,
const Symbols& symbols)
651 : fftwLibrary (std::
move (libraryToUse)), fftw (symbols), order (static_cast<size_t> (orderToUse))
655 auto n = (1u << order);
656 HeapBlock<Complex<float>>
in (
n),
out (
n);
658 c2cForward = fftw.plan_dft_fftw (
n,
in.getData(),
out.getData(), -1, unaligned | estimate);
659 c2cInverse = fftw.plan_dft_fftw (
n,
in.getData(),
out.getData(), +1, unaligned | estimate);
661 r2c = fftw.plan_r2c_fftw (
n, (
float*)
in.getData(),
in.getData(), unaligned | estimate);
662 c2r = fftw.plan_c2r_fftw (
n,
in.getData(), (
float*)
in.getData(), unaligned | estimate);
669 fftw.destroy_fftw (c2cForward);
670 fftw.destroy_fftw (c2cInverse);
671 fftw.destroy_fftw (r2c);
672 fftw.destroy_fftw (c2r);
675 void perform (
const Complex<float>* input, Complex<float>* output,
bool inverse)
const noexcept override
679 auto n = (1u << order);
680 fftw.execute_dft_fftw (c2cInverse, input, output);
681 FloatVectorOperations::multiply ((
float*) output, 1.0f /
static_cast<float> (
n), (
int)
n << 1);
685 fftw.execute_dft_fftw (c2cForward, input, output);
689 void performRealOnlyForwardTransform (
float* inputOutputData,
bool ignoreNegativeFreqs)
const noexcept override
694 auto*
out =
reinterpret_cast<Complex<float>*
> (inputOutputData);
696 fftw.execute_r2c_fftw (r2c, inputOutputData,
out);
698 auto size = (1 << order);
700 if (! ignoreNegativeFreqs)
705 void performRealOnlyInverseTransform (
float* inputOutputData)
const noexcept override
707 auto n = (1u << order);
709 fftw.execute_c2r_fftw (c2r, (Complex<float>*) inputOutputData, inputOutputData);
710 FloatVectorOperations::multiply ((
float*) inputOutputData, 1.0f /
static_cast<float> (
n), (
int)
n);
716 static CriticalSection& getFFTWPlanLock()
noexcept
718 static CriticalSection cs;
723 DynamicLibrary fftwLibrary;
727 FFTWPlanRef c2cForward, c2cInverse, r2c, c2r;
730FFT::EngineImpl<FFTWImpl> fftwEngine;
735#if JUCE_DSP_USE_INTEL_MKL
736struct IntelFFT :
public FFT::Instance
738 static constexpr int priority = 8;
740 static bool succeeded (MKL_LONG status)
noexcept {
return status == 0; }
742 static IntelFFT* create (
int orderToUse)
744 DFTI_DESCRIPTOR_HANDLE mklc2c, mklc2r;
746 if (DftiCreateDescriptor (&mklc2c, DFTI_SINGLE, DFTI_COMPLEX, 1, 1 << orderToUse) == 0)
748 if (succeeded (DftiSetValue (mklc2c, DFTI_PLACEMENT, DFTI_NOT_INPLACE))
749 && succeeded (DftiSetValue (mklc2c, DFTI_BACKWARD_SCALE, 1.0f /
static_cast<float> (1 << orderToUse)))
750 && succeeded (DftiCommitDescriptor (mklc2c)))
752 if (succeeded (DftiCreateDescriptor (&mklc2r, DFTI_SINGLE, DFTI_REAL, 1, 1 << orderToUse)))
754 if (succeeded (DftiSetValue (mklc2r, DFTI_PLACEMENT, DFTI_INPLACE))
755 && succeeded (DftiSetValue (mklc2r, DFTI_BACKWARD_SCALE, 1.0f /
static_cast<float> (1 << orderToUse)))
756 && succeeded (DftiCommitDescriptor (mklc2r)))
758 return new IntelFFT (
static_cast<size_t> (orderToUse), mklc2c, mklc2r);
761 DftiFreeDescriptor (&mklc2r);
765 DftiFreeDescriptor (&mklc2c);
771 IntelFFT (
size_t orderToUse, DFTI_DESCRIPTOR_HANDLE c2cToUse, DFTI_DESCRIPTOR_HANDLE cr2ToUse)
772 : order (orderToUse), c2c (c2cToUse), c2r (cr2ToUse)
777 DftiFreeDescriptor (&c2c);
778 DftiFreeDescriptor (&c2r);
781 void perform (
const Complex<float>* input, Complex<float>* output,
bool inverse)
const noexcept override
784 DftiComputeBackward (c2c, (
void*) input, output);
786 DftiComputeForward (c2c, (
void*) input, output);
789 void performRealOnlyForwardTransform (
float* inputOutputData,
bool ignoreNegativeFreqs)
const noexcept override
794 DftiComputeForward (c2r, inputOutputData);
796 auto*
out =
reinterpret_cast<Complex<float>*
> (inputOutputData);
797 auto size = (1 << order);
799 if (! ignoreNegativeFreqs)
804 void performRealOnlyInverseTransform (
float* inputOutputData)
const noexcept override
806 DftiComputeBackward (c2r, inputOutputData);
810 DFTI_DESCRIPTOR_HANDLE c2c, c2r;
813FFT::EngineImpl<IntelFFT> fftwEngine;
821#if _IPP_SEQUENTIAL_STATIC || _IPP_SEQUENTIAL_DYNAMIC || _IPP_PARALLEL_STATIC || _IPP_PARALLEL_DYNAMIC
822class IntelPerformancePrimitivesFFT :
public FFT::Instance
825 static constexpr auto priority = 9;
827 static IntelPerformancePrimitivesFFT* create (
const int order)
829 auto complexContext = Context<ComplexTraits>::create (order);
830 auto realContext = Context<RealTraits> ::create (order);
832 if (complexContext.isValid() && realContext.isValid())
833 return new IntelPerformancePrimitivesFFT (std::move (complexContext), std::move (realContext), order);
838 void perform (
const Complex<float>* input, Complex<float>* output,
bool inverse)
const noexcept override
842 ippsFFTInv_CToC_32fc (
reinterpret_cast<const Ipp32fc*
> (input),
843 reinterpret_cast<Ipp32fc*
> (output),
849 ippsFFTFwd_CToC_32fc (
reinterpret_cast<const Ipp32fc*
> (input),
850 reinterpret_cast<Ipp32fc*
> (output),
856 void performRealOnlyForwardTransform (
float* inoutData,
bool ignoreNegativeFreqs)
const noexcept override
858 ippsFFTFwd_RToCCS_32f_I (inoutData, real.specPtr, real.workBuf.get());
863 auto*
out =
reinterpret_cast<Complex<float>*
> (inoutData);
864 const auto size = (1 << order);
866 if (! ignoreNegativeFreqs)
871 void performRealOnlyInverseTransform (
float* inoutData)
const noexcept override
873 ippsFFTInv_CCSToR_32f_I (inoutData, real.specPtr, real.workBuf.get());
877 static constexpr auto flag = IPP_FFT_DIV_INV_BY_N;
878 static constexpr auto hint = ippAlgHintFast;
882 template <
typename Ptr>
883 void operator() (Ptr* ptr)
const noexcept { ippsFree (ptr); }
886 using IppPtr = std::unique_ptr<Ipp8u[], IppFree>;
888 template <
typename Traits>
891 using SpecPtr =
typename Traits::Spec*;
893 static Context create (
const int order)
895 int specSize = 0, initSize = 0, workSize = 0;
897 if (Traits::getSize (order,
flag,
hint, &specSize, &initSize, &workSize) != ippStsNoErr)
900 const auto initBuf = IppPtr (ippsMalloc_8u (initSize));
901 auto specBuf = IppPtr (ippsMalloc_8u (specSize));
902 SpecPtr specPtr =
nullptr;
904 if (Traits::init (&specPtr, order,
flag,
hint, specBuf.get(), initBuf.get()) != ippStsNoErr)
907 return { std::move (specBuf), IppPtr (ippsMalloc_8u (workSize)), specPtr };
912 Context (IppPtr&& spec, IppPtr&& work, typename Traits::Spec* ptr)
noexcept
913 : specBuf (std::move (spec)), workBuf (std::move (work)), specPtr (ptr)
918 IppPtr specBuf, workBuf;
919 SpecPtr specPtr =
nullptr;
924 static constexpr auto getSize = ippsFFTGetSize_C_32fc;
925 static constexpr auto init = ippsFFTInit_C_32fc;
926 using Spec = IppsFFTSpec_C_32fc;
931 static constexpr auto getSize = ippsFFTGetSize_R_32f;
932 static constexpr auto init = ippsFFTInit_R_32f;
933 using Spec = IppsFFTSpec_R_32f;
936 IntelPerformancePrimitivesFFT (Context<ComplexTraits>&& complexToUse,
937 Context<RealTraits>&& realToUse,
938 const int orderToUse)
939 : cplx (std::
move (complexToUse)),
940 real (std::
move (realToUse)),
944 Context<ComplexTraits> cplx;
945 Context<RealTraits> real;
949FFT::EngineImpl<IntelPerformancePrimitivesFFT> intelPerformancePrimitivesFFT;
969 engine->perform (input, output, inverse);
975 engine->performRealOnlyForwardTransform (inputOutputData, ignoreNegativeFreqs);
981 engine->performRealOnlyInverseTransform (inputOutputData);
992 const auto limit = ignoreNegativeFreqs ? (
size / 2) + 1 :
size;
995 inputOutputData[
i] = std::abs (
out[
i]);
#define noexcept
Definition DistrhoDefines.h:72
uint8_t a
Definition Spc_Cpu.h:141
T limit(T val, T min, T max)
Definition Util.h:78
Definition juce_Array.h:56
Definition juce_HeapBlock.h:87
ElementType * getData() const noexcept
Definition juce_HeapBlock.h:194
Definition juce_SpinLock.h:42
GenericScopedLock< SpinLock > ScopedLockType
Definition juce_SpinLock.h:73
int size
Definition juce_FFT.h:125
void performFrequencyOnlyForwardTransform(float *inputOutputData, bool onlyCalculateNonNegativeFrequencies=false) const noexcept
Definition juce_FFT.cpp:984
void performRealOnlyInverseTransform(float *inputOutputData) const noexcept
Definition juce_FFT.cpp:978
std::unique_ptr< Instance > engine
Definition juce_FFT.h:124
FFT(int order)
Definition juce_FFT.cpp:954
void performRealOnlyForwardTransform(float *inputOutputData, bool onlyCalculateNonNegativeFrequencies=false) const noexcept
Definition juce_FFT.cpp:972
void perform(const Complex< float > *input, Complex< float > *output, bool inverse) const noexcept
Definition juce_FFT.cpp:966
register unsigned k
Definition inflate.c:946
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
static PuglViewHint hint
Definition pugl.h:1707
static const char * name
Definition pugl.h:1582
JSAMPIMAGE data
Definition jpeglib.h:945
#define JUCE_BEGIN_IGNORE_WARNINGS_MSVC(warnings)
Definition juce_CompilerWarnings.h:198
#define JUCE_END_IGNORE_WARNINGS_MSVC
Definition juce_CompilerWarnings.h:199
static const LV2_Lib_Descriptor lib
Definition lib_descriptor.c:100
float in
Definition lilv_test.c:1460
float out
Definition lilv_test.c:1461
void move(void *from, void *to)
Definition juce_FixedSizeFunction.h:53
Definition juce_AudioBlock.h:29
FFT::EngineImpl< FFTFallback > fftFallback
Definition juce_FFT.cpp:432
std::complex< Type > Complex
Definition juce_dsp.h:194
Definition carla_juce.cpp:31
CriticalSection::ScopedLockType ScopedLock
Definition juce_CriticalSection.h:186
Type unalignedPointerCast(void *ptr) noexcept
Definition juce_Memory.h:88
@ list
Definition juce_AccessibilityRole.h:56
constexpr int numElementsInArray(Type(&)[N]) noexcept
Definition juce_MathsFunctions.h:344
void zeromem(void *memory, size_t numBytes) noexcept
Definition juce_Memory.h:28
png_uint_32 length
Definition png.c:2247
static constexpr FloatType pi
Definition juce_MathsFunctions.h:382
Definition juce_FFT.cpp:40
static FFT::Instance * createBestEngineForPlatform(int order)
Definition juce_FFT.cpp:53
virtual ~Engine()=default
int enginePriority
Definition juce_FFT.cpp:70
static Array< Engine * > & getEngines()
Definition juce_FFT.cpp:64
Engine(int priorityToUse)
Definition juce_FFT.cpp:41
virtual FFT::Instance * create(int order) const =0
Definition juce_FFT.cpp:75
FFT::Instance * create(int order) const override
Definition juce_FFT.cpp:77
EngineImpl()
Definition juce_FFT.cpp:76
Definition juce_FFT.cpp:32
virtual ~Instance()=default
virtual void performRealOnlyForwardTransform(float *, bool) const noexcept=0
virtual void perform(const Complex< float > *input, Complex< float > *output, bool inverse) const noexcept=0
virtual void performRealOnlyInverseTransform(float *) const noexcept=0
Definition juce_FFT.cpp:270
int radix
Definition juce_FFT.cpp:270
int length
Definition juce_FFT.cpp:270
Definition juce_FFT.cpp:195
void perform(const Complex< float > *input, Complex< float > *output) const noexcept
Definition juce_FFT.cpp:262
void butterfly(const Factor factor, Complex< float > *data, int stride) const noexcept
Definition juce_FFT.cpp:312
void butterfly2(Complex< float > *data, const int stride, const int length) const noexcept
Definition juce_FFT.cpp:358
void butterfly4(Complex< float > *data, const int stride, const int length) const noexcept
Definition juce_FFT.cpp:373
const int fftSize
Definition juce_FFT.cpp:267
FFTConfig(int sizeOfFFT, bool isInverse)
Definition juce_FFT.cpp:196
const bool inverse
Definition juce_FFT.cpp:268
HeapBlock< Complex< float > > twiddleTable
Definition juce_FFT.cpp:272
Factor factors[32]
Definition juce_FFT.cpp:271
void perform(const Complex< float > *input, Complex< float > *output, int stride, int strideIn, const Factor *facs) const noexcept
Definition juce_FFT.cpp:274
void performRealOnlyForwardTransform(Complex< float > *scratch, float *d) const noexcept
Definition juce_FFT.cpp:169
static FFTFallback * create(int order)
Definition juce_FFT.cpp:87
std::unique_ptr< FFTConfig > configInverse
Definition juce_FFT.cpp:428
void perform(const Complex< float > *input, Complex< float > *output, bool inverse) const noexcept override
Definition juce_FFT.cpp:100
void performRealOnlyInverseTransform(Complex< float > *scratch, float *d) const noexcept
Definition juce_FFT.cpp:177
std::unique_ptr< FFTConfig > configForward
Definition juce_FFT.cpp:428
void performRealOnlyForwardTransform(float *d, bool) const noexcept override
Definition juce_FFT.cpp:129
const size_t maxFFTScratchSpaceToAlloca
Definition juce_FFT.cpp:127
static constexpr int priority
Definition juce_FFT.cpp:85
SpinLock processLock
Definition juce_FFT.cpp:427
FFTFallback(int order)
Definition juce_FFT.cpp:92
int size
Definition juce_FFT.cpp:429
void performRealOnlyInverseTransform(float *d) const noexcept override
Definition juce_FFT.cpp:149
int n
Definition crypt.c:458
register uch * q
Definition fileio.c:817
int flag
Definition unix.c:754
typedef int(UZ_EXP MsgFn)()
#define void
Definition unzip.h:396
#define const
Definition zconf.h:137