arduino-audio-tools
All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Modules Pages
AudioKissFFT.h
1#pragma once
2
3#include "kiss_fix.h"
4#include "AudioFFT.h"
5
12namespace audio_tools {
13
21 public:
22 bool begin(int len) override {
23 this->len = len;
24 k_data.resize(len);
25 if (p_fft_object==nullptr) p_fft_object = cpp_kiss_fft_alloc(len,false,nullptr,nullptr);
26 assert(p_fft_object!=nullptr);
27 return p_fft_object!=nullptr;
28 }
29
30 void end() override {
31 if (p_fft_object!=nullptr) kiss_fft_free(p_fft_object);
32 if (p_fft_object_inv!=nullptr) kiss_fft_free(p_fft_object_inv);
33
34 p_fft_object = nullptr;
35 k_data.resize(0);
36 }
37 void setValue(int idx, float value) override {
38 k_data[idx].r = value;
39 }
40
41 void fft() override {
42 cpp_kiss_fft (p_fft_object, k_data.data(), k_data.data());
43 };
44
45 void rfft() override {
46 if(p_fft_object_inv==nullptr) {
47 p_fft_object_inv = cpp_kiss_fft_alloc(len,true,nullptr,nullptr);
48 }
49 cpp_kiss_fft (p_fft_object_inv, k_data.data(), k_data.data());
50 };
51
52 float magnitude(int idx) override {
53 return sqrt(magnitudeFast(idx));
54 }
55
57 float magnitudeFast(int idx) override {
58 return (k_data[idx].r * k_data[idx].r + k_data[idx].i * k_data[idx].i);
59 }
60
61 bool isValid() override{ return p_fft_object!=nullptr; }
62
63 bool isReverseFFT() override {return true;}
64
65 float getValue(int idx) override { return k_data[idx].r; }
66
67 bool setBin(int pos, FFTBin &bin) { return FFTDriver::setBin(pos, bin);}
68
69 bool setBin(int pos, float real, float img) override {
70 if (pos>=len) return false;
71 k_data[pos].r = real;
72 k_data[pos].i = img;
73 return true;
74 }
75 bool getBin(int pos, FFTBin &bin) override {
76 if (pos>=len) return false;
77 bin.real = k_data[pos].r;
78 bin.img = k_data[pos].i;
79 return true;
80 }
81
82 kiss_fft_cfg p_fft_object=nullptr;
83 kiss_fft_cfg p_fft_object_inv=nullptr;
84 Vector<kiss_fft_cpx> k_data{0}; // real
85 int len = 0;
86
87};
94class AudioKissFFT : public AudioFFTBase {
95 public:
97
100 return driverEx()->k_data.data();
101 }
102
103 FFTDriverKissFFT* driverEx() {
104 return (FFTDriverKissFFT*)driver();
105 }
106};
107
108
109}
Executes FFT using audio data privded by write() and/or an inverse FFT where the samples are made ava...
Definition AudioFFT.h:191
FFTDriver * driver()
Definition AudioFFT.h:392
AudioFFT using FFTReal. The only specific functionality is the access to the dataArray.
Definition AudioKissFFT.h:94
kiss_fft_cpx * dataArray()
Provides the complex array returned by the FFT
Definition AudioKissFFT.h:99
Abstract Class which defines the basic FFT functionality.
Definition AudioFFT.h:156
virtual bool setBin(int idx, float real, float img)
sets the value of a bin
Definition AudioFFT.h:176
Driver for RealFFT.
Definition AudioKissFFT.h:20
float magnitudeFast(int idx) override
magnitude w/o sqrt
Definition AudioKissFFT.h:57
void setValue(int idx, float value) override
Sets the real value.
Definition AudioKissFFT.h:37
bool isReverseFFT() override
Returns true if reverse FFT is supported.
Definition AudioKissFFT.h:63
bool setBin(int pos, float real, float img) override
sets the value of a bin
Definition AudioKissFFT.h:69
bool getBin(int pos, FFTBin &bin) override
gets the value of a bin
Definition AudioKissFFT.h:75
float magnitude(int idx) override
Calculate the magnitude (fft result) at index (sqr(i² + r²))
Definition AudioKissFFT.h:52
void fft() override
Perform FFT.
Definition AudioKissFFT.h:41
void rfft() override
Calculate reverse FFT.
Definition AudioKissFFT.h:45
float getValue(int idx) override
Get result value from Reverse FFT.
Definition AudioKissFFT.h:65
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioConfig.h:885
And individual FFT Bin.
Definition AudioFFT.h:65