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
23 public:
24 bool begin(int len) override {
25 this->len = len;
26 int alloc_size = len * 2;
29 assert(table_buffer.data() != nullptr);
30 assert(fft_data.data() != nullptr);
32 if (ret != ESP_OK){
33 LOGE("dsps_fft2r_init_fc32 %d", ret);
34 }
35 return fft_data.data()!=nullptr && ret == ESP_OK;
36 }
37
38 void end() override {
42 }
43
44 void setValue(int idx, float value) override {
45 if (idx<len){
46 fft_data[idx*2] = value;
47 fft_data[idx*2 + 1] = 0.0f;
48 }
49 }
50
51 float getValue(int idx) override { return fft_data[idx * 2]; }
52
53 void fft() override {
55 if (ret != ESP_OK){
56 LOGE("dsps_fft2r_fc32 %d", ret);
57 }
58 // Bit reverse
60 if (ret != ESP_OK){
61 LOGE("dsps_bit_rev_fc32 %d", ret);
62 }
63 // Convert one complex vector to two complex vectors
65 if (ret != ESP_OK){
66 LOGE("dsps_cplx2reC_fc32 %d", ret);
67 }
68 };
69
70 void rfft() override {
71 conjugate();
73 if (ret != ESP_OK){
74 LOGE("dsps_fft2r_fc32 %d", ret);
75 }
76 conjugate();
77 // Bit reverse
79 if (ret != ESP_OK){
80 LOGE("dsps_bit_rev_fc32 %d", ret);
81 }
82 // Convert one complex vector to two complex vectors
84 if (ret != ESP_OK){
85 LOGE("dsps_cplx2reC_fc32 %d", ret);
86 }
87 }
88
89 void conjugate(){
90 FFTBin bin;
91 for (int j=0;j<len;j++){
92 getBin(j, bin);
93 bin.conjugate();
94 setBin(j, bin);
95 }
96 }
97
98 float magnitude(int idx) override {
99 return sqrt(magnitudeFast(idx));
100 }
101
103 float magnitudeFast(int idx) override {
104 return (fft_data[idx*2] * fft_data[idx*2] + fft_data[idx*2+1] * fft_data[idx*2+1]);
105 }
106 bool setBin(int pos, float real, float img) override {
107 if (pos>=len) return false;
108 fft_data[pos*2] = real;
109 fft_data[pos*2+1] = img;
110 return true;
111 }
112
113 bool setBin(int pos, FFTBin &bin) { return FFTDriver::setBin(pos, bin);}
114
115 bool getBin(int pos, FFTBin &bin) override {
116 if (pos>=len) return false;
117 bin.real = fft_data[pos*2];
118 bin.img = fft_data[pos*2+1];
119 return true;
120 }
121
122 bool isReverseFFT() override {return true;}
123
124 bool isValid() override{ return fft_data.data()!=nullptr && ret==ESP_OK; }
125
129 int len=0;
130
131};
139 public:
141
143 float *dataArray() {
144 return driverEx()->fft_data.data();
145 }
146
150};
151
152
153}
#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:138
AudioEspressifFFT()
Definition AudioEspressifFFT.h:140
FFTDriverEspressifFFT * driverEx()
Definition AudioEspressifFFT.h:147
float * dataArray()
Provides the complex array returned by the FFT
Definition AudioEspressifFFT.h:143
Executes FFT using audio data privded by write() and/or an inverse FFT where the samples are made ava...
Definition AudioFFT.h:195
FFTDriver * driver()
Definition AudioFFT.h:555
fft Driver for espressif dsp library: https://espressif-docs.readthedocs-hosted.com/projects/esp-dsp/...
Definition AudioEspressifFFT.h:22
float magnitudeFast(int idx) override
magnitude w/o sqrt
Definition AudioEspressifFFT.h:103
void setValue(int idx, float value) override
Sets the real value.
Definition AudioEspressifFFT.h:44
Vector< float > fft_data
Definition AudioEspressifFFT.h:127
bool isReverseFFT() override
Returns true if reverse FFT is supported.
Definition AudioEspressifFFT.h:122
bool setBin(int pos, float real, float img) override
sets the value of a bin
Definition AudioEspressifFFT.h:106
bool begin(int len) override
Definition AudioEspressifFFT.h:24
bool getBin(int pos, FFTBin &bin) override
gets the value of a bin
Definition AudioEspressifFFT.h:115
Vector< float > table_buffer
Definition AudioEspressifFFT.h:128
void end() override
Definition AudioEspressifFFT.h:38
float magnitude(int idx) override
Calculate the magnitude (fft result) at index (sqr(i² + r²))
Definition AudioEspressifFFT.h:98
void conjugate()
Definition AudioEspressifFFT.h:89
esp_err_t ret
Definition AudioEspressifFFT.h:126
void fft() override
Perform FFT.
Definition AudioEspressifFFT.h:53
bool setBin(int pos, FFTBin &bin)
Definition AudioEspressifFFT.h:113
void rfft() override
Calculate reverse FFT.
Definition AudioEspressifFFT.h:70
float getValue(int idx) override
Get result value from Reverse FFT.
Definition AudioEspressifFFT.h:51
bool isValid() override
Definition AudioEspressifFFT.h:124
int len
Definition AudioEspressifFFT.h:129
Abstract Class which defines the basic FFT functionality.
Definition AudioFFT.h:160
virtual bool setBin(int idx, float real, float img)
sets the value of a bin
Definition AudioFFT.h:180
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
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:508
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