Harmonická analýza je vědní obor zabývající se rozkladem libovolného periodického signálu na nekonečnou řadu sinových a kosinových průběhů o různé amplitudě a frekvenci, která je celistvým násobkem frekvence rozkládaného signálu. Tento rozklad není jednoduchý a je k němu nezbytné důkladně ovládat potřebný matematický aparát a poněkud hlouběji rozumět elektronice a teorii střídavých periodických signálů.
Řešení harmonické analýzy patří v elektrotechnice k velmi často používaným výpočtům. Pomocí analýzy je možné objasnit změnu tvaru signálu po průchodu nejrůznějšími frekvenčně nelineárními obvody (zesilovačem, integračním nebo derivačním článkem, telefonním vedením). Z výsledku harmonické analýzy je patrné, jak je signál bohatý na vysokofrekvenční složky a jaké kmitočtové pásmo je třeba zvolit, aby byl signál přenesen s co možná nejmenší změnou tvaru a ztrátou vyšších harmonických složek. Analýza střídavého signálu je tedy velmi důležitá, ovšem její vyřešení bez použití počítače je značně zdlouhavé a pravděpodobnost výskytu početní chyby je nepřijatelně vysoká. Například rozklad průběhu na prvních deset harmonických s použitím kalkulačky trvá nejméně jednu hodinu, přičemž je třeba spočítat okolo dvou set výpočtů se sinem, kosinem a dalšími goniometrickými funkcemi. Hlubší analýza po dvacátou a vyšší harmonickou je prakticky nemyslitelná.
Matematicky i fyzikálně je dokázáno, že periodické signály libovolného tvaru, s jejichž nejrozmanitějšími průběhy v elektrotechnice běžně pracujeme, lze nahradit řadou sinových a kosinových průběhů. Jejich amplitudy, kmitočty a vzájemná fázová posunutí lze zjistit výpočtem nebo měřením. V praxi to srozumitelně řečeno znamená, že ať má graf periody signálu tvar obdélníku, pily či úplně jiný tvar, skládá se vždy z řady harmonických sinusových průběhů, jejichž kmitočet je celistvým násobkem frekvence první harmonické. Opačně je také možné říci, že skládáním sinových či kosinových průběhů lze získat jakýkoliv tvar signálu. Dle matematické poučky může být každá jednoznačně určená periodická funkce F(t), která má v intervalu T konečný počet extrémů a nespojitostí prvního druhu, vyjádřena Fourierovou řadou, tj. nekonečnou goniometrickou řadou ve tvaru
F(t) = a0 + a1 cos wt + a2 cos 2 wt + ... + an cos n wt + b1 sin wt + b2 sin 2 wt + ... + bn sin n wt
Je-li průběh křivky analyzovaného signálu souměrný podle počátku, tj. platí-li následující vztah: F(-t) = -F(t) , vyjdou výpočtem všechny součinitele při kosinových složkách nulové. Fourierův rozvoj obsahuje jen složky sinusové.
Je-li křivka souměrná podle osy y, tj. platí-li F(-t) = F(t) , obsahuje Fourierův rozvoj naopak jen složky kosinové.
Opakují-li se hodnoty z první půlperiody v druhé polovině s opačným znaménkem, tj. platí-li F(t + T/2) = -F(t) , obsahuje rozvoj jen liché členy.
Naproti tomu opakují-li se hodnoty funkce v druhé polovině periody se stejným znaménkem, tj platí-li F(t + T/2) = F(t) , obsahuje Fourierova řada pouze členy sudé.
Existuje několik metod pro zjištění harmonických: matematická, numerická, grafická či měřící. Nejsnáze lze Fourierův rozvoj určit numerickou metodou. Tato metoda je však méně přesná než matematická. Její princip spočívá v tom, že periodu rozdělíme na p dílků, minimálně dle vztahu: p = 2n+2, kde n je číslo nejvyšší harmonické, po kterou budeme signál analyzovat.
Výsledek harmonické analýzy není vždy třeba psát formou úplné Fourierovy řady, úspornější a výstižnější je popsat funkci pomocí souboru amplitud An jednotlivých harmonických. Tato posloupnost se nazývá amplitudovým spektrem funkce. Amplitudové spektrum se doplňuje spektrem fázovým a v některých případech se místo něj uvádějí spektra složek sinových a kosinových. Spektrum vypadá tak, že na vodorovné ose jsou vyneseny kmitočty harmonických v násobcích základního kmitočtu f a svisle ke každému kmitočtu se vynese úsečka, jejíž délka je úměrná velikosti amplitudy příslušné harmonické (resp. amplitudě sinové složky, kosinové složky, fázovému úhlu).
Výpočet harmonické analýzy je úkol maximálně vhodný pro užití moderní výpočetní techniky. Současné programy zabývající se tímto problémem jsou však obvykle velmi uživatelsky nepřívětivé, zadání průběhu se provádí číselně a je zdlouhavé, analýza je možná většinou pouze po 20 až 30 harmonických. Tyto jmenované nedostatky jsme se snažili v našem programu eliminovat a zaplnit tak mezeru v oblasti současného softwaru určeného pro elektrotechniku.
Jedná se o program pracující v prostředí Microsoft Windows, určený pro výpočet harmonické analýzy daného průběhu signálu dle Fourierovy transformace. V uživatelsky atraktivním příjemném prostředí programu lze interaktivně zadat vstupní funkci a provést výpočet v multitaskingovém prostředí. Je možné odfiltrovat část spektra harmonických, nebo zjistit šířku pásma pro danou amplitudu. Výsledky jsou prezentovány všemi běžnými formami na monitoru, včetně harmonické syntézy, je možný tisk výsledků. Program umožňuje navíc také frekvenční analýzu zvukových souborů.
Práce probíhala ve čtyřech etapách:
1. Vytvoření prostředí programu - MDI rámcové okno, dědičná okna, zabezpečení základních funkcí - clipboard, práce s okny...
2. Vytvoření funkce pro výpočet, zobrazovací metody jednotlivých oken
3. Tisku , vytvoření kontextově závislé nápovědy, spojení s programem
4. Doladění chyb, doplnění funkcí programu z připomínek uživatelů
Program Harmonická analýza byl naprogramován v Borland Pascalu pro Windows v. 7.0. Typickým znakem tohoto vývojového prostředí je čistě objektový přístup k řešení jakéhokoli problému. Tento přístup, pro který se vžil název objektově orientované programování - dále OOP, v poslední době zažívá prudký vzrůst popularity a do jisté míry vytlačuje standardní konvence psaní programů metodou „od shora dolů". Přitom historie OOP sahá až do roku 1989, kdy se firma Microsoft pokusila implementovat OOP do svého kompilátoru jazyka pascal.
Pro programátora výše uvedená skutečnost znamená, že má v Borland Pascalu k dispozici obvyklé vlastnosti OOP: zapouzdření (encapsulation), dědičnost (inheritance) a mnohotvarost (polymorphism). Zapouzdření představuje ukrytí dat patřících objektu do jeho nitra. Dle takovéhoto principu by mělo být možné k těmto datům přistupovat pouze pomocí metod daného objektu. Toto je jeden ze základních stavebních kamenů OOP - filozofie sjednocení kódu s příslušnými daty. Dědičnost je vlastnost objektů dědit vlastnosti jejich předchůdců, je však možné tyto modifikovat a vytvářet nové. Mnohotvarost je vlastnost OOP provádět metody se stejným jménem různými způsoby, které závisí na objektu, jenž je volá. Dalším jevem úzce souvisejícím s OOP je událostmi řízené programování. Tento styl programování vychází ze skutečnosti, že v paměti je přítomný určitý počet objektů, z nichž každý je schopen samostatné existence a reaguje pouze na určitou událost.
Tyto principy jsou typické pro OOP a nemají nijak zvláště podstatnou souvislost s programováním pro Windows - naprosto stejná koncepce je uplatněna např. již v objektové nadstavbě Turbo Vision Pascalu v. 5.5 for Dos. Co tedy přimělo autory k implementaci programu do prostředí Ms-Windows? Pomineme-li nyní tak zřejmé skutečnosti, jako podstatně vyšší uživatelskou přívětivost, nebo velkou atraktivitu, všimneme si jedné z rozhodujících předností Windows - multitaskingu. Multitasking umožňuje současný běh většího počtu aplikací. Zde je však třeba uvést, že Windows ve verzi 3.1 obsahují nepreemptivní (non-preemptive) multitasking, což znamená, že se o multitasking v podstatě nejedná. Windows totiž nikdy sám nepřeruší běžící program, nýbrž spoléhá na to, že mu program sám vrátí řízení. Nicméně v případě dobře napsaných programů je stále situace lepší, než v Dosu, kde se o něčem jako je multitasking vůbec nedá hovořit (TSR programy a jejich problémy s 640 kB konvenční paměti..). Multitasking byl jedním z hlavních důvodů pro zvolení platformy Ms-Windows, protože výpočet vysokého počtu harmonických složek signálu je i na rychlém počítači poměrně zdlouhavý, a tedy velmi vhodný pro využití multitaskingu. Pro maximální uživatelský komfort, snadnost ovládání a přehlednost je určena norma rozhraní MDI (rozhraní vícenásobných dokumentů - multiple document interface). Programy řídící se touto normou umožňují uživateli souběžnou práci ve více otevřených oknech. Mezi takové programy patří např. Microsoft Excel, Word, Program Manager atd. Rozhraní je jednou z mnoha částí specifikace obecného uživatelského přístupu (common user acces), který tvoří základ uživatelského rozhraní Windows. Vzhledem k těmto výhodám bylo i MDI začleněno do aplikace Harmonická analýza.
Vlastní struktura programu je tedy dána výše nastíněnými fakty. Hlavním stavebním kamenem aplikace je potomek objektu TApplication, který má za úkol provést základní inicializace a deinicializace, zavedení a uvolnění knihoven z paměti a zobrazení hlavního okna programu. Hlavní okno je následník objektu TMDIWindow. Toto okno, někdy nazývané též rámcové okno, obsahuje neviditelné okno tzv. MDI klient, které vlastní dceřinná okna. Rámcové okno obsahuje menu, toolbar a status line - další prvky ze specifikace obecného uživatelského přístupu, které výrazně urychlují a zjednodušují práci s programem (toolbar a status line nejsou mimochodem také nic jiného, než objekty). Dále jsou v rámcovém okně implementovány procedury společné pro celý program (např. výpočet, nastavení počtu harmonických atd.). MDI klient zprostředkovává správu dceřinných oken - uspořádání do dlaždic, kaskády, ikon, překreslování atd. Všechna dceřinná okna (vstupní funkce, spektra atd.) jsou potomkem vlastního objektového typu TOkno, který je potomkem standardního objektu TWindow. Toto je klasický případ dědičnosti, jež je pro dané podmínky velmi vhodná: objekt TOkno definuje procedury a proměnné společné pro všechna dceřinná okna (procedury pro tisk, proměnné zoom...). Vlastní dceřinná okna pak modifikují pouze metody, specifické pro to které okno (překreslování, obsluha myši...). Velmi důležitý je objekt TObj, následník „praotce" všech objektů - objektu TObject. TObj obsahuje data potřebná většinou oken programu. Samostatnou část programu tvoří kontextově závislá nápověda, která akceptuje všechny konvence obecného uživatelského přístupu - počínaje nerolujícími nadpisy oddílů, hypertextovými a hypergrafickými odkazy konče.
Podívejme se nyní blíže na vybrané zajímavé části programu. K interaktivnímu zadávání vstupní funkce se používá vykreslování technikou pružných objektů - metoda používaná ve většině grafických editorů - průběžný výsledek uživatelovy aktivity se zobrazuje a maže pomocí logické funkce XOR (exclusive OR). Jedním z nástrojů k tomuto kreslení určených je i spojitá křivka. Pro interpolaci byla použita Fergusonova kubika. Tato kubika je řízena dvěma krajními body (P0, P1) a vektory v nich (P’0, P’1). Krajní body jsou významné pro polohu křivky - křivka jimi prochází, vektory určují vyklenutí křivky. Matematický zápis má tvar: P(t) = P0F1(t) + P1F2(t) + P’0F3(t) + P’1F4(t), kde F1-4 jsou kubické Hermitovské polynomy tvaru: F1(t) = 2t3 - 3t2 + 1; F2(t) = -2t3 + 3t2; F3(t) = t3 - 2t2 + t; F4(t) = t3 - t2; Pokud uživatel zadává určitý průběh, jsou průběžně počítány a překreslovány vždy dvě tyto kubiky. Další zajímavá část programu je dynamicky linkovaná knihovna (DLL) s filtrační funkcí. Filtrační funkce jsou v dostupné literatuře velmi málo popsány a řada programátorů o nich zřejmě ani neví. Jedná se o funkce zapojené do řetězce distribuce a zpracování zpráv. Tím je umožněno provedení určité akce dříve, než danou zprávu obdrží okno, pro které je určena. V programu Harmonická analýza je takovýto filtr (hook) konkrétně použit pro ošetření uvolnění pravého tlačítka mimo oblast toolbaru. V průběhu výpočtu je cyklicky volána procedura Multitaskuj, která má za úkol „udržet Windows při životě". Podle výše nastíněné funkce multitaskingu ve Windows by se totiž v případě nezavolání procedury Multitaskuj prováděl výpočet a ostatní úlohy by nedostávaly žádné zprávy. Laicky řečeno: po dobu výpočtu by Windows zdánlivě „zamrzl" a funkce by se obnovila až po ukončení výpočtu (ve skutečnosti Windows „žijí" a zprávy se shromažďují do fronty zpráv, pouze je pozastavena distribuce zpráv). Takové chování se však u programů pro Windows objevuje také, zejména u životně důležitých funkcí (např. ukládání souboru...), kdy není bezpečné ponechat uživateli „volnost". Tato situace se objevila i v našem programu - totiž u překreslování okna s harmonickými složkami. Takováto „nečinnost" Windows se standardně dává uživateli najevo změnou kurzoru myši na symbol přesýpacích hodin, což akceptuje i program Harmonická analýza.
Byl vytvořen program fungující v prostředí Microsoft Windows, což mu dodává atraktivní vzhled a uživatelskou přívětivost. Ovládání použitím myši je velmi snadné a rychle pochopitelné.
Co vlastně program umožňuje? V okénkovém prostředí je uživateli umožněno jednoduché snadno pochopitelné zadání vstupní, analyzované funkce. Po provedení výpočtu má uživatel k dispozici výsledky ve formě spekter, číselných výsledků, harmonických složek a funkce po harmonické syntéze. Dále je možné provést filtraci sinových, kosinových složek, lichých, sudých harmonických, nebo dvou pásem. S touto funkcí souvisí i zjištění šířky pásma, což umožňuje zjistit šířku pásma harmonických složek pro uživatelem zadanou amplitudu.
Uveďme několik příkladů nasazení našeho programu:
a) Signál o známém tvaru periody a určité frekvenci je třeba přenést tak, aby se jeho tvar jen minimálně změnil. Jakou minimální mezní frekvenci musí mít vedení? Po nakreslení tvaru periody a výpočtu z výsledků jednoduše poznáme, jak je signál bohatý na vysokofrekvenční harmonické složky. Čím vyšší je jejich amplituda, tím širší kmitočtové pásmo bude nutné bezchybně přenést. Zde lze použít nástroj šířka pásma. (Největší obsah vyšších harmonických má např. obdélníkový signál a průběhy obsahující četné skokové změny hodnoty.) Limitací hloubky analýzy pouze pro několik prvních harmonických a následném vykreslení syntézy těchto složek uvidíme přibližně do jaké míry se signál změní.
b) Přes digitálně-analogový převodník jsme sejmuli vzorek zvukového signálu. Pomocí našeho programu zjistíme snadno jeho frekvenci, což lze efektivně využít např. pro ladění hudebních nástrojů. Přesnost změření frekvence tónu je mimořádně vysoká. Při vzorkovací frekvenci 44 kHz a délce vzorku 5 sekund se nám podařilo změřit frekvenci 500 Hz s přesností 0.2 Hz. Kmitočet signálu složitějšího tvaru, obsahující vyšší harmonické (např. zvuk kytary) se podařilo změřit s přesností 0.067 Hz, zde jsme vyhledávali druhou harmonickou.