arduino-audio-tools
Loading...
Searching...
No Matches
AudioEspressifFFT.h
Go to the documentation of this file.
1#pragma once
2
3#include "AudioFFT.h"
4#include "esp_dsp.h"
5
12namespace audio_tools {
13
21 public:
22 bool begin(int len) override {
23 this->len = len;
24 int alloc_size = len * 2;
27 assert(table_buffer.data() != nullptr);
28 assert(fft_data.data() != nullptr);
30 if (ret != ESP_OK){
31 LOGE("dsps_fft2r_init_fc32 %d", ret);
32 }
33 return fft_data.data()!=nullptr && ret == ESP_OK;
34 }
35
36 void end() override {
40 }
41
42 void setValue(int idx, float value) override {
43 if (idx<len){
44 fft_data[idx*2] = value;
45 fft_data[idx*2 + 1] = 0.0f;
46 }
47 }
48
49 float getValue(int idx) override { return fft_data[idx * 2]; }
50
51 void fft() override {
53 if (ret != ESP_OK){
54 LOGE("dsps_fft2r_fc32 %d", ret);
55 }
56 // Bit reverse
58 if (ret != ESP_OK){
59 LOGE("dsps_bit_rev_fc32 %d", ret);
60 }
61 // Convert one complex vector to two complex vectors
63 if (ret != ESP_OK){
64 LOGE("dsps_cplx2reC_fc32 %d", ret);
65 }
66 };
67
68 void rfft() override {
69 conjugate();
71 if (ret != ESP_OK){
72 LOGE("dsps_fft2r_fc32 %d", ret);
73 }
74 conjugate();
75 // Bit reverse
77 if (ret != ESP_OK){
78 LOGE("dsps_bit_rev_fc32 %d", ret);
79 }
80 // Convert one complex vector to two complex vectors
82 if (ret != ESP_OK){
83 LOGE("dsps_cplx2reC_fc32 %d", ret);
84 }
85 }
86
87 void conjugate(){
88 FFTBin bin;
89 for (int j=0;j<len;j++){
90 getBin(j, bin);
91 bin.conjugate();
92 setBin(j, bin);
93 }
94 }
95
96 float magnitude(int idx) override {
97 return sqrt(magnitudeFast(idx));
98 }
99
101 float magnitudeFast(int idx) override {
102 return (fft_data[idx*2] * fft_data[idx*2] + fft_data[idx*2+1] * fft_data[idx*2+1]);
103 }
104 bool setBin(int pos, float real, float img) override {
105 if (pos>=len) return false;
106 fft_data[pos*2] = real;
107 fft_data[pos*2+1] = img;
108 return true;
109 }
110
111 bool setBin(int pos, FFTBin &bin) { return FFTDriver::setBin(pos, bin);}
112
113 bool getBin(int pos, FFTBin &bin) override {
114 if (pos>=len) return false;
115 bin.real = fft_data[pos*2];
116 bin.img = fft_data[pos*2+1];
117 return true;
118 }
119
120 bool isReverseFFT() override {return true;}
121
122 bool isValid() override{ return fft_data.data()!=nullptr && ret==ESP_OK; }
123
127 int len=0;
128
129};
137 public:
139
141 float *dataArray() {
142 return driverEx()->fft_data.data();
143 }
144
148};
149
150
151}
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define assert(T)
Definition avr.h:10
AudioFFT using FFTReal. The only specific functionality is the access to the dataArray.
Definition AudioEspressifFFT.h:136
AudioEspressifFFT()
Definition AudioEspressifFFT.h:138
FFTDriverEspressifFFT * driverEx()
Definition AudioEspressifFFT.h:145
float * dataArray()
Provides the complex array returned by the FFT
Definition AudioEspressifFFT.h:141
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:551
fft Driver for espressif dsp library: https://espressif-docs.readthedocs-hosted.com/projects/esp-dsp/...
Definition AudioEspressifFFT.h:20
float magnitudeFast(int idx) override
magnitude w/o sqrt
Definition AudioEspressifFFT.h:101
void setValue(int idx, float value) override
Sets the real value.
Definition AudioEspressifFFT.h:42
Vector< float > fft_data
Definition AudioEspressifFFT.h:125
bool isReverseFFT() override
Returns true if reverse FFT is supported.
Definition AudioEspressifFFT.h:120
bool setBin(int pos, float real, float img) override
sets the value of a bin
Definition AudioEspressifFFT.h:104
bool begin(int len) override
Definition AudioEspressifFFT.h:22
bool getBin(int pos, FFTBin &bin) override
gets the value of a bin
Definition AudioEspressifFFT.h:113
Vector< float > table_buffer
Definition AudioEspressifFFT.h:126
void end() override
Definition AudioEspressifFFT.h:36
float magnitude(int idx) override
Calculate the magnitude (fft result) at index (sqr(i² + r²))
Definition AudioEspressifFFT.h:96
void conjugate()
Definition AudioEspressifFFT.h:87
esp_err_t ret
Definition AudioEspressifFFT.h:124
void fft() override
Perform FFT.
Definition AudioEspressifFFT.h:51
bool setBin(int pos, FFTBin &bin)
Definition AudioEspressifFFT.h:111
void rfft() override
Calculate reverse FFT.
Definition AudioEspressifFFT.h:68
float getValue(int idx) override
Get result value from Reverse FFT.
Definition AudioEspressifFFT.h:49
bool isValid() override
Definition AudioEspressifFFT.h:122
int len
Definition AudioEspressifFFT.h:127
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
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
bool resize(int newSize, T value)
Definition Vector.h:266
T * data()
Definition Vector.h:316
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:512
And individual FFT Bin.
Definition AudioFFT.h:65
float real
Definition AudioFFT.h:66
float img
Definition AudioFFT.h:67
void conjugate()
Definition AudioFFT.h:81