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 21:42] Dominik Indrák [Výpočet frekvenčního spektra] |
2019:audio-visualizer [2020/01/20 19:42] (aktuální) Dominik Indrák [Výpočet frekvenčního spektra] |
||
---|---|---|---|
Řádek 84: | Řá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 94: | Řá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 138: | Řá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 159: | Řá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 204: | Řá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 236: | Řá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 285: | Řá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\\ |