arduino-audio-tools
AudioCmsisFFT.h
1 #pragma once
2 #include "AudioFFT.h"
3 #ifdef STM32
4 # include "CMSIS_DSP.h"
5 #endif
6 #if defined(ARDUINO_ARCH_RENESAS) || defined(ARDUINO_ARCH_RP2040)
7 # include "arm_vec_fft.h"
8 #endif
15 namespace audio_tools {
16 
23 class FFTDriverCmsisFFT : public FFTDriver {
24  public:
25  bool begin(int len) override {
26  TRACEI();
27  this->len = len;
28  input = new float[len];
29  output = new float[len*2];
30  output_magn = new float[len];
31  status = arm_rfft_fast_init_f32(&fft_instance, len);
32  if (status!=ARM_MATH_SUCCESS){
33  LOGE("arm_rfft_fast_init_f32: %d", status);
34  }
35  assert(input!=nullptr);
36  assert(output!=nullptr);
37  assert(output_magn != nullptr);
38  return input!=nullptr && output != nullptr && output_magn != nullptr;
39  }
40  void end()override{
41  TRACEI();
42  if (input!=nullptr) delete input;
43  if (output!=nullptr) delete output;
44  if (output_magn!=nullptr) delete output_magn;
45  input = nullptr;
46  output = nullptr;
47  output_magn = nullptr;
48  }
49 
50  void setValue(int idx, int value) override{
51  input[idx] = value;
52  }
53 
54  void fft() override {
55  TRACED();
56  arm_rfft_fast_f32(&fft_instance, input, output, ifft);
57  arm_cmplx_mag_f32(output, output_magn, len / 2);
58  /* Calculates maxValue and returns corresponding BIN value */
59  arm_max_f32(output_magn, len / 2, &result_max_value, &result_index);
60  TRACED();
61  };
62 
63  float magnitude(int idx) override {
64  return output_magn[idx];
65  }
66 
68  float magnitudeFast(int idx) override {
69  return output_magn[idx];
70  }
71 
72  virtual bool isValid() override{ return status==ARM_MATH_SUCCESS; }
73 
74  arm_rfft_fast_instance_f32 fft_instance;
75  arm_status status;
76  int len;
77  bool ifft = false;
78  float *input=nullptr;
79  float *output_magn=nullptr;
80  float *output=nullptr;
81  float result_max_value;
82  uint32_t result_index = 0;
83 
84 };
85 
92 class AudioCmsisFFT : public AudioFFTBase {
93  public:
95 
97  float* array() {
98  return driverEx()->output;
99  }
100 
101  float* magnitudes() {
102  return driverEx()->output_magn;
103  }
104 
105  AudioFFTResult result() {
106  AudioFFTResult ret_value;
107  ret_value.magnitude = driverEx()->result_max_value;
108  ret_value.bin = driverEx()->result_index;
109  return ret_value;
110  }
111 
112  FFTDriverCmsisFFT* driverEx() {
113  return (FFTDriverCmsisFFT*)driver();
114  }
115 };
116 
117 
118 }
AudioFFT for ARM processors that provided Cmsis DSP.
Definition: AudioCmsisFFT.h:92
float * array()
Provides the result array returned by CMSIS FFT.
Definition: AudioCmsisFFT.h:97
Executes FFT using audio data. The Driver which is passed in the constructor selects a specifc FFT im...
Definition: AudioFFT.h:82
AudioFFTBase(FFTDriver *driver)
Default Constructor. The len needs to be of the power of 2 (e.g. 512, 1024, 2048, 4096,...
Definition: AudioFFT.h:85
FFTDriver * driver()
provides access to the FFTDriver which implements the basic FFT functionality
Definition: AudioFFT.h:240
Driver for Cmsis-FFT see https://arm-software.github.io/CMSIS_5/DSP.
Definition: AudioCmsisFFT.h:23
float magnitudeFast(int idx) override
same as magnitude
Definition: AudioCmsisFFT.h:68
Abstract Class which defines the basic FFT functionality.
Definition: AudioFFT.h:65
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition: AnalogAudio.h:10