BogaudioModules

BogaudioModules for VCV Rack
Log | Files | Refs | README | LICENSE

commit 0ab4cc28c8d7670d493a9783d450baedffda04db
parent 0b32da3a357f36d4a54edeb78aee3137f6c3a785
Author: Matt Demanett <matt@fundera.com>
Date:   Fri,  1 Dec 2017 16:14:00 -0500

Optimize size=1024 FFT.

Diffstat:
MMakefile | 2+-
Asrc/dsp/analyzer.cpp | 21+++++++++++++++++++++
Msrc/dsp/analyzer.hpp | 45+++++++++++++++++++++++++++++++++++++++------
3 files changed, 61 insertions(+), 7 deletions(-)

diff --git a/Makefile b/Makefile @@ -1,5 +1,5 @@ -SOURCES = $(wildcard src/*.cpp) +SOURCES = $(wildcard src/*.cpp src/dsp/*cpp) include ../../plugin.mk diff --git a/src/dsp/analyzer.cpp b/src/dsp/analyzer.cpp @@ -0,0 +1,21 @@ + +#include "ffft/FFTRealFixLen.h" + +#include "buffer.hpp" +#include "analyzer.hpp" + +using namespace bogaudio::dsp; + +typedef ffft::FFTRealFixLen<10> FFT; + +FFT1024::FFT1024() { + _fft = new FFT(); +} + +FFT1024::~FFT1024() { + delete (FFT*)_fft; +} + +void FFT1024::do_fft(float* out, float* in) { + ((FFT*)_fft)->do_fft(out, in); +} diff --git a/src/dsp/analyzer.hpp b/src/dsp/analyzer.hpp @@ -1,7 +1,7 @@ #include <math.h> - #include "ffft/FFTReal.h" +#include "ffft/FFTReal.h" namespace bogaudio { namespace dsp { @@ -46,6 +46,15 @@ struct HammingWindow : HanningWindow { }; +struct FFT1024 { + void* _fft = NULL; + FFT1024(); + ~FFT1024(); + + void do_fft(float* out, float* in); +}; + + struct SpectrumAnalyzer : OverlappingBuffer<float> { enum Size { SIZE_128 = 128, @@ -70,7 +79,8 @@ struct SpectrumAnalyzer : OverlappingBuffer<float> { }; const float _sampleRate; - ffft::FFTReal<float> _fft; + ffft::FFTReal<float>* _fft; + FFT1024* _fft1024; Window* _window; float* _windowOut; float* _fftOut; @@ -83,13 +93,24 @@ struct SpectrumAnalyzer : OverlappingBuffer<float> { ) : OverlappingBuffer(size, overlap) , _sampleRate(sampleRate) - , _fft(_size) + , _fft(NULL) + , _fft1024(NULL) , _window(NULL) , _windowOut(NULL) , _fftOut(new float[_size]) { assert(_sampleRate > size); + switch (size) { + case SIZE_1024: { + _fft1024 = new FFT1024(); + break; + } + default: { + _fft = new ffft::FFTReal<float>(size); + } + } + switch (windowType) { case WINDOW_NONE: { break; @@ -108,20 +129,32 @@ struct SpectrumAnalyzer : OverlappingBuffer<float> { } virtual ~SpectrumAnalyzer() { - delete[] _fftOut; + if (_fft) { + delete _fft; + } + if (_fft1024) { + delete _fft1024; + } + if (_window) { delete _window; delete[] _windowOut; } + + delete[] _fftOut; } virtual void process(float* samples) { + float* input = samples; if (_window) { _window->apply(samples, _windowOut); - _fft.do_fft(_fftOut, _windowOut); + input = _windowOut; + } + if (_fft1024) { + _fft1024->do_fft(_fftOut, input); } else { - _fft.do_fft(_fftOut, samples); + _fft->do_fft(_fftOut, input); } }