arduino-audio-tools
All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Modules Pages
AudioEspressifFFT.h
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;
25 fft_data.resize(alloc_size);
26 table_buffer.resize(CONFIG_DSP_MAX_FFT_SIZE);
27 assert(table_buffer.data() != nullptr);
28 assert(fft_data.data() != nullptr);
29 ret = dsps_fft2r_init_fc32(table_buffer.data(), CONFIG_DSP_MAX_FFT_SIZE);
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 {
38 fft_data.resize(0);
39 table_buffer.resize(0);
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 {
52 ret = dsps_fft2r_fc32(fft_data.data(), len);
53 if (ret != ESP_OK){
54 LOGE("dsps_fft2r_fc32 %d", ret);
55 }
56 // Bit reverse
57 ret = dsps_bit_rev_fc32(fft_data.data(), len);
58 if (ret != ESP_OK){
59 LOGE("dsps_bit_rev_fc32 %d", ret);
60 }
61 // Convert one complex vector to two complex vectors
62 ret = dsps_cplx2reC_fc32(fft_data.data(), len);
63 if (ret != ESP_OK){
64 LOGE("dsps_cplx2reC_fc32 %d", ret);
65 }
66 };
67
68 void rfft() override {
69 conjugate();
70 ret = dsps_fft2r_fc32(fft_data.data(), len);
71 if (ret != ESP_OK){
72 LOGE("dsps_fft2r_fc32 %d", ret);
73 }
74 conjugate();
75 // Bit reverse
76 ret = dsps_bit_rev_fc32(fft_data.data(), len);
77 if (ret != ESP_OK){
78 LOGE("dsps_bit_rev_fc32 %d", ret);
79 }
80 // Convert one complex vector to two complex vectors
81 ret = dsps_cplx2reC_fc32(fft_data.data(), len);
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
124 esp_err_t ret;
125 Vector<float> fft_data{0};
126 Vector<float> table_buffer{0};
127 int len=0;
128
129};
137 public:
139
141 float *dataArray() {
142 return driverEx()->fft_data.data();
143 }
144
145 FFTDriverEspressifFFT* driverEx() {
146 return (FFTDriverEspressifFFT*)driver();
147 }
148};
149
150
151}
AudioFFT using FFTReal. The only specific functionality is the access to the dataArray.
Definition AudioEspressifFFT.h:136
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:392
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
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 getBin(int pos, FFTBin &bin) override
gets the value of a bin
Definition AudioEspressifFFT.h:113
float magnitude(int idx) override
Calculate the magnitude (fft result) at index (sqr(i² + r²))
Definition AudioEspressifFFT.h:96
void fft() override
Perform FFT.
Definition AudioEspressifFFT.h:51
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
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
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioConfig.h:885
And individual FFT Bin.
Definition AudioFFT.h:65