Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
2019:audio-visualizer [2020/01/19 15:45] Dominik Indrák [Zdroje] přidán odkaz |
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\\ | ||
Řádek 292: | Řádek 306: | ||
[6] STM32 F7 - Discovery rotate screen - emWin related - SEGGER - Forum. SEGGER - Forum [online]. Dostupné z: https://forum.segger.com/index.php/Thread/2572-STM32-F7-Discovery-rotate-screen/\\ | [6] STM32 F7 - Discovery rotate screen - emWin related - SEGGER - Forum. SEGGER - Forum [online]. Dostupné z: https://forum.segger.com/index.php/Thread/2572-STM32-F7-Discovery-rotate-screen/\\ | ||
[7] NXP Semiconductors | Automotive, Security, IoT [online]. Copyright ©0 [cit. 19.01.2020]. Dostupné z: https://www.nxp.com/docs/en/user-guide/UM03001_emWin5_3.pdf\\ | [7] NXP Semiconductors | Automotive, Security, IoT [online]. Copyright ©0 [cit. 19.01.2020]. Dostupné z: https://www.nxp.com/docs/en/user-guide/UM03001_emWin5_3.pdf\\ | ||
- | [8] https://www.youtube.com/watch?v=u_TVAudWabI&t=3s\\ | + | [8] STM32CubeMX Graphic LCD using STM32F429I-DISCO part1 [1/2] - YouTube. YouTube [online]. Dostupné z: https://www.youtube.com/watch?v=u_TVAudWabI&t=3s\\ |