Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2019:audio-visualizer

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
2019:audio-visualizer [2020/01/19 15:46]
Dominik Indrák [Zdroje] oprava odkazu
2019:audio-visualizer [2020/01/20 19:42] (aktuální)
Dominik Indrák [Výpočet frekvenčního spektra]
Řádek 9: Řádek 9:
 {{ :​2019:​audio-visualizer:​mpoa_vyvojak.png?​direct |}} {{ :​2019:​audio-visualizer:​mpoa_vyvojak.png?​direct |}}
  
 +Pro vypracování projektu jsem využíval Cube MX 5.4.0 IDE s kombinací s projektovou strukturou z předmětu MPOA a editorem EmBitz.
 ===== Vzorkování vstupního signálu ===== ===== Vzorkování vstupního signálu =====
 Vstupní audio signál je nejdříve nutné posunout do napěťového rozsahu 0-3V, který odpovídá referenci analogového převodníku. K tomu slouží zapojení, které je na obrázku. Kondenzátor 0,47 uF s odporem 20 kΩ tvoří horní propust s mezním kmitočtem f<​sub>​m</​sub>​ = 16,93 Hz. Zároveň dělič s odpory 2x20 kΩ posunuje vstupní signál o stejnosměrnou úroveň, která je rovna V<​sub>​ref</​sub>/​2 = 1,5 V. Pokud by zbyl čas, bylo by dobré použít pásmovou propust (např. Wienův článek) s mezními kmitočty f<​sub>​m1</​sub>​ = 20 Hz a f<​sub>​m2</​sub>​ = 20 kHz případně pouze dolní propust s f<​sub>​m</​sub>​ = 20 kHz. Frekvence vyšší, než f<​sub>​vz</​sub>/​2 = 24 kHz sice neslyšíme,​ ale mohou nám pronikat do zobrazovaného spektra z důvodu zrcadlení spektra kolem f<​sub>​vz</​sub>/​2 (aliasing). ​ Vstupní audio signál je nejdříve nutné posunout do napěťového rozsahu 0-3V, který odpovídá referenci analogového převodníku. K tomu slouží zapojení, které je na obrázku. Kondenzátor 0,47 uF s odporem 20 kΩ tvoří horní propust s mezním kmitočtem f<​sub>​m</​sub>​ = 16,93 Hz. Zároveň dělič s odpory 2x20 kΩ posunuje vstupní signál o stejnosměrnou úroveň, která je rovna V<​sub>​ref</​sub>/​2 = 1,5 V. Pokud by zbyl čas, bylo by dobré použít pásmovou propust (např. Wienův článek) s mezními kmitočty f<​sub>​m1</​sub>​ = 20 Hz a f<​sub>​m2</​sub>​ = 20 kHz případně pouze dolní propust s f<​sub>​m</​sub>​ = 20 kHz. Frekvence vyšší, než f<​sub>​vz</​sub>/​2 = 24 kHz sice neslyšíme,​ ale mohou nám pronikat do zobrazovaného spektra z důvodu zrcadlení spektra kolem f<​sub>​vz</​sub>/​2 (aliasing). ​
Řádek 16: Řádek 17:
 {{:​2019:​audio-visualizer:​adc_config.png?​direct&​445 }} {{ :​2019:​audio-visualizer:​tim2_conf.png?​direct&​437}} {{:​2019:​audio-visualizer:​adc_config.png?​direct&​445 }} {{ :​2019:​audio-visualizer:​tim2_conf.png?​direct&​437}}
  
-HAL_ADC_ConvCpltCallback() se volá po dokončení konverze ADC. Zde se navzorkovaná data přepočítávají na Volty a ukládají do pole adc_samples[] o maximální velikosti FFT_SIZE. Pokud je toto pole plné nových vzorků, je nastaven flag fft_data_ready,​ což signalizuje,​ že se může spočítat FFT nad nově navzorkovanými daty. +HAL_ADC_ConvCpltCallback() se volá po dokončení konverze ADC. Zde se navzorkovaná data přepočítávají na milivolty ​a ukládají do pole adc_samples[] o maximální velikosti FFT_SIZE. Pokud je toto pole plné nových vzorků, je nastaven flag fft_data_ready,​ což signalizuje,​ že se může spočítat FFT nad nově navzorkovanými daty. 
  
 Využívaná makra Využívaná makra
 <code c> <code c>
 //ADC values //ADC values
-#​define ​    ​VREF ​                 3000    //volts+#​define ​    ​VREF ​                 3000    //[mV]
 #​define ​    ​ADC_MAX_RAW ​          ​4096 ​   //2pow12 #​define ​    ​ADC_MAX_RAW ​          ​4096 ​   //2pow12
 </​code>​ </​code>​
Řádek 53: Řádek 54:
  
 ===== Výpočet frekvenčního spektra ===== ===== Výpočet frekvenčního spektra =====
-Pokud jsou navzorkována nová data, překopírují se do pole audio_in[]. Pomocí funkce arm_rfft_fast_f32() je nad nimi vypočítána reálná FFT (resp. ​Diskrétní ​FFT), poslední ​parametr určuje, že se má počítat FFT a ne IFFT. Výsledky jsou uloženy do pole audio_out[]. Jelikož funkce vrací kromě X[0] a X[FFT_SIZE/​2] vzorků, které jsou reálné, komplexní čísla, je třeba vypočítat absolutní hodnotu z pole audio_out[] funkcí arm_cmplx_mag_f32(). ​Výslednoá ​amplituda se převede na decibely a z vypočítaných hodnot se funkcí DrawSpectrum() vykreslí frekvenční spektrum.+Pokud jsou navzorkována nová data, překopírují se do pole audio_in[]. Pomocí funkce arm_rfft_fast_f32() je nad nimi vypočítána reálná FFT (resp. ​reálná diskrétní ​FFT). Poslední vstupní ​parametr ​zmíněné funkce ​určuje, že se má počítat FFT a ne IFFT. Výsledky jsou uloženy do pole audio_out[]. Jelikož funkce vrací kromě X[0] a X[FFT_SIZE/​2] vzorků, které jsou reálné, komplexní čísla, je třeba vypočítat absolutní hodnotu z pole audio_out[] funkcí arm_cmplx_mag_f32(). ​Výsledná ​amplituda se převede na decibely a z vypočítaných hodnot se funkcí DrawSpectrum() vykreslí frekvenční spektrum. Vykreslování frekvenčního spektra je popsané níže.
  
 Makro definující velikost FFT. Makro definující velikost FFT.
Řádek 83: Řádek 84:
   arm_max_f32(magnitude_db,​ FFT_SIZE, &​maxValue,​ &​testIndex);​   arm_max_f32(magnitude_db,​ FFT_SIZE, &​maxValue,​ &​testIndex);​
  
-  DrawSpectrum(magnitude_db, maxValue, scale_y_inc3db,​ dB_per_px);+  DrawSpectrum(magnitude_db,​ scale_y_inc3db,​ dB_per_px);
  
   //New data for FFT can be saved   //New data for FFT can be saved
Řádek 93: Řádek 94:
 ===== Zobrazení frekvenčního spektra ===== ===== Zobrazení frekvenčního spektra =====
 K vykreslení frekvenčního spektra slouží funkce DrawSpectrum(),​ kde do ní vstupuje pole vzorků frekvenčního spektra v decibelech, offset osy Y a rozlišení osy Y. Offset slouží k dolazení spektra na požadované zobrazení po hrubém zvětšení/​zmenšení spektra pomocí změny rozlišení. K vykreslení frekvenčního spektra slouží funkce DrawSpectrum(),​ kde do ní vstupuje pole vzorků frekvenčního spektra v decibelech, offset osy Y a rozlišení osy Y. Offset slouží k dolazení spektra na požadované zobrazení po hrubém zvětšení/​zmenšení spektra pomocí změny rozlišení.
-Funkce vymaže displej, nastaví barvu pozadí a zavolá funkci pro vykreslení osy X a Y (popis funkce je níže). Následně dojde k vykreslení jednotlivých vzorků. Výška každé spektrální čáry je násobena rozlišením a je k ní přičítán offset. Měřítko ​spektra ​tedy může být změněno pomocí ovládacích tlačítek v menu, do kterého se dostaneme kliknutím na libovolnou pozici na displeji při vykreslování spektra.+Funkce vymaže displej, nastaví barvu pozadí a zavolá funkci pro vykreslení osy X a Y (popis funkce je níže). Následně dojde k vykreslení jednotlivých vzorků. Výška každé spektrální čáry je násobena ​převrácenou hodnotou ​rozlišení a je k ní přičítán offset. Měřítko ​osy Y tedy může být změněno pomocí ovládacích tlačítek v menu, do kterého se dostaneme kliknutím na libovolnou pozici na displeji při vykreslování spektra.
  
 Následující makra slouží pro definování pozice frekvenčního spektra na displeji. Následující makra slouží pro definování pozice frekvenčního spektra na displeji.
Řádek 137: Řádek 138:
 </​code>​ </​code>​
  
-Pro vykreslování na LCD displej je třeba nakopírovat do složky projektu zdrojové soubory STemWinu, který lze buďto stáhnout samostatně ([[https://​www.st.com/​en/​embedded-software/​stemwin.html|STemWin]]) a nebo je součástí Cube MX v adresáři CubeMX\Middlewares\ST\STemWin. STemWin je profesionální grafická knihovna, ze které se využily pouze základní funkce pro kreslení geometrických tvarů. ​+Pro vykreslování na LCD displej je třeba nakopírovat do složky projektu zdrojové soubory STemWinu, který lze buďto stáhnout samostatně ([[https://​www.st.com/​en/​embedded-software/​stemwin.html|STemWin]]) a nebo je součástí Cube MX v adresáři CubeMX\Middlewares\ST\STemWin. STemWin je profesionální grafická knihovna, ze které se využily pouze základní funkce pro kreslení geometrických tvarů. ​Tato knihovna byla zvolena, protože bylo třeba otočit orientaci displeje (hlavně textu) o 90°, což nebylo s BSP knihovnou k LCD možné. GUI, které je součástí CubeMX nebylo použito z časových důvodů. 
 + 
 +Na následujícím obrázku je nastavení pro displej z CubeMX. Displej byl nastavován podle videa [8] a kromě LTDC bylo nutné nastavit FMC (Flexible Memory Controller) a SPI (Serial Peripheral Interface) 
 + 
 +{{ :​2019:​audio-visualizer:​ltdc_conf.png?​direct&​600 }}
  
 Makra používaná při vykreslování osy X a Y a jejich popisů. Makra používaná při vykreslování osy X a Y a jejich popisů.
Řádek 158: Řádek 163:
 </​code>​ </​code>​
  
-Voláním funkce DrawAxis() se vykreslí osa X a Y, jejich základní dělení a popisy a také informace o nastaveném offsetu a rozlišení osy Y spektra. Jelikož je funkce dlouhá, je tu zobrazen pouze její začátek a konec. ​celá funkce je ve zdrojovém souboru main.c.+Voláním funkce DrawAxis() se vykreslí osa X a Y, jejich základní dělení a popisy a také informace o nastaveném offsetu a rozlišení osy Y spektra. Jelikož je funkce dlouhá, je tu zobrazen pouze její začátek a konec. ​Celá funkce je ve zdrojovém souboru main.c.
  
 <code c> <code c>
Řádek 203: Řádek 208:
 </​code>​ </​code>​
 ===== Zobrazení menu ===== ===== Zobrazení menu =====
-Menu je možné zobrazit ​klepnutím ​kamkoliv na displej. V menu je pak možnost nastavit hrubé rozlišení osy Y a offset pro jemné dolazení s hodnotou +3 dB nebo -3 dB.+Menu je možné zobrazit ​dotykem ​kamkoliv na displej. V menu je pak možné nastavit hrubé rozlišení osy Y a offset pro jemné dolazení s hodnotou +3 dB nebo -3 dB.
  
 <code c> <code c>
Řádek 235: Řádek 240:
 </​code>​ </​code>​
  
-Do funkce vstupují nastavené hodnoty rozlišení a offsetu, které pak funkce zobrazí u nastavovacích tlačítek, kterým odpovídá. Nejdříve je vykreslen sloupec ​pro offset, tzn. dvě nastavovací tlačítka s textem a 1 pole pro zobrazení nastavené hodnoty. Následuje vykreslení ​sloupce ​rozlišení (funkce zkrácena-lze vidět v souboru main.c projektu) opět s dvěma tlačítky pro zvýšení/​snížení rozlišení a pak pole pro zobrazení nastavené hodnoty. Zároveň jsou tyto hodnoty vykreslovány spolu osami X a Y a jsou pod spektrem pro informaci. Z menu se lze dostat tlačítkem BACK. +Do funkce vstupují nastavené hodnoty rozlišení a offsetu, které pak funkce zobrazí u nastavovacích tlačítek, kterým odpovídá. Nejdříve je vykreslena část ​pro offset, tzn. dvě nastavovací tlačítka s textem a 1 pole pro zobrazení nastavené hodnoty. Následuje vykreslení ​části ​rozlišení (funkce zkrácena-kompletní ​lze vidět v souboru main.c projektu) opět s dvěma tlačítky pro zvýšení/​snížení rozlišení a pak pole pro zobrazení nastavené hodnoty. Zároveň jsou tyto hodnoty vykreslovány spolu osami X a Y a jsou pod spektrem pro informaci. Z menu se lze dostat tlačítkem BACK. 
  
 <code c> <code c>
Řádek 284: Řádek 289:
 </​code>​ </​code>​
 ===== Závěr ===== ===== Závěr =====
 +Byl naprogramován zvukový vizualizér,​ který vzorkuje vstupní signál pomocí ADC převodníku s vzorkovací frekvencí f<​sub>​vz</​sub>​ = 48 kHz. Vypočítané frekvenční spektrum je vykreslováno na dotykovém TFT displeji. Pomocí jednoduchého menu je možné měnit rozlišení Y osy spektra.
 +Pro vstup audio signálu byl použit filtr typu horní propust, který ovšem nebyl ideální (frekvence větší jak f<​sub>​vz</​sub>​ by způsobovaly aliasing) a z časových důvodů nebyl předělán. Lepší by by byla pásmová propust nalazená na slyšitelné spektrum, tzn. 20 Hz - 20 kHz. 
 +Aby bylo možné vykreslovat na displej na šířku, na poslední chvíli byla použita část knihovny STemWin. Lepší by ovšem bylo využití kompletní knihovny STemWin s GUI například přímo v CubeMX. vylepšením by mohlo být, aby frekvenční spektrum nebylo vykreslováno celé, ale bylo rozděleno na oktávy. Každá oktáva by pak zahrnovala spektrum z okolních frekvencí. Šlo by pak lépe vidět rozložení spektra na nižších frekvencích (cca 20 Hz - 1kHz).
 +
 +[[http://​leteckaposta.cz/​647359699|Zdrojové soubory]]
 +
 +{{youtube>​SbM17JHXQDU?​medium}}
 +
 +
 ===== Zdroje ===== ===== Zdroje =====
 [1] Real FFT Functions. Keil Embedded Development Tools for Arm, Cortex-M, Cortex-R4, 8051, C166, and 251 processor families. [online]. Dostupné z: https://​www.keil.com/​pack/​doc/​CMSIS/​DSP/​html/​group__RealFFT.html\\ [1] Real FFT Functions. Keil Embedded Development Tools for Arm, Cortex-M, Cortex-R4, 8051, C166, and 251 processor families. [online]. Dostupné z: https://​www.keil.com/​pack/​doc/​CMSIS/​DSP/​html/​group__RealFFT.html\\
2019/audio-visualizer.1579445185.txt.gz · Poslední úprava: 2020/01/19 15:46 autor: Dominik Indrák