25class FourierTransform {
37 int spec_buffer_size = 0;
39 ippsFFTGetSize_R_32f(bits, IPP_FFT_DIV_INV_BY_N, ippAlgHintNone, &spec_size, &spec_buffer_size, &buffer_size);
41 spec_ = std::make_unique<Ipp8u[]>(spec_size);
42 spec_buffer_ = std::make_unique<Ipp8u[]>(spec_buffer_size);
43 buffer_ = std::make_unique<Ipp8u[]>(buffer_size);
45 ippsFFTInit_R_32f(&ipp_specs_, bits, IPP_FFT_DIV_INV_BY_N, ippAlgHintNone, spec_.get(), spec_buffer_.get());
58 ippsFFTFwd_RToPerm_32f_I((Ipp32f*)data, ipp_specs_, buffer_.get());
59 data[size_] = data[1];
60 data[size_ + 1] = 0.0f;
73 data[1] = data[size_];
74 ippsFFTInv_PermToR_32f_I((Ipp32f*)data, ipp_specs_, buffer_.get());
75 memset(data + size_, 0, size_ *
sizeof(
float));
80 IppsFFTSpec_R_32f* ipp_specs_;
81 std::unique_ptr<Ipp8u[]> spec_;
82 std::unique_ptr<Ipp8u[]> spec_buffer_;
83 std::unique_ptr<Ipp8u[]> buffer_;
88#elif JUCE_MODULE_AVAILABLE_juce_dsp
98 class FourierTransform {
131#include <Accelerate/Accelerate.h>
141class FourierTransform {
148 FourierTransform(vDSP_Length bits) : setup_(vDSP_create_fftsetup(bits, 2)), bits_(bits), size_(1 << bits) { }
154 vDSP_destroy_fftsetup(setup_);
163 static const float kMult = 0.5f;
165 DSPSplitComplex split = { data, data + 1 };
166 vDSP_fft_zrip(setup_, &split, 2, bits_, kFFTDirection_Forward);
167 vDSP_vsmul(data, 1, &kMult, data, 1, size_);
169 data[size_] = data[1];
170 data[size_ + 1] = 0.0f;
180 float multiplier = 1.0f / size_;
181 DSPSplitComplex split = { data, data + 1 };
182 data[1] = data[size_];
184 vDSP_fft_zrip(setup_, &split, 2, bits_, kFFTDirection_Inverse);
185 vDSP_vsmul(data, 1, &multiplier, data, 1, size_ * 2);
186 memset(data + size_, 0, size_ *
sizeof(
float));
199#include "kissfft/kissfft.h"
217 FourierTransform(
size_t bits) : bits_(bits), size_(1 << bits), forward_(size_, false), inverse_(size_, true) {
218 buffer_ = std::make_unique<std::complex<float>[]>(size_);
235 for (
int i = size_ - 1; i >= 0; --i) {
236 data[2 * i] = data[i];
237 data[2 * i + 1] = 0.0f;
240 forward_.transform((std::complex<float>*)data, buffer_.get());
242 int num_floats = size_ * 2;
243 memcpy(data, buffer_.get(), num_floats *
sizeof(
float));
244 data[size_] = data[1];
245 data[size_ + 1] = 0.0f;
259 data[1] = data[size_];
260 inverse_.transform((std::complex<float>*)data, buffer_.get());
261 int num_floats = size_ * 2;
263 float multiplier = 2.0f / size_;
264 for (
int i = 0; i < size_; ++i)
265 data[i] = buffer_[i].real() * multiplier;
267 memset(data + size_, 0, size_ *
sizeof(
float));
273 std::unique_ptr<std::complex<float>[]> buffer_;
274 kissfft<float> forward_;
275 kissfft<float> inverse_;
290 template <
size_t bits>
300 return &instance.fourier_transform_;
307 FFT() : fourier_transform_(bits) { }
309 FourierTransform fourier_transform_;
A template class to provide a statically allocated FourierTransform instance for a given number of bi...
Definition fourier_transform.h:291
static FourierTransform * transform()
Provides access to a static FourierTransform instance for the specified bits.
Definition fourier_transform.h:298
Contains classes and functions used within the Vital synthesizer framework.