Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2018:audio-analyzer

Audio spektrální analyzátor

Vypracoval: Petr Jedlička


Zadání

Implementujte spektrální analyzátor pro audio signály s využitím vývojové desky STM32F746G Discovery. Jako vstup bude sloužit digitální mikrofon a audio jack. Spektrální analýza bude provedena pomocí banky pásmových propustí pro jednotlivé třetiny oktáv. Výsledek bude zobrazen na barevném dotykovém displeji.

Úvod

V rámci tohoto projektu bylo vytvořeno zařízení pro měření frekvenčních vlastností audio signálů. Vzhledem k povaze signálu bylo pro spektrální analýzu zvoleno měření efektivní hodnoty signálu ve 30 frekvenčních pásmech, která odpovídají třetinám oktáv. Výsledkem měření je graf obsahující 30 frekvenčních sloupců, kde frekvenci odpovídá horizontální osa s logaritmickým rozložením a na vertikální ose je v závislosti na nastaveném audio vstupu vynesena intenzita signálu buď v dBmV pro audio jack, nebo v dB pro digitální mikrofon. Volba zdroje vstupního signálu je prováděna klepnutím na dotykový displej.

Hardware

K realizaci projektu byla použita vývojová deska STM32F746G Discovery od společnosti STMicroelectronics. Tato vývojová deska je vybavena celou řadou periferií, z nichž za zmínku stojí například rozhraní ethernet, rozhraní USB FS/HS, 128-Mbit SDRAM, 128-Mbit Quad-SPI Flash paměť, 2x digitální MEMS mikrofon, SAI audio kodek, vstupní a výstupní audio jack a 4,3„ barevný dotykový LCD-TFT displej s rozlišením 480×272 pixelů.

Z výše uvedených periferií byl využit dotykový displej, audio kodek, SDRAM paměť a digitální mikrofon. Vzhledem k tomu, že žádné jiné periferie nebyly potřeba, nebylo nutné vyvíjet ani žádný přídavný hardware. Vývojová deska je zobrazena na následujícím obrázku (obr. 1.1).

Obr 1.1: Vývojová deska

Číslicové zpracování signálu

V rámci spektrální analýzy audio signálu bylo vytvořeno a implementováno 30 třetinooktávových filtrů (pásmové propusti), 8 decimačních filtrů (dolní propusti) a 30 průměrovacích filtrů (dolní propusti). Všechny filtry byly navrženy v prostředí MATLAB, které zároveň sloužilo ke generaci koeficientů filtrů do zdrojového souboru.

Spektrální složky audio signálu jsou počítány jako efektivní hodnoty na výstupech jednotlivých třetinooktávových filtrů, a to postupně od nejvyšších frekvenčních pásem směrem k nižším frekvenčním pásmům, přičemž se snižujícími se frekvencemi pásem jsou postupně prováděny decimace signálu s decimačním faktorem rovným dvěma. Mezi jednotlivými decimacemi je počítáno 3 až 5 spektrálních složek. Na obrázku níže (obr. 1.2) je znázorněno blokové schéma spektrální analýzy.

Obr 1.2: Blokové schéma spektrální analýzy

Jednotlivé výstupy v blokovém schématu spektrální analýzy představují druhé mocniny efektivních hodnot signálu v jednotlivých pásmech. Pásmové propusti představují třetinooktávové filtry, dolní propusti následované změnou vzorkovacího kmitočtu představují decimační filtry a kvadrátory společně s následujícími dolními propustmi tvoří základ výpočtu efektivních hodnot. Z rozměrových důvodů jsou zobrazeny pouze dvě sekce mezi jednotlivými decimacemi, celkem je však těchto sekcí devět. Blokové schéma neobsahuje převod hodnoty do decibelové míry, ta je z jednoho bloku dat prováděna pouze pro poslední hodnotu, která je určená pro zobrazení na displeji.

Třetinooktávové filtry

Třetinooktávové filtry byly navrženy na základě specifikace ANSI S1.11-2004, podle které je poměr krajních kmitočtů všech třetin oktáv roven třetí odmocnině čísla 2. Po softwarové stránce návrh odpovídá nulté, tedy nejvyšší, třídě přesnosti dle výše zmíněné specifikace. Přesnost měření je však snížena vlastnostmi použitého mikrofonu, který není určen pro měřící aplikace. Pro návrh byla zvolena Chebyshevova aproximace prvního typu. Výsledkem bylo 30 číslicových filtrů šestého řádu. Na následujících 6 obrázcích (obr. 1.3 až 1.8) jsou zobrazeny frekvenční modulové charakteristiky tří vybraných pásem vždy v pořadí – celková charakteristika, detail pásma. Čárkované křivky značí horní a dolní mez charakteristiky, kterou definuje specifikace, a spojitá křivka značí výslednou navrženou charakteristiku. Návrh byl naprogramován ve skriptu s názvem third_octave_PB_filters_characteristics_and_design.m .

Obr 1.3: Pásmo 1

Obr 1.4: Pásmo 1 - detail

Obr 1.5: Pásmo 17

Obr 1.6: Pásmo 17 - detail

Obr 1.7: Pásmo 28

Obr 1.8: Pásmo 28 - detail

Decimační filtry

Důvodem návrhu decimačních filtrů bylo jednak dosažení menší výpočetní náročnosti díky snížení vzorkovací frekvence, a jednak jednodušší návrh pásmových propustí pro nízké kmitočty vzhledem k původní vzorkovací frekvenci, která byla nastavena na 44,1 kHz. Filtry byly navrženy s ohledem na vzorkovací teorém. Pro návrh byla zvolena Chebyshevova aproximace druhého typu. Výsledkem bylo 8 číslicových filtrů pátého řádu. Vzhledem k tomu, že vždy byla prováděna decimace dvěma a tudíž byly vždy kladeny stejné požadavky na frekvenční modulovou charakteristiku v závislosti na relativní frekvenci, koeficienty všech decimačních filtrů jsou totožné. Frekvenční modulová i fázová charakteristika decimačních filtrů je na obrázku níže (obr. 1.9.). Návrh byl naprogramován ve skriptu s názvem decimation_filters_design.m .

Obr 1.9: Decimační filtr - modulová a fázová charakteristika

Průměrovací filtry

Průměrovací filtry slouží jako integrátory při výpočtu efektivní hodnoty signálu a byly navrženy jako dolní propusti prvního řádu s časovou konstantou 100 milisekund, což je i obnovovací perioda displeje. Pro návrh byla zvolena Butterworthova aproximace. Příklad frekvenční modulové a fázové charakteristiky průměrovacího filtru je na následujícím obrázku (obr. 1.10). Návrh byl naprogramován ve skriptu s názvem avrg_filters.m .

Obr 1.10: Průměrovací filtr - modulová a fázová charakteristika

Firmware

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.

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
  • celý DMA buffer naplněn
  • čas pro obnovu displeje
  • čas pro obnovu horizontální osy grafu
  • čas pro kontrolu dotyku displeje
  • požadavek na změnu zdroje signálu.

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).

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.

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;
}

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ě.

/*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);

Nastavování požadavků a událostí zajišťující tyto funkce:

/*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);

Demonstrační video

Zdrojové soubory

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.txt · Poslední úprava: 2019/01/14 13:25 autor: Petr Jedlička