Skip to content

Commit d9b9399

Browse files
committed
FFT: psram
1 parent e93dab8 commit d9b9399

File tree

4 files changed

+62
-61
lines changed

4 files changed

+62
-61
lines changed
Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
#include "AudioTools.h"
22
#include "AudioTools/AudioLibs/AudioRealFFT.h" // using RealFFT
3+
#include "AudioTools/AudioLibs/AudioBoardStream.h"
34

4-
AudioInfo info(44100, 1, 16);
5-
AudioRealFFT fft; // or AudioKissFFT
5+
AudioInfo info(8000, 1, 16);
6+
AudioRealFFT afft; // or AudioKissFFT
67
Hann hann;
78
BufferedWindow buffered(&hann);
89
SineWaveGenerator<int16_t> sineWave(32000);
910
GeneratedSoundStream<int16_t> in(sineWave);
10-
StreamCopy copier(fft, in);
11-
CsvOutput<int16_t> out(Serial);
12-
StreamCopy copierIFFT(out, fft);
13-
float value = 0;
11+
StreamCopy copier(afft, in);
12+
//CsvOutput<int16_t> out(Serial);
13+
//I2SStream out;
14+
AudioBoardStream out(AudioKitEs8388V1);
15+
StreamCopy copierIFFT(out, afft);
1416

15-
// display fft result
17+
// process fft result
1618
void fftResult(AudioFFTBase &fft) {
17-
copierIFFT.copyAll();
19+
// copy ifft result to output
20+
while (copierIFFT.copy());
1821
}
1922

2023
void setup() {
@@ -30,15 +33,18 @@ void setup() {
3033
in.begin(cfg);
3134

3235
// Setup FFT
33-
auto tcfg = fft.defaultConfig(RXTX_MODE);
34-
tcfg.window_function = &buffered;
36+
auto tcfg = afft.defaultConfig(RXTX_MODE);
37+
tcfg.copyFrom(info);
3538
tcfg.length = 1024;
36-
tcfg.stride = 512;
39+
//tcfg.window_function = &buffered;
40+
//tcfg.stride = 512;
3741
tcfg.callback = fftResult;
38-
fft.begin(tcfg);
42+
afft.begin(tcfg);
3943

4044
// setup output
41-
out.begin(info);
45+
auto ocfg = out.defaultConfig(TX_MODE);
46+
ocfg.copyFrom(info);
47+
out.begin(ocfg);
4248
}
4349

4450
void loop() { copier.copy(); }

src/AudioTools/AudioLibs/AudioEspressifFFT.h

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -21,68 +21,64 @@ class FFTDriverEspressifFFT : public FFTDriver {
2121
public:
2222
bool begin(int len) override {
2323
this->len = len;
24-
if (p_data==nullptr){
25-
p_data = new float[len*2];
26-
if (p_data==nullptr){
27-
LOGE("not enough memory");
28-
}
29-
}
30-
assert(p_data!=nullptr);
31-
ret = dsps_fft2r_init_fc32(NULL, CONFIG_DSP_MAX_FFT_SIZE);
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);
3230
if (ret != ESP_OK){
3331
LOGE("dsps_fft2r_init_fc32 %d", ret);
3432
}
35-
return p_data!=nullptr && ret == ESP_OK;
33+
return fft_data.data()!=nullptr && ret == ESP_OK;
3634
}
3735

3836
void end() override {
3937
dsps_fft2r_deinit_fc32();
40-
if (p_data==nullptr){
41-
delete p_data;
42-
p_data = nullptr;
43-
}
38+
fft_data.resize(0);
39+
table_buffer.resize(0);
4440
}
4541

4642
void setValue(int idx, float value) override {
4743
if (idx<len){
48-
p_data[idx*2] = value;
49-
p_data[idx*2 + 1] = 0.0f;
44+
fft_data[idx*2] = value;
45+
fft_data[idx*2 + 1] = 0.0f;
5046
}
5147
}
5248

53-
float getValue(int idx) override { return p_data[idx * 2]; }
49+
float getValue(int idx) override { return fft_data[idx * 2]; }
5450

5551
void fft() override {
56-
ret = dsps_fft2r_fc32(p_data, len);
52+
ret = dsps_fft2r_fc32(fft_data.data(), len);
5753
if (ret != ESP_OK){
5854
LOGE("dsps_fft2r_fc32 %d", ret);
5955
}
6056
// Bit reverse
61-
ret = dsps_bit_rev_fc32(p_data, len);
57+
ret = dsps_bit_rev_fc32(fft_data.data(), len);
6258
if (ret != ESP_OK){
6359
LOGE("dsps_bit_rev_fc32 %d", ret);
6460
}
6561
// Convert one complex vector to two complex vectors
66-
ret = dsps_cplx2reC_fc32(p_data, len);
62+
ret = dsps_cplx2reC_fc32(fft_data.data(), len);
6763
if (ret != ESP_OK){
6864
LOGE("dsps_cplx2reC_fc32 %d", ret);
6965
}
7066
};
7167

7268
void rfft() override {
7369
conjugate();
74-
ret = dsps_fft2r_fc32(p_data, len);
70+
ret = dsps_fft2r_fc32(fft_data.data(), len);
7571
if (ret != ESP_OK){
7672
LOGE("dsps_fft2r_fc32 %d", ret);
7773
}
7874
conjugate();
7975
// Bit reverse
80-
ret = dsps_bit_rev_fc32(p_data, len);
76+
ret = dsps_bit_rev_fc32(fft_data.data(), len);
8177
if (ret != ESP_OK){
8278
LOGE("dsps_bit_rev_fc32 %d", ret);
8379
}
8480
// Convert one complex vector to two complex vectors
85-
ret = dsps_cplx2reC_fc32(p_data, len);
81+
ret = dsps_cplx2reC_fc32(fft_data.data(), len);
8682
if (ret != ESP_OK){
8783
LOGE("dsps_cplx2reC_fc32 %d", ret);
8884
}
@@ -103,30 +99,31 @@ class FFTDriverEspressifFFT : public FFTDriver {
10399

104100
/// magnitude w/o sqrt
105101
float magnitudeFast(int idx) override {
106-
return (p_data[idx*2] * p_data[idx*2] + p_data[idx*2+1] * p_data[idx*2+1]);
102+
return (fft_data[idx*2] * fft_data[idx*2] + fft_data[idx*2+1] * fft_data[idx*2+1]);
107103
}
108104
bool setBin(int pos, float real, float img) override {
109105
if (pos>=len) return false;
110-
p_data[pos*2] = real;
111-
p_data[pos*2+1] = img;
106+
fft_data[pos*2] = real;
107+
fft_data[pos*2+1] = img;
112108
return true;
113109
}
114110

115111
bool setBin(int pos, FFTBin &bin) { return FFTDriver::setBin(pos, bin);}
116112

117113
bool getBin(int pos, FFTBin &bin) override {
118114
if (pos>=len) return false;
119-
bin.real = p_data[pos*2];
120-
bin.img = p_data[pos*2+1];
115+
bin.real = fft_data[pos*2];
116+
bin.img = fft_data[pos*2+1];
121117
return true;
122118
}
123119

124120
bool isReverseFFT() override {return true;}
125121

126-
bool isValid() override{ return p_data!=nullptr && ret==ESP_OK; }
122+
bool isValid() override{ return fft_data.data()!=nullptr && ret==ESP_OK; }
127123

128124
esp_err_t ret;
129-
float *p_data = nullptr;
125+
Vector<float> fft_data{0};
126+
Vector<float> table_buffer{0};
130127
int len=0;
131128

132129
};
@@ -142,7 +139,7 @@ class AudioEspressifFFT : public AudioFFTBase {
142139

143140
/// Provides the complex array returned by the FFT
144141
float *dataArray() {
145-
return driverEx()->p_data;
142+
return driverEx()->fft_data.data();
146143
}
147144

148145
FFTDriverEspressifFFT* driverEx() {

src/AudioTools/AudioLibs/AudioKissFFT.h

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,34 +21,32 @@ class FFTDriverKissFFT : public FFTDriver {
2121
public:
2222
bool begin(int len) override {
2323
this->len = len;
24+
k_data.resize(len);
2425
if (p_fft_object==nullptr) p_fft_object = cpp_kiss_fft_alloc(len,false,nullptr,nullptr);
25-
if (p_data==nullptr) p_data = new kiss_fft_cpx[len];
2626
assert(p_fft_object!=nullptr);
27-
assert(p_data!=nullptr);
28-
return p_fft_object!=nullptr && p_data!=nullptr;
27+
return p_fft_object!=nullptr;
2928
}
3029

3130
void end() override {
3231
if (p_fft_object!=nullptr) kiss_fft_free(p_fft_object);
3332
if (p_fft_object_inv!=nullptr) kiss_fft_free(p_fft_object_inv);
3433

35-
if (p_data!=nullptr) delete[] p_data;
3634
p_fft_object = nullptr;
37-
p_data = nullptr;
35+
k_data.resize(0);
3836
}
3937
void setValue(int idx, float value) override {
40-
p_data[idx].r = value;
38+
k_data[idx].r = value;
4139
}
4240

4341
void fft() override {
44-
cpp_kiss_fft (p_fft_object, p_data, p_data);
42+
cpp_kiss_fft (p_fft_object, k_data.data(), k_data.data());
4543
};
4644

4745
void rfft() override {
4846
if(p_fft_object_inv==nullptr) {
4947
p_fft_object_inv = cpp_kiss_fft_alloc(len,true,nullptr,nullptr);
5048
}
51-
cpp_kiss_fft (p_fft_object_inv, p_data, p_data);
49+
cpp_kiss_fft (p_fft_object_inv, k_data.data(), k_data.data());
5250
};
5351

5452
float magnitude(int idx) override {
@@ -57,33 +55,33 @@ class FFTDriverKissFFT : public FFTDriver {
5755

5856
/// magnitude w/o sqrt
5957
float magnitudeFast(int idx) override {
60-
return (p_data[idx].r * p_data[idx].r + p_data[idx].i * p_data[idx].i);
58+
return (k_data[idx].r * k_data[idx].r + k_data[idx].i * k_data[idx].i);
6159
}
6260

6361
bool isValid() override{ return p_fft_object!=nullptr; }
6462

6563
bool isReverseFFT() override {return true;}
6664

67-
float getValue(int idx) override { return p_data[idx].r; }
65+
float getValue(int idx) override { return k_data[idx].r; }
6866

6967
bool setBin(int pos, FFTBin &bin) { return FFTDriver::setBin(pos, bin);}
7068

7169
bool setBin(int pos, float real, float img) override {
7270
if (pos>=len) return false;
73-
p_data[pos].r = real;
74-
p_data[pos].i = img;
71+
k_data[pos].r = real;
72+
k_data[pos].i = img;
7573
return true;
7674
}
7775
bool getBin(int pos, FFTBin &bin) override {
7876
if (pos>=len) return false;
79-
bin.real = p_data[pos].r;
80-
bin.img = p_data[pos].i;
77+
bin.real = k_data[pos].r;
78+
bin.img = k_data[pos].i;
8179
return true;
8280
}
8381

8482
kiss_fft_cfg p_fft_object=nullptr;
8583
kiss_fft_cfg p_fft_object_inv=nullptr;
86-
kiss_fft_cpx *p_data = nullptr; // real
84+
Vector<kiss_fft_cpx> k_data{0}; // real
8785
int len = 0;
8886

8987
};
@@ -99,7 +97,7 @@ class AudioKissFFT : public AudioFFTBase {
9997

10098
/// Provides the complex array returned by the FFT
10199
kiss_fft_cpx *dataArray() {
102-
return driverEx()->p_data;
100+
return driverEx()->k_data.data();
103101
}
104102

105103
FFTDriverKissFFT* driverEx() {

src/AudioTools/AudioLibs/AudioRealFFT.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,12 @@ class AudioRealFFT : public AudioFFTBase {
9898

9999
/// Provides the real array returned by the FFT
100100
float* realArray() {
101-
return driverEx()->p_x;
101+
return driverEx()->v_x.data();
102102
}
103103

104104
/// Provides the complex array returned by the FFT
105105
float *imgArray() {
106-
return driverEx()->p_f;
106+
return driverEx()->v_f.data();
107107
}
108108

109109
FFTDriverRealFFT* driverEx() {

0 commit comments

Comments
 (0)