42 #include "sqrt_integer.h"
43 #include "utility/dspinst.h"
44 #include "arm_const_structs.h"
55 static const uint32_t sign_mask = 0x80000000;
56 static const float b = 0.596227f;
60 memcpy(&ux, &x,
sizeof(x));
61 memcpy(&uy, &y,
sizeof(x));
65 uint32_t ux_s = sign_mask & ux;
66 uint32_t uy_s = sign_mask & uy;
69 float q = (float)( ( ~ux_s & uy_s ) >> 29 | ux_s >> 30 );
72 float bxy_a = ::fabs( b * x * y );
73 float num = bxy_a + y * y;
74 float atan_1q = num / ( x * x + bxy_a + num );
77 memcpy(&uatan, &atan_1q,
sizeof(atan_1q));
79 uint32_t uatan_2q = (ux_s ^ uy_s) | uatan;
80 memcpy(&atan_1q, &uatan_2q,
sizeof(uatan_2q));
99 const uint16_t *src = (
const uint16_t *)source;
100 uint16_t *dst = (uint16_t *)destination;
109 #ifndef ENABLE_F32_FFT
112 int16_t *buf = (int16_t *)buffer;
113 const int16_t *win = (int16_t *)window;;
115 for (
int i=0; i < 1024; i++) {
116 int32_t val = *buf * *win++;
126 float32_t *buf = (float32_t *)buffer;
127 const float32_t *win = (float32_t *)window;;
129 for (int16_t i=0; i < 1024; i++) {
151 arm_fill_f32(0,(float32_t*)&tmp_buffer[1024],1024);
152 arm_cfft_radix4_f32(&
fft_inst, (float32_t*)tmp_buffer);
155 for(int16_t i=0;i < 1024;i+=2){
157 if (!std::isfinite(
p))
p = 0;
162 arm_cmplx_mag_f32((float32_t*)tmp_buffer, (float32_t*)tmp_buffer, 1024);
163 for(int16_t i=0;i < 1024;i+=2){
165 output[i] = (output[i] + tmp_buffer[i]) / 2.0;
215 #ifdef ENABLE_F32_FFT
220 for (int16_t i=0; i < 1024; i++){
221 tmp_buffer[i] = ((float32_t)buffer[i] / (float32_t)32768.0);
223 if (!std::isfinite(tmp_buffer[i])) tmp_buffer[i] = 0.0;
230 memcpy(tmp_buffer,buffer,2048 *
sizeof(int16_t));
232 arm_cfft_radix4_q15(&
fft_inst, tmp_buffer);
235 for (
int i=0; i < 512; i++) {
236 uint32_t tmp = *((uint32_t *)tmp_buffer + i);
237 uint32_t magsq = multiply_16tx16t_add_16bx16b(tmp, tmp);
238 output[i] = sqrt_uint32_approx(magsq);
239 output_packed[i] = tmp;
const char PROGMEM p[][16]
static void release(audio_block_t *block)
audio_block_t * receiveReadOnly(unsigned int index=0)
uint16_t subsample_highfreqrange
uint16_t BLOCK_REFRESH_SIZE
virtual void update(void)
void copy_to_fft_buffer(void *destination, const void *source, int subsample)
const float32_t * window_f32
uint16_t subsample_lowfreqrange
arm_cfft_radix4_instance_f32 fft_inst
volatile bool is_analyzed
static const char * short_name_lookup
static void apply_window_to_fft_buffer(void *buffer, const void *window)
static void apply_window_to_fft_buffer_f32(float32_t *buffer, const float32_t *window)
float normalized_atan2(float y, float x)
int16_t data[AUDIO_BLOCK_SAMPLES]