40 #ifndef erisanalyze_fft1024_h_
41 #define erisanalyze_fft1024_h_
46 #include "analyze_fft1024.h"
50 #define ENABLE_F32_FFT
81 arm_cfft_radix4_init_f32(&
fft_inst,1024, 0, 1);
85 arm_cfft_radix4_init_q15(&
fft_inst, 1024, 0, 1);
87 window = AudioWindowHanning1024;
106 memset(&buffer,0,
sizeof(int16_t)*2048);
107 #ifdef ENABLE_F32_FFT
109 arm_fill_f32(0,(float32_t*)output,1024);
111 arm_fill_f32(0,(float32_t*)tmp_buffer,2048);
112 arm_fill_f32(0,(float32_t*)
phase,512);
114 memset(&output,0,
sizeof(uint16_t)*512);
115 memset(&tmp_buffer,0,
sizeof(int16_t)*2048);
159 float read(
unsigned int binNumber) {
160 if (binNumber > 511)
return 0.0;
161 #ifdef ENABLE_F32_FFT
162 return output[binNumber];
164 return (
float)(output[binNumber]) * (1.0 / 16384.0);
167 float read(
unsigned int binFirst,
unsigned int binLast,FFTReadRange *fftRR = NULL) {
169 float32_t powerf = 0;
173 span = binLast - binFirst;
174 if(span<1)
return 0.0;
176 if (binFirst > binLast) {
177 unsigned int tmp = binLast;
183 fftRR->peakFrequency = 0;
184 fftRR->peakValue = 0;
186 if (binFirst > 510)
return 0.0;
187 if (binLast > 511) binLast = 511;
188 arm_power_f32((float32_t*)&output[binFirst], span, &powerf);
189 arm_max_f32((float32_t*)&output[binFirst], span, &maxf, &peak_index);
191 arm_sqrt_f32((powerf)/(32768.0/
subsample_by),&fftRR->peakValue);
192 fftRR->peakBin = peak_index + binFirst;
193 if(fftRR->phase <
phase[fftRR->peakBin]){
194 fftRR->phase =
phase[fftRR->peakBin];
195 }
else fftRR->phase =
phase[fftRR->peakBin];
199 float read(FFTReadRange *fftRR){
200 return read(fftRR->startFrequency, fftRR->stopFrequency, fftRR);
203 float read(
float freq_from,
float freq_to, FFTReadRange *fftRR = NULL) {
207 unsigned int start_bin;
208 unsigned int stop_bin;
211 bin_size = bw/1024.0f;
212 start_bin = (
unsigned int)(freq_from / bin_size);
213 stop_bin = (
unsigned int)(freq_to / bin_size);
214 if (start_bin > 511 || stop_bin > 511){
229 fftRR->startBin = start_bin;
230 fftRR->stopBin = stop_bin;
231 fftRR->startFrequency = freq_from;
232 fftRR->stopFrequency = freq_to;
242 fftRR->estimatedFrequency=0;
243 fftRR->peakFrequency=0;
245 fftRR->avgValueFast=0;
246 fftRR->avgValueSlow=0;
247 fftRR->transientValue=0;
252 float rval =
read(start_bin,stop_bin,fftRR);
256 fftRR->peakFrequency = (fftRR->peakBin * bin_size) - (bin_size/2.0);
257 if (fftRR->peakFrequency < 0) fftRR->peakFrequency = 0.01;
259 if ((fftRR->peakBin > 1) && (fftRR->peakBin < 510)){
261 float lobeFrequency = 1;
262 if ((output[fftRR->peakBin+1]-output[fftRR->peakBin-1]) > 0.1 && (output[fftRR->peakBin] > 0)){
264 ratio = (output[fftRR->peakBin+1] - output[fftRR->peakBin-1] + output[fftRR->peakBin+1]) / (1.0 * output[fftRR->peakBin]);
265 lobeFrequency = ((fftRR->peakBin+1) * bin_size) - bin_size/2;
266 }
else if (output[fftRR->peakBin-1] > 0.1 && (output[fftRR->peakBin] > 0)){
268 ratio = (output[fftRR->peakBin-1]-output[fftRR->peakBin+1] + output[fftRR->peakBin-1]) / (1.0 * output[fftRR->peakBin]);
269 lobeFrequency = ((fftRR->peakBin-1) * bin_size) - bin_size/2;
271 fftRR->estimatedFrequency = (fftRR->peakFrequency * (1-ratio)) + (lobeFrequency * ratio);
273 if (fftRR->estimatedFrequency > fftRR->stopFrequency)fftRR->estimatedFrequency = fftRR->stopFrequency;
274 if (fftRR->estimatedFrequency < fftRR->startFrequency)fftRR->estimatedFrequency = fftRR->startFrequency;
278 fftRR->avgValueFast = (fftRR->avgValueFast * ratio) + (fftRR->peakValue * (1.0f -ratio));
281 fftRR->avgValueSlow = (fftRR->avgValueSlow * ratio) + (fftRR->avgValueFast * (1.0f -ratio));
282 if(fftRR->peakValue > fftRR->avgValueFast) fftRR->avgValueFast = (fftRR->avgValueFast/7.0 )+(fftRR->peakValue/3.0);
283 if (fftRR->avgValueFast > 0){
284 fftRR->transientValue = (fftRR->transientValue + (fftRR->avgValueFast - fftRR->avgValueSlow)/(0.00001 + fftRR->avgValueFast))* 0.5;
285 }
else fftRR->transientValue = 0;
286 fftRR->transientValue *= 0.95;
287 fftRR->avgValueFast *= 0.998;
288 fftRR->avgValueSlow *= 0.998;
301 if (((
const FFTReadRange *)
p)->
cqtBin <= ((
const FFTReadRange *)q)->
cqtBin)
return 1;
323 for (uint16_t i = 1; i < 1024 - 1; i++){
324 if ((output[i-1] < output[i])&&(output[i] > output[i+1])){
325 output[i] += output[i-1] + output[i+1];
335 virtual void update(
void);
359 #ifdef ENABLE_F32_FFT
const char PROGMEM p[][16]
uint16_t subsample_highfreqrange
void windowFunction(const int16_t *w)
uint16_t BLOCK_REFRESH_SIZE
float read(float freq_from, float freq_to, FFTReadRange *fftRR=NULL)
arm_cfft_radix4_instance_q15 fft_inst
virtual void update(void)
void copy_to_fft_buffer(void *destination, const void *source, int subsample)
static int compare_fftrr_value(const void *p, const void *q)
int16_t buffer[2048] __attribute__((aligned(2)))
volatile float32_t output[1024] __attribute__((aligned(4)))
void enableFFT(bool enable_state)
int16_t tmp_buffer[2048] __attribute__((aligned(4)))
const float32_t * window_f32
float32_t phase[512] __attribute__((aligned(4)))
static void sort_fftrr_by_cqt_bin(FFTReadRange *a, size_t n)
uint16_t subsample_lowfreqrange
static int compare_fftrr_cqt_bin(const void *p, const void *q)
float read(unsigned int binFirst, unsigned int binLast, FFTReadRange *fftRR=NULL)
static void sort_fftrr_by_value(FFTReadRange *a, size_t n)
audio_block_t * inputQueueArray[1]
arm_cfft_radix4_instance_f32 fft_inst
float read(unsigned int binNumber)
void configSubsample(uint16_t subsample, subsample_range range)
void setActiveRange(subsample_range range)
volatile bool is_analyzed
void averageTogether(uint8_t n)
volatile float32_t tmp_buffer[2048] __attribute__((aligned(4)))
static const char * short_name_lookup
float read(FFTReadRange *fftRR)
erisAudioAnalyzeFFT1024()
uint16_t output[512] __attribute__((aligned(4)))
erisAudioAnalyzeFFT1024 __attribute__