arduino-audio-tools
Loading...
Searching...
No Matches
AudioFixedFFT.h
Go to the documentation of this file.
1#pragma once
2
3#include "AudioFFT.h"
4#include "FixedFFT.h"
5
12namespace audio_tools {
13
29template <typename CalcT = int16_t>
31 public:
32 bool begin(int len) override {
33 this->len = len;
34 valid = ffp_object.begin(len);
35 if (!valid) {
36 LOGE("fixedpoint_fft begin failed: len must be a power of two <= %d",
37 (int)fixedpoint_fft::FixedFFTEngineCore<CalcT>::kMaxN);
38 }
39 return valid;
40 }
41
42 void end() override {
43 ffp_object.end();
44 valid = false;
45 }
46
47 void setValue(int idx, float value) override {
48 ffp_object.realData()[idx] = fixedpoint_fft::fftConvertSample<float, CalcT>(value);
49 ffp_object.imagData()[idx] = 0;
50 }
51
52 void fft() override {
53 ffp_object.fft();
54 };
55
57 void rfft() override {
58 // safeScale: the spectrum may not have come from fft() (e.g. after setBin())
59 ffp_object.ifft(true);
60 }
61
62 bool isReverseFFT() override { return true; }
63
64 float magnitude(int idx) override {
65 return sqrt(magnitudeFast(idx));
66 }
67
69 float magnitudeFast(int idx) override {
70 float re = realAsFloat(idx);
71 float im = imagAsFloat(idx);
72 return re * re + im * im;
73 }
74
75 bool isValid() override { return valid; }
76
78 float getValue(int idx) override { return realAsFloat(idx); }
79
80 bool setBin(int pos, float real, float img) override {
81 if (pos < 0 || pos >= len) return false;
82 ffp_object.realData()[pos] = fixedpoint_fft::fftConvertSample<float, CalcT>(real);
83 ffp_object.imagData()[pos] = fixedpoint_fft::fftConvertSample<float, CalcT>(img);
84 return true;
85 }
86 bool getBin(int pos, FFTBin &bin) override {
87 if (pos < 0 || pos >= len) return false;
88 bin.real = realAsFloat(pos);
89 bin.img = imagAsFloat(pos);
90 return true;
91 }
92
94 fixedpoint_fft::FixedFFTEngineCore<CalcT> *engine() { return &ffp_object; }
95
96
97 protected:
98 fixedpoint_fft::FixedFFTEngineCore<CalcT> ffp_object;
99 int len = 0;
100 bool valid = false;
101
102 float realAsFloat(int idx) {
103 return fixedpoint_fft::fftConvertSample<CalcT, float>(ffp_object.real(idx));
104 }
105 float imagAsFloat(int idx) {
106 return fixedpoint_fft::fftConvertSample<CalcT, float>(ffp_object.imag(idx));
107 }
108};
109
119template <typename CalcT = int16_t>
121 public:
123
125 CalcT* realArray() {
126 return driverEx()->engine()->realData();
127 }
128
130 CalcT* imgArray() {
131 return driverEx()->engine()->imagData();
132 }
133
137};
138
139}
#define LOGE(...)
Definition AudioLoggerIDF.h:30
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 the fixedpoint-fft library. CalcT selects the calculation type (default int16_t,...
Definition AudioFixedFFT.h:120
FFTDriverFixedFFT< CalcT > * driverEx()
Definition AudioFixedFFT.h:134
CalcT * imgArray()
Provides the imaginary array returned by the FFT.
Definition AudioFixedFFT.h:130
CalcT * realArray()
Provides the real array returned by the FFT.
Definition AudioFixedFFT.h:125
AudioFixedFFT()
Definition AudioFixedFFT.h:122
Driver for the fixedpoint-fft library (https://github.com/pschatzmann/fixedpoint-fft)....
Definition AudioFixedFFT.h:30
float magnitudeFast(int idx) override
magnitude w/o sqrt
Definition AudioFixedFFT.h:69
void setValue(int idx, float value) override
Sets the real value.
Definition AudioFixedFFT.h:47
bool isReverseFFT() override
Returns true if reverse FFT is supported.
Definition AudioFixedFFT.h:62
float realAsFloat(int idx)
Definition AudioFixedFFT.h:102
bool setBin(int pos, float real, float img) override
sets the value of a bin
Definition AudioFixedFFT.h:80
bool valid
Definition AudioFixedFFT.h:100
bool begin(int len) override
Definition AudioFixedFFT.h:32
fixedpoint_fft::FixedFFTEngineCore< CalcT > * engine()
Provides access to the underlying fixedpoint-fft engine.
Definition AudioFixedFFT.h:94
bool getBin(int pos, FFTBin &bin) override
gets the value of a bin
Definition AudioFixedFFT.h:86
fixedpoint_fft::FixedFFTEngineCore< CalcT > ffp_object
Definition AudioFixedFFT.h:98
void end() override
Definition AudioFixedFFT.h:42
float magnitude(int idx) override
Calculate the magnitude (fft result) at index (sqr(i² + r²))
Definition AudioFixedFFT.h:64
float imagAsFloat(int idx)
Definition AudioFixedFFT.h:105
void fft() override
Perform FFT.
Definition AudioFixedFFT.h:52
void rfft() override
Inverse fft - convert fft result back to time domain (samples)
Definition AudioFixedFFT.h:57
float getValue(int idx) override
get Real value
Definition AudioFixedFFT.h:78
bool isValid() override
Definition AudioFixedFFT.h:75
int len
Definition AudioFixedFFT.h:99
Abstract Class which defines the basic FFT functionality.
Definition AudioFFT.h:165
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