arduino-audio-tools
Loading...
Searching...
No Matches
AudioRealFFT.h
Go to the documentation of this file.
1#pragma once
2
3#include "AudioFFT.h"
4#include "FFTReal.h"
5
12namespace audio_tools {
13
21 public:
22 bool begin(int len) override {
23 // Recreate the FFT engine whenever the size actually changes --
24 // ffft::FFTReal is built for a fixed length, so reusing an
25 // already-initialized instance at a different length (e.g. a
26 // driver shared/re-begun by multiple consumers at different
27 // sizes) would silently run the old, wrong-sized transform on
28 // buffers resized for the new length.
29 if (p_fft_object != nullptr && this->len != len) {
30 delete p_fft_object;
31 p_fft_object = nullptr;
32 }
33 this->len = len;
34 v_x.resize(len);
35 v_f.resize(len);
37 assert(p_fft_object!=nullptr);
38 return p_fft_object!=nullptr;
39 }
40 void end()override{
41 if (p_fft_object!=nullptr) {
42 delete p_fft_object;
43 p_fft_object = nullptr;
44 }
45 v_x.resize(0);
46 v_f.resize(0);
47 }
48 void setValue(int idx, float value) override{
49 v_x[idx] = value;
50 }
51
52 void fft() override{
53 memset(v_f.data(),0,len*sizeof(float));
55 };
56
58 void rfft() override{
59 // ifft
61 }
62
63 bool isReverseFFT() override { return true;}
64
65 float magnitude(int idx) override {
66 return sqrt(magnitudeFast(idx));
67 }
68
69 // do_fft(f, x) packs the whole spectrum into f (the frequency
70 // buffer), leaving x (the time-domain input) untouched -- see
71 // FFTReal::do_fft's doc comment: f[0..len/2] = real values of bins
72 // 0..len/2 (DC and Nyquist have no imaginary component), and
73 // f[len/2+1..len-1] = *negative* imaginary values of bins
74 // 1..len/2-1. magnitude/getBin/setBin below all key off that layout
75 // in v_f; v_x is only valid to read from after rfft() (inverse).
76
78 float magnitudeFast(int idx) override {
79 float re = v_f[idx];
80 float im = (idx == 0 || idx == len / 2) ? 0.0f : v_f[len / 2 + idx];
81 return (re * re) + (im * im);
82 }
83
84 bool isValid() override{ return p_fft_object!=nullptr; }
85
90 float getValue(int idx) override { return v_x[idx];}
91
96 bool setBin(int pos, float real, float img) override {
97 if (pos < 0 || pos > len / 2) return false;
98 v_f[pos] = real;
99 if (pos > 0 && pos < len / 2) {
100 v_f[len / 2 + pos] = -img;
101 }
102 return true;
103 }
105 bool getBin(int pos, FFTBin &bin) override {
106 if (pos < 0 || pos > len / 2) return false;
107 bin.real = v_f[pos];
108 bin.img = (pos == 0 || pos == len / 2) ? 0.0f : -v_f[len / 2 + pos];
109 return true;
110 }
111
112 ffft::FFTReal <float> *p_fft_object=nullptr;
113 Vector<float> v_x{0}; // real
114 Vector<float> v_f{0}; // complex
115 int len;
116
117};
118
126 public:
128
130 float* realArray() {
131 return driverEx()->v_x.data();
132 }
133
135 float *imgArray() {
136 return driverEx()->v_f.data();
137 }
138
142};
143
144}
#define assert(T)
Definition avr.h:10
Executes FFT using audio data privded by write() and/or an inverse FFT where the samples are made ava...
Definition AudioFFT.h:200
FFTDriver * driver()
Definition AudioFFT.h:560
AudioFFT using RealFFT.
Definition AudioRealFFT.h:125
FFTDriverRealFFT * driverEx()
Definition AudioRealFFT.h:139
float * realArray()
Provides the real array returned by the FFT.
Definition AudioRealFFT.h:130
AudioRealFFT()
Definition AudioRealFFT.h:127
float * imgArray()
Provides the complex array returned by the FFT
Definition AudioRealFFT.h:135
Abstract Class which defines the basic FFT functionality.
Definition AudioFFT.h:165
Driver for RealFFT.
Definition AudioRealFFT.h:20
float magnitudeFast(int idx) override
magnitude w/o sqrt
Definition AudioRealFFT.h:78
Vector< float > v_f
Definition AudioRealFFT.h:114
void setValue(int idx, float value) override
Sets the real value.
Definition AudioRealFFT.h:48
bool isReverseFFT() override
Returns true if reverse FFT is supported.
Definition AudioRealFFT.h:63
bool setBin(int pos, float real, float img) override
Definition AudioRealFFT.h:96
bool begin(int len) override
Definition AudioRealFFT.h:22
bool getBin(int pos, FFTBin &bin) override
Gets bin real/imag from the result of the last forward fft().
Definition AudioRealFFT.h:105
void end() override
Definition AudioRealFFT.h:40
float magnitude(int idx) override
Calculate the magnitude (fft result) at index (sqr(i² + r²))
Definition AudioRealFFT.h:65
void fft() override
Perform FFT.
Definition AudioRealFFT.h:52
Vector< float > v_x
Definition AudioRealFFT.h:113
void rfft() override
Inverse fft - convert fft result back to time domain (samples)
Definition AudioRealFFT.h:58
float getValue(int idx) override
Definition AudioRealFFT.h:90
bool isValid() override
Definition AudioRealFFT.h:84
ffft::FFTReal< float > * p_fft_object
Definition AudioRealFFT.h:112
int len
Definition AudioRealFFT.h:115
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
bool resize(size_t newSize, T value)
Definition Vector.h:266
T * data()
Definition Vector.h:316
Definition FFTReal.h:600
void do_ifft(const DataType f[], DataType x[]) const
Definition FFTReal.h:888
void do_fft(DataType f[], const DataType x[]) const
Definition FFTReal.h:827
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6
And individual FFT Bin.
Definition AudioFFT.h:70
float real
Definition AudioFFT.h:71
float img
Definition AudioFFT.h:72