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;
27 fft_data.resize(alloc_size);
28 table_buffer.resize(CONFIG_DSP_MAX_FFT_SIZE);
29 assert(table_buffer.data() != nullptr);
30 assert(fft_data.data() != nullptr);
31 ret = dsps_fft2r_init_fc32(table_buffer.data(), CONFIG_DSP_MAX_FFT_SIZE);
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 {
39 dsps_fft2r_deinit_fc32();
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 {
54 ret = dsps_fft2r_fc32(fft_data.data(), len);
55 if (ret != ESP_OK){
56 LOGE("dsps_fft2r_fc32 %d", ret);
57 }
58 // Bit reverse
59 ret = dsps_bit_rev_fc32(fft_data.data(), len);
60 if (ret != ESP_OK){
61 LOGE("dsps_bit_rev_fc32 %d", ret);
62 }
63 // Convert one complex vector to two complex vectors
64 ret = dsps_cplx2reC_fc32(fft_data.data(), len);
65 if (ret != ESP_OK){
66 LOGE("dsps_cplx2reC_fc32 %d", ret);
67 }
68 };
69
70 void rfft() override {
71 conjugate();
72 ret = dsps_fft2r_fc32(fft_data.data(), len);
73 if (ret != ESP_OK){
74 LOGE("dsps_fft2r_fc32 %d", ret);
75 }
76 conjugate();
77 // Bit reverse
78 ret = dsps_bit_rev_fc32(fft_data.data(), len);
79 if (ret != ESP_OK){
80 LOGE("dsps_bit_rev_fc32 %d", ret);
81 }
82 // Convert one complex vector to two complex vectors
83 ret = dsps_cplx2reC_fc32(fft_data.data(), len);
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
126 esp_err_t ret;
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:200
FFTDriver * driver()
Definition AudioFFT.h:560
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:165
virtual bool setBin(int idx, float real, float img)
sets the value of a bin
Definition AudioFFT.h:185
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 LMSEchoCancellationStream.h:6
And individual FFT Bin.
Definition AudioFFT.h:70
float real
Definition AudioFFT.h:71
float img
Definition AudioFFT.h:72
void conjugate()
Definition AudioFFT.h:86