#ifndef AUDIO_ANALYSIS_H #define AUDIO_ANALYSIS_H #include #include #ifdef __cplusplus extern "C" { #endif /* FFT calculee sur 2048 points : le spectre d'un signal reel est symetrique, donc * seule la moitie (0 a Fe/2) est utile -> exactement 1024 points affichables, * correspondant a la capacite du widget Graph cote IHM. */ #define AUDIO_ANALYSIS_SAMPLE_RATE_HZ 48000U #define AUDIO_ANALYSIS_FFT_SIZE 2048U #define AUDIO_ANALYSIS_NUM_BINS (AUDIO_ANALYSIS_FFT_SIZE / 2U) /* 1024 : 0 a Fe/2 */ /* A appeler une fois au demarrage, comme AudioEffects_Init(). */ void AudioAnalysis_Init(void); /* A appeler depuis le chemin audio temps reel (ex: push_to_fifo), un echantillon * a la fois. Ne fait rien (cout quasi nul) tant que l'analyse n'est pas activee. */ void AudioAnalysis_PushSample(float sample); /* A appeler depuis la tache IHM (jamais depuis le contexte audio) : si un bloc de * AUDIO_ANALYSIS_FFT_SIZE echantillons est pret, calcule son spectre (fenetrage + * FFT + magnitude en dB). Retourne true si un nouveau spectre vient d'etre calcule. */ bool AudioAnalysis_Update(void); /* Spectre courant, AUDIO_ANALYSIS_NUM_BINS valeurs en dB (echelle approximative, * pour affichage uniquement), du bin 0 (continu) au bin NUM_BINS-1 (~Fe/2). Le * pas entre deux bins vaut AUDIO_ANALYSIS_SAMPLE_RATE_HZ / AUDIO_ANALYSIS_FFT_SIZE * (23.4375 Hz ici). Valide apres un AudioAnalysis_Update() ayant retourne true ; * inchange sinon (dernier spectre calcule). */ const float *AudioAnalysis_GetMagnitudesDb(void); /* Frequence (en Hz) du bin de plus forte magnitude dans le dernier spectre calcule * (frequence dominante / pic). Valide dans les memes conditions que * AudioAnalysis_GetMagnitudesDb(). */ float AudioAnalysis_GetPeakFrequencyHz(void); /* Active/desactive la capture et le calcul (pilote par le toggle de l'ecran Oscillo). */ void AudioAnalysis_SetEnabled(bool enabled); bool AudioAnalysis_IsEnabled(void); #ifdef __cplusplus } #endif #endif /* AUDIO_ANALYSIS_H */