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:22]
Petr Jedlička
2018:audio-analyzer [2019/01/14 13:25] (aktuální)
Petr Jedlička
Řádek 79: Řádek 79:
  
 {{ :​2018:​audio-analyzer:​vyvojovy_digram.jpg?​517x716 |Obr 1.11: Vývojový diagram }} {{ :​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.1547061769.txt.gz · Poslední úprava: 2019/01/09 20:22 autor: Petr Jedlička