Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2018:audio-analyzer

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
2018:audio-analyzer [2019/01/09 20:08]
Petr Jedlička
2018:audio-analyzer [2019/01/14 13:25] (aktuální)
Petr Jedlička
Řádek 63: Řádek 63:
 Pro naprogramování mikrokontroléru bylo použito Atollic TrueSTUDIO. Pro ovládání periferií mikrokontroléru byly použity HAL knihovny od výrobce mikrokontroléru. Pro ovládání periferií na vývojové desce byly použity BSP (Board Support Package) knihovny. Pro naprogramování mikrokontroléru bylo použito Atollic TrueSTUDIO. Pro ovládání periferií mikrokontroléru byly použity HAL knihovny od výrobce mikrokontroléru. Pro ovládání periferií na vývojové desce byly použity BSP (Board Support Package) knihovny.
  
-Veškeré funkce vytvořené za účelem měření a zobrazení spektra jsou zahrnuty v knihovně asa.h (Audio Spectrum Analyzer). ​Struktura programu by se dala přirovnat ke kooperativnímu multitaskingu. V nekonečné smyčce běží funkce, která sleduje nastávající události, na základě kterých spouští odpovídající funkce (úlohy). Mezi události patří:+Struktura programu by se dala přirovnat ke kooperativnímu multitaskingu. V nekonečné smyčce běží funkce, která sleduje nastávající události, na základě kterých spouští odpovídající funkce (úlohy). Mezi události patří:
   * polovina DMA bufferu naplněna   * polovina DMA bufferu naplněna
   * celý DMA buffer naplněn   * celý DMA buffer naplněn
Řádek 72: Řádek 72:
 Události jsou nastavovány prostřednictvím callback funkcí pro DMA a 1ms systick časovač. Události jsou nastavovány prostřednictvím callback funkcí pro DMA a 1ms systick časovač.
  
 +Funkční prototypy funkcí vytvořených za účelem měření a zobrazení spektra jsou zahrnuty v knihovně asa.h. Definice těchto funkcí se nachází ve zdrojovém souboru asa.c.
 +
 +Deklarace proměnných obsahujících koeficienty filtrů jsou zahrnuty v knihovně asa_filt_coefs.h. Definice těchto proměnných se nachází ve zdrojovém souboru asa_filt_coefs.c.
 +
 +Zjednodušený vývojový diagram měřící aplikace je na obrázku níže (obr. 1.11).
 +
 +{{ :​2018:​audio-analyzer:​vyvojovy_digram.jpg?​517x716 |Obr 1.11: Vývojový diagram }}
 +
 +==== Implementace výpočtu spektra ====
 +
 +Jádrem celého číslicového zpracování je funkce void ASA_make_third_octave_spectrum(void).Tato funkce provádí postupný výpočet spektrálních složek směrem od nejvyšších kmitočtů k nejnižším. Při každém zavolání funkce dojde v cyklu s počtem opakování rovným počtu třetinooktáv k filtraci připraveného vstupního signálu pomocí odpovídajícího třetinooktávového filtru, k následnému výpočtu druhé mocniny efektivní hodnoty vyfiltrovaného signálu a k výpočtu spektrální složky v decibelové míře. Vzhledem k tomu, že při výpočtu efektivní hodnoty není na závěr provedena druhá odmocnina, decibelová míra je vynásobena hodnotou exponentu pro druhou odmocninu. Funkce zároveň provádí kontrolu nejnižšího možného vzorkovacího kmitočtu pro nastávající třetinooktávové pásmo a na základě toho provádí decimaci vstupního signálu.
 +
 +<code c>
 +static void ASA_make_third_octave_spectrum(void)
 +{
 +  float buff_temp[AUDIO_IN_BUFFER_LENGTH/​4];​
 +  uint32_t size = AUDIO_IN_BUFFER_LENGTH/​4;​
 +  ASA_freq_in_typedef freq_in = ASA_FREQ_IN_44100Hz;​
 +
 +  for(int8_t band_num = THIRD_OCTAVE_FILTERS_NUM - 1; band_num >= 0; band_num--)
 +  {
 +    ASA_third_octave_filtering(f_audio_in_data,​ buff_temp, band_num, size);
 +    ASA_make_mean_square(buff_temp,​ buff_temp, band_num, freq_in, size);
 +
 +    if(ASA_general_settings.audio_input == ASA_AUDIO_INPUT_MICROPHONE)
 +      third_octave_spectrum[band_num] = 10*log10(buff_temp[size -1]/​SPL_EDGE_OF_HEARING/​MICPHONE_CALIB_CONST);​
 +    else
 +      third_octave_spectrum[band_num] = 10*log10(buff_temp[size - 1]/​32768.0*1650.0);​ //3300mV/2 = 1650mV, 2^15=32768
 +
 +    switch(band_num)
 +    {
 +      case ASA_DECIMATE_BAND_345Hz:​
 +        freq_in = ASA_FREQ_IN_172Hz;​
 +        ASA_decimate_2x(f_audio_in_data,​ f_audio_in_data,​ freq_in, size);
 +        size >>= 1;
 +        break;
 +      case ASA_DECIMATE_BAND_689Hz:​
 +        freq_in = ASA_FREQ_IN_345Hz;​
 +        ASA_decimate_2x(f_audio_in_data,​ f_audio_in_data,​ freq_in, size);
 +        size >>= 1;
 +        break;
 +      case ASA_DECIMATE_BAND_1378Hz:​
 +        freq_in = ASA_FREQ_IN_689Hz;​
 +        ASA_decimate_2x(f_audio_in_data,​ f_audio_in_data,​ freq_in, size);
 +        size >>= 1;
 +        break;
 +      case ASA_DECIMATE_BAND_2756Hz:​
 +        freq_in = ASA_FREQ_IN_1378Hz;​
 +        ASA_decimate_2x(f_audio_in_data,​ f_audio_in_data,​ freq_in, size);
 +        size >>= 1;
 +        break;
 +      case ASA_DECIMATE_BAND_5513Hz:​
 +        freq_in = ASA_FREQ_IN_2756Hz;​
 +        ASA_decimate_2x(f_audio_in_data,​ f_audio_in_data,​ freq_in, size);
 +        size >>= 1;
 +        break;
 +      case ASA_DECIMATE_BAND_11025Hz:​
 +        freq_in = ASA_FREQ_IN_5513Hz;​
 +        ASA_decimate_2x(f_audio_in_data,​ f_audio_in_data,​ freq_in, size);
 +        size >>= 1;
 +        break;
 +      case ASA_DECIMATE_BAND_22050Hz:​
 +        freq_in = ASA_FREQ_IN_11025Hz;​
 +        ASA_decimate_2x(f_audio_in_data,​ f_audio_in_data,​ freq_in, size);
 +        size >>= 1;
 +        break;
 +      case ASA_DECIMATE_BAND_44100Hz:​
 +        freq_in = ASA_FREQ_IN_22050Hz;​
 +        ASA_decimate_2x(f_audio_in_data,​ f_audio_in_data,​ freq_in, size);
 +        size >>= 1;
 +        break;
 +      default:
 +        break;
 +    }
 +  }
 +
 +return;
 +}
 +</​code>​
 +
 +==== Další funkce ====
 +
 +V této sekci jsou uvedeny další potřebné funkce, které zajišťují například inicializaci zařízení,​ vykreslování na displej a podobně. ​
 +
 +<code c>
 +/​*inicializace zařízení*/​
 +void ASA_init(void); ​
 +
 +/*kontrola událostí*/​
 +void ASA_check_events(void);​
 +
 +/​*aktualizace informací na displeji*/
 +void ASA_display_refresh(void);​
 +
 +/*čtení dotykové vrstvy displeje*/
 +void ASA_read_ts_state(void);​
 +
 +/*změna audio vstupu*/
 +void ASA_change_input(void);​
 +
 +/​*vykreslení os grafu*/
 +void ASA_create_xy_axis(void);​
 +
 +/*filtrace zvoleným třetinooktávovým filtrem*/
 +void ASA_third_octave_filtering(float *src, float *dest, uint8_t band_num, uint32_t size);
 +
 +/*výpočet druhé mocniny efektivní hodnoty pro zvolenou vzorkovací frekvenci a pásmo*/
 +void ASA_make_mean_square(float *src, float *dest, uint8_t band_num, ASA_freq_in_typedef freq_in, uint32_t size); ​
 +
 +/*převod vzorků signálu do formátu s plovoucí řádovou čárkou*/
 +void ASA_int2float_conv(float *buff_out, int16_t *buff_in, uint32_t size, ASA_int2float_mode_typedef mode); ​
 +
 +/*decimace dvěma zvoleného vstupního signálu o zadané vzorkovací frekvenci*/
 +void ASA_decimate_2x(float *src, float *dest, ASA_freq_in_typedef freq_in, uint32_t size);
 +
 +/​*inicializace LCD*/
 +void ASA_LCD_init(void);​
 +
 +/​*inicializace audio periferií*/​
 +void ASA_audio_init(void);​
 +
 +/​*inicializace dotykové vrstvy LCD*/
 +void ASA_ts_init(void);​
 +
 +/​*inicializace nastavení do výchozí hodnoty*/
 +void ASA_settings_init(void);​
 +</​code>​
 +
 +Nastavování požadavků a událostí zajišťující tyto funkce:
 +
 +<code c>
 +/*callback funkce pro DMA full transfer*/
 +void ASA_AUDIO_IN_TransferComplete_CallBack(void);​
 +
 +/*callback funkce pro DMA half transfer*/
 +void ASA_AUDIO_IN_HalfTransfer_CallBack(void);​
 +
 +/*funkce volaná v obsluze přerušení 1ms systicku, obsluha interních časovačů pro asa.c*/
 +void ASA_ISR_1ms(void);​
 +</​code>​
 +
 +===== Demonstrační video =====
 +
 +{{youtube>​UeRGOTw87YU?​medium}}
 +
 +===== Zdrojové soubory =====
 +
 +MATLAB: {{ :​2018:​audio-analyzer:​audio_spectrum_analyzer_matlab.zip |}}
 +
 +TrueSTUDIO: {{ :​2018:​audio-analyzer:​audio_spectrum_analyzer_truestudio.zip |}}
 +
 +===== Závěr =====
 +
 +Výsledkem tohoto projektu je funkční zařízení schopné měřit spektrální vlastnosti audio signálu přicházejícího buď z MEMS mikrofonu, nebo z audio jacku. Po softwarové stránce zařízení odpovídá nulté, tedy nejvyšší,​ třídě přesnosti. Po hardwarové stránce je tato přesnost snížena především kvůli mikrofonu, který není určen pro měřící aplikace. Do budoucna je v plánu přidat další měřící funkce jako například markery nebo FFT pro jednotlivá pásma.
2018/audio-analyzer.1547060897.txt.gz · Poslední úprava: 2019/01/09 20:08 autor: Petr Jedlička