VYSOKÁ ŠKOLA POLYTECHNICKÁ JIHLAVA Katedra elektrotechniky a informatiky
S i g n á l y p ro n e u ro f y z i o l o g i c k á m ě ř e n í sluchu Bakalářská práce
Autor: Pavel Kuttelwascher Vedoucí práce: Ing. Zbyněk Bureš, Ph.D. Jihlava 2011
Anotace Tato bakalářská práce se zabývá tématem měření časospektrálních receptivních polí neuronů. Nejprve popisuje základy teorie tohoto měření sluchu akustickými signály, způsob generování a vztahy pro výpočet měřicích signálů, a také samotnou analýzu naměřených hodnot. Podrobněji se pak zabývá vlastní implementací této problematiky, tj. vytvořením generátoru měřicích signálů a analyzačního nástroje v programovacím jazyce C++, a podrobným popisem funkcí a metod pouţitých v aplikaci. Jsou zde rozebrány různé moţnosti implementace a odůvodnění jejich pouţití. Nakonec je tato implementace testována a porovnána s implementací v prostředí MATLAB®.
Klíčová slova generátor, analýza, signál, spektrotemporální obálka, C++
Annotation This bachelor thesis deals with the subject of measuring spectrotemporal receptive fields of neurons. At first it describes the basics of the theory of this hearing measured by acoustic signals, next the way of generating and formulas for measuring signals calculation, and also the analysis of measured values. The thesis deals with the main implementation of this issue in more detail - it means computing a generator of measuring signals and an analyzer tool using the C++ programming language. Further functions used in the application are described here. Various ways of implementation and their justification are analyzed in this thesis. Finally this implementation is tested and compared with the existing implementation in MATLAB®.
Keywords generator, analysis, signal, spectrotemporal envelope, C++
Na tomto místě bych chtěl velmi poděkovat mému vedoucímu práce panu Ing. Zbyňku Burešovi, Ph.D. za odborné vedení mé bakalářské práce, za cenné rady a hlavně ochotu a čas, který si vyhradil při konzultování této práce.
Prohlašuji, ţe předloţená bakalářská práce je původní a zpracoval jsem ji samostatně. Prohlašuji, ţe citace pouţitých pramenů je úplná, ţe jsem v práci neporušil autorská práva (ve smyslu zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů, v platném znění, dále téţ „AZ“). Souhlasím s umístěním bakalářské práce v knihovně VŠPJ a s jejím uţitím k výuce nebo k vlastní vnitřní potřebě VŠPJ . Byl jsem seznámen s tím, ţe na mou bakalářskou práci se plně vztahuje AZ, zejména § 60 (školní dílo). Beru na vědomí, ţe VŠPJ má právo na uzavření licenční smlouvy o uţití mé bakalářské práce a prohlašuji, ţe s o u h l a s í m s případným uţitím mé bakalářské práce (prodej, zapůjčení apod.). Jsem si vědom toho, ţe uţít své bakalářské práce či poskytnout licenci k jejímu vyuţití mohu jen se souhlasem VŠPJ, která má právo ode mne poţadovat přiměřený příspěvek na úhradu nákladů, vynaloţených vysokou školou na vytvoření díla (aţ do jejich skutečné výše), z výdělku dosaţeného v souvislosti s uţitím díla či poskytnutím licence. V Jihlavě dne ..................................................... Podpis
Obsah 1
2
MOTIVACE A CÍLE PRÁCE .......................................................................................... 9 1.1
VYTYČENÍ CÍLŮ............................................................................................................ 9
1.2
SOUČASNÝ STAV PROBLEMATIKY................................................................................ 9
1.3
POŢADAVKY NA APLIKACI ......................................................................................... 10
MĚŘENÍ ČASOSPEKTRÁLNÍCH RECEPTIVNÍCH POLÍ NEURONŮ ................ 11 2.1
MĚŘENÍ VLASTNOSTÍ NEURONŮ ................................................................................ 11
2.2
MĚŘICÍ SIGNÁLY ........................................................................................................ 12
2.2.1
Signál DMR (Dynamic Moving Ripple) ............................................................................. 15
2.2.2
Signál RN (Ripple Noise) ................................................................................................... 17
2.2.3
Výsledný průběh ................................................................................................................. 20
2.3 3
4
VYHODNOCENÍ NAMĚŘENÝCH HODNOT .................................................................... 20
IMPLEMENTACE .......................................................................................................... 22 3.1
GLOBÁLNÍ PROMĚNNÉ ............................................................................................... 22
3.2
GENERÁTOR ............................................................................................................... 22
3.2.1
Příprava parametrů ........................................................................................................... 22
3.2.2
Časově variabilní parametry Ω a Fm ................................................................................ 23
3.2.3
Generování signálu DMR (RN) .......................................................................................... 27
3.3
ANALYZÁTOR ............................................................................................................ 28
3.4
UŢIVATELSKÉ ROZHRANÍ ........................................................................................... 30
3.4.1
Hlavní formulář ................................................................................................................. 30
3.4.2
Formulář pro zadání nových parametrů ............................................................................ 32
3.4.3
Nástroj pro vykreslení grafického výstupu analyzátoru ..................................................... 33
TESTOVÁNÍ .................................................................................................................... 35 4.1
TESTOVÁNÍ STABILITY ............................................................................................... 35
4.2
TESTOVÁNÍ RYCHLOSTI ............................................................................................. 36
5
ZÁVĚR .............................................................................................................................. 37
6
PŘÍLOHY ......................................................................................................................... 45 FORMÁTY VSTUPNÍCH A VÝSTUPNÍCH SOUBORŮ.................................................................... 46 Datový soubor s parametry: *.par ................................................................................................... 46 Soubor vzorků měřícího signálu: *.dat ............................................................................................ 47 Soubor naměřených neuronových odezev *.txt................................................................................. 48
Výstupní datový soubor s výsledky analýzy ...................................................................................... 48
POPIS MODULŮ A FUNKCÍ TVOŘÍCÍ APLIKACI ......................................................................... 49
Úvod Práce se zabývá návrhem a implementací aplikace, která umí, podle zadaných vstupních parametrů, generovat zvukové signály pro měření sluchu, dále je také schopna analyzovat naměřená data a zpracovat je do datového a grafického výstupu. Vstupem generátoru je buď soubor vstupních parametrů, nebo nastavení přímo v aplikaci pomocí formuláře. Výstupem generátoru je nejen samotný zvukový soubor, ale i datový soubor s uloţenými vstupními parametry pro moţnost pozdější opětovné rekonstrukce signálu. Čerpal jsem převáţně z článku: ESCABI, Monty A.; SCHREINER, Christoph E. Nonlinear Spectrotemporal Sound Analysis by Neurons in the Auditory Mindbrain. The Journal of Neuroscience. 15. 5. 2002, 22, s. 4114-4131 [7]. Ten popisuje způsob a metodiku generování a zpracování signálu. Práce se věnuje vytvoření rychlé a přenositelné aplikace (nepotřebuje nainstalované ţádné vývojové prostředí) v jazyce C++, která je spustitelná na jakémkoli systému Windows. Moje práce se inspiruje jiţ existujícími řešeními a snaţí se odstranit problémy a nevýhody, které obsahují.
8
1
Motivace a cíle práce
1.1 Vytyčení cílů Cílem bakalářské práce je seznámit se s problematikou měření časospektrálních receptivních polí neuronů (spectrotemporal receptive fields - STRF), a vytvoření aplikace, která uţivateli umoţní zadat vstupní parametry různou formou (jak z vnějšího souboru, tak i formulářem), a vygenerovat ţádaný signál. Výstupem bude zvukový soubor s měřicím signálem a datový soubor s uloţenými parametry pro další pouţití, nebo snadnou rekonstrukci signálu. Další poţadavek je, ţe aplikace musí být schopna zpracovat naměřené odezvy sluchových neuronů, porovnat je s měřicím signálem a následně graficky vyhodnotit. Výstup vyhodnocovací části je grafické znázornění a datový soubor.
1.2 Současný stav problematiky V současnosti existují řešení v prostředí MATLAB®. Vedoucí této práce vytvořil generátor měřicích signálů v prostředí MATLAB®. Narazil však na několik problémů, zejména na rychlost generování, a problémy s pamětí při generování dlouhých signálů. Tyto problémy plynou z faktu, ţe MATLAB® je interpretovaný programovací jazyk, coţ zpomaluje jeho chod, a navíc nemá příliš dokonalou správu paměti (pouţívá pouze datový typ double). Generování dlouhých signálů bylo nutno rozdělit na menší úseky a celý proces generování spektrotemporální obálky trvá velice dlouho. Dalším existujícím řešením je aplikace STRFPak (Spectrotemporal Receptive Field Package) [13], která představuje nástroj pro analýzu naměřených odpovědí implementovaný v prostředí MATLAB®. Nevýhodou této implementace je opět rychlost a problém s pamětí (nezvládne analyzovat signály delší neţ cca 1 s). Její výhodou je ale to, ţe umí analyzovat jakékoli zvukové signály, protoţe pro rekonstrukci spektrotemporální obálky vyuţívá fourierovy transformace nebo bank filtrů. Z důvodu omezeného frekvenčního a/nebo časového
rozlišení
transformace však není
rekonstrukce touto metodou přesná a rekonstruovaná spektrotemporální obálka není stejná jako ta, ze které se měřicí signál generuje. 9
Mnou vytvářená aplikace má za cíl zapouzdřit obě operace (generování a analýzu), a také odstranit nevýhody, které předchozí řešení obsahovaly. Nejdůleţitější je podstatně zrychlit obě hlavní funkce – generování a analýzu, a také vylepšit správu paměti aplikace tak, aby mohla být pouţitelná pro delší signály. Aplikace pracuje s neceločíselnými vzorkovacími kmitočty. Důvodem je nutnost spolupráce s hardwarovým systémem TDT (Tucker Davis Technologies, Alachua, Florida, USA). Ten pouţívá kmitočty f=48 828,125 Hz a f=97 656,25 Hz.
1.3 Požadavky na aplikaci Aplikace musí být přeloţena do podoby „*.exe“ (Execute) souboru pro operační systémy Windows. Díky tomu jí lze libovolně přenášet a pouţívat bez nutnosti instalace jakýchkoli dalších prostředí. Musí obsahovat grafické uţivatelské rozhraní umoţňující přehlednou práci. Hlavním poţadavkem je klást důraz na rychlost pouţitých algoritmů u výpočetně náročných funkcí. Tím by se měly odstranit nedostatky předchozích řešení. Program by měl být schopen spolehlivě generovat signály délky alespoň 20 minut. Je potřeba, aby generátor ukládal do výstupních souborů parametry potřebné pro přesnou rekonstrukci spektrotemporální obálky. Aplikace bude tyto uloţené informace o spektrotemporální obálce pouţívat při analýze. To umoţní přesnější analýzu naměřených odezev neuronů, nevýhodou ale je, ţe bude moţné analyzovat pouze signály touto aplikací vygenerované.
10
2
Měření časospektrálních receptivních polí neuronů
Tato kapitola popisuje teorii způsobu a techniky vytváření měřicích signálů a analýzu naměřených hodnot. Obsahuje vztahy pro výpočet signálů a jejich parametrů, a také postup analýzy.
2.1 Měření vlastností neuronů Bylo zjištěno, ţe mozek obratlovců nezpracovává zvukový signál jako časový průběh, ale nejprve jej převede z časové do kmitočtové oblasti. Dále pak vyhodnocuje spektrum podnětu a změny tohoto spektra v čase. Z hlediska sluchového systému je tudíţ vhodným znázorněním vlastností zvuku spektrogram - průběh amplitudového spektra v čase. [2] Sluchové neurony, v případě čistých tónů, reagují na určité kmitočtové pásmo. Pásmo se sice u jednotlivých neuronů liší, ale neurony se chovají v principu stejným způsobem (jako pásmová propust). Avšak sluchové neurony, hlavně v centrálních částech mozku, nejvíce reagují na zvukové podněty, které nesou určitou informaci. To jsou v případě zvířat např. přirozené vokalizace (pípání, štěkání atd.) nebo zvuky predátorů, v případě lidí pak řeč. Tyto zvukové podněty ovšem nejsou (ve většině případů) jednoduché tóny, ale zvukové signály se sloţitým spektrem, které se navíc v čase proměňuje. Neurony tedy reagují na určité časové průběhy spektra. [2] Z toho vyplývá, ţe není přesné charakterizovat sluchové neurony pouze na základě jejich frekvenčních přenosových vlastností, ale také je potřeba zjistit chování neuronů při změnách spektra zvukového signálu v čase. Spektrotemporální receptivní pole (STRF) je charakteristika neuronu, která uvaţuje jak frekvenční, tak i časový rozměr. STRF vyjadřuje, jaké kmitočty a v jakém časovém sledu se musí v podnětu vyskytovat, aby neuron zareagoval. Příkladně lze ze STRF vyčíst, ţe pokud bude podnět obsahovat kmitočty mezi 500 a 1000 Hz, za cca 12 ms lze s velkou pravděpodobností očekávat odpověď neuronu. Naopak lze např. vyčíst, ţe pokud bude podnět obsahovat kmitočty v okolí 1000 Hz aţ 2000 Hz, odpovědi neuronu budou za cca 10 ms potlačeny (inhibovány). [8] Ilustraci charakteristiky neuronu (STRF) můţete vidět na obrázku 1. 11
Pokud budeme zvuk popisovat jeho spektrogramem, STRF neuronu lze chápat jako takový úsek spektrogramu, který vyvolá odpověď neuronu. Při výpočtu STRF potom skutečně postupujeme tak, ţe vezmeme jednotlivé úseky spektrogramu, které předcházejí kaţdou odezvu neuronu, a tyto úseky zprůměrujeme. Tato práce se věnuje měření sluchových neuronů metodou STRF. STRF je tedy funkcí dvou proměnných – frekvence a času před reakcí neuronu. [8]
Obrázek 1 - Ukázka charakteristiky STRF. Na vodorovné ose je znázorněn čas v milisekundách (delay - zpoždění) před neuronovou odezvou, na svislé ose jsou vyneseny kmitočty spektra (octave frequency - frekvence oktávy). Červená oblast je kmitočtová oblast excitace (excitation - vzruch) neuronu, modrá oblast znázorňuje inhibované (inhibition - potlačení) kmitočty. [7]
2.2 Měřicí signály Zvukové měřicí signály pro metodu STRF jsou právě takové signály, které mají spektrogram odpovídajících vlastností. Signály mají omezené frekvenční pásmo dané frekvencemi fmin a fmax. Podstatné je, ţe spektrální obálka takového signálu má sinusový průběh (v měřítku oktáv), který v čase mění svůj fázový posuv a počet period na oktávu. Fázový posuv a počet period na oktávu se mění náhodně. Tím, ţe se tyto parametry v čase náhodně mění, se docílí poţadovaných spektrálních změn signálu
12
v čase, které způsobují měřené excitace neuronů. Ukázka okamţité spektrální obálky měřicího signálu je na obrázku 2.
Obrázek 2 - Ukázka spektrální obálky v okamžitém časovém okamžiku. Této obálce se v čase mění fázový posuv a počet period na oktávu.
Generování měřicích signálů s poţadovanou spektrotemporální obálkou je moţné několika způsoby. Jedna z moţností je získání náhodného bílého šumu, který se následně vyfiltruje na poţadované frekvenční pásmo a dále poţadovanou obálkou. Tato metoda má ale několik problémů, zejména to, ţe okamţité spektrální vlastnosti šumu nejsou přesně známy, signál by tedy nemusel odpovídat poţadavkům. Grafické znázornění této metody můţete vidět na obrázku 3.
13
Obrázek 3 - Znázornění metody získání měřicího signálu z bílého šumu. Vyšrafovaná oblast odpovídá požadovanému frekvenčnímu rozsahu signálu, ostatní kmitočty se vyfiltrují. Spektrum signálu je dále modulováno sinusovou spektrální obálkou.
Další moţný způsob získání měřicího signálu spočívá ve vygenerování nosných sinusových průběhů v poţadovaném frekvenčním pásmu a jejich modulování pomocí spektrotemporální obálky, tím se získá samotný měřicí signál. Celá práce se zabývá generováním signálů právě touto metodou. Metoda je znázorněna na obrázku 4.
Obrázek 4 - Znázornění metody získání spektrotemporální obálky pomocí nosných harmonických, ty jsou znázorněny jako f1 až fn.
14
2.2.1 Signál DMR (Dynamic Moving Ripple) Okamţité amplitudové spektrum tohoto zvukového měřicího signálu má sinusovou obálku, která se v čase zahušťuje a navíc fázově posouvá. Tyto změny jsou dané náhodně. Tím vznikne typický spektrogram znázorněný na obrázku 5. Tento signál by měl připomínat přirozené vokalizace jako např. mňoukání, štěkání apod. (viz obr. 7).
Obrázek 5 - Ukázka spektrální obálky signálu DMR.
Signál DMR získaný touto metodou je daný součtem nosných frekvencí, jejichţ amplituda je modulována v čase. Modulace je navíc v čase proměnná a je různá pro kaţdou
nosnou
tak,
aby
výsledný
signál
měl
poţadovaný
spektrogram.
Spektrotemporální obálka signálu DMR se získá ze vztahu:
(
)
[
( )
( )]
Jedná se tedy o funkci dvou proměnných. Kde: t je časový okamţik signálu a Xk reprezentuje relativní frekvenci nosné v poměru k nejniţší frekvenci na oktávu. M znamená hloubku modulace, definovanou hodnotou v decibelech. Původní řešení podle článku bylo pouţít hodnoty hloubky modulace 30 nebo 45 dB. Hodnota hloubky modulace je pro celou délku signálu konstantní. Parametr Ω(t) uvádí hustotu zvlnění spektrální obálky v daném časovém okamţiku (anglicky ripple density). Ten je velice důleţitý pro samotné měření. Zajišťuje totiţ míru náhodnosti obsahu určitých 15
kombinací zvuků v signálu, které potom způsobují vzruchy sluchových neuronů. Tento časově proměnný parametr se pohybuje v rozsahu hodnot <0, 4> na oktávu a mění se s frekvencí f=3 Hz. Poměrnou frekvenci Xk získáme jako poměr dané frekvence k nejniţší frekvenci tímto vztahem:
( )
Kde fk je hodnota aktuální frekvence a f1 je nejniţší pouţitý kmitočet.Φ(t) určuje okamţitou fázi spektrální obálky a spočteme ji takto:
( )
∫
( )
Fm je, podobně jako parametr Ω(t) časově variabilní. Tento parametr reprezentuje fázový posuv spektrální obálky. Jeho hodnoty se pohybují v rozmezí <-350, 350> a rychlost změny je dána frekvencí f=1,5 Hz. Oba tyto parametry jsou vlastně náhodné šumy s výše popsanými vlastnostmi se spektry znázorněnými na obrázku 6.
Obrázek 6 - Průběh spektra parametrů Fm a Ω. Mezní frekvence Fzlomu je pro Ω 3 Hz a pro Fm 1,5 Hz.
16
Vzorkovací kmitočty parametrů Ω(t) a Fm jsou dány podle Shanon-Kotělnikovova teorému minimálně dvojnásobkem nejvyššího kmitočtu jejich změny tj. pro Ω(t) 6 Hz, a pro Fm hodnotou 3 Hz. [7]
Obrázek 7 - Ukázka spektra zvuku přirozené vokalizace koček. [7] Na vodorovné ose je čas (time), na svislé jsou oktávy okolo frekvence 1 000 Hz (octaves above 1 000 Hz).
2.2.2 Signál RN (Ripple Noise) Tento druh signálu má připomínat různé přírodní zvuky, které nesou nějaký informační obsah jako je například bublání potůčku apod. (obr. 9). Spektrální obálka signálu RN se získá lineární superpozicí několika nezávislých spektrálních obálek signálu DMR. Ukázka spektrogramu signálu RN je na obrázku 8.
17
Obrázek 8 - Ukázka spektra signálu RN
Signál RN určíme tímto vztahem:
̅
(
)
(
∑
)
je výsledná obálka, jejíţ rozměry jsou čas t a poměrné kmitočty Xk. L nám udává počet sčítaných obálek a
reprezentuje tyto jednotlivé sčítané obálky.
Vlivem sčítání jednotlivých spektrálních obálek má ale amplituda obálky
̅
gaussovské rozdělení. To by však mohlo způsobit neţádoucí jevy. Proto je třeba ještě tuto obálku upravit tak, aby její amplitudy měly rovnoměrné rozloţení, k tomu vyuţijeme funkci: ( kde
)
[ ̅
(
)]
je poţadovaná spektrotemporální obálka s rovnoměrným rozloţením amplitud.
18
Funkce f(x) je dána vztahem:
( )
(
)
Nachází se zde opět hloubka modulace M a navíc parametr
určený vztahem:
√
Funkce erf() zvaná Gaussovská chybová funkce (nebo pravděpodobnostní integrál) převede vstupní hodnoty to rovnoměrného rozdělení v intervalu <-1,1>. Funkce je definovaná následovně [7]:
( )
√
∫
Obrázek 9 - Ukázka spektra zvuku bublání potoka (Babbling brook). Spektrum signálu RN má připomínat spektrum takovýchto přírodních zvuků. [7] Na vodorovné ose je vynesen čas (time), na svislé ose kmitočty oktáv okolo 1 000 Hz (Octaves above 1 000 Hz).
19
2.2.3 Výsledný průběh Pomocí získaných spektrálních obálek DMR (nebo RN) je potřeba namodulovat nosné sinusové průběhy, a jejich následným součtem získat výsledný měřicí signál. Konečný signál značíme písmenem s a určíme jej tímto vztahem:
( )
(
∑
)
[
( )
]
kde L je počet nosných harmonických kmitočtů, Xk jsou poměrné frekvence k nejniţší pouţité frekvenci daného kmitočtového pásma, fk jsou kmitočty jednotlivých nosných. Parametr Φk je náhodně zvolená fáze v rozsahu <0-,2π>, která dává signálu s(t) charakter šumu. Slin je RN, nebo DMR obálka, převedená z logaritmické stupnice do lineární. Lineární obálka se pohybuje v mezích 10-M/20 a 1. Výpočet udává tento vztah:
(
)
(
)
⁄
Sdb je substituce za RN, nebo DMR. M, jak bylo dříve popsáno, znamená hloubku modulace v decibelech. [7]
2.3 Vyhodnocení naměřených hodnot Charakteristika neuronu STRF (spectrotemporal receptive field) se získá průměrováním úseků spektrotemporální obálky v časech těsně před kaţdou naměřenou odezvou neuronu. Grafické znázornění této metody je na obrázku 10. Pro vyhodnocení odezev neuronů na signál je proto potřeba zpětně získat spektrotemporální obálku měřicího signálu a časy neuronových odpovědí. Implementovaná aplikace vyuţívá toho, ţe průběh spektrotemporální obálky je ukládán do zvláštního souboru při generování měřicího signálu, není tedy nutné obálku rekonstruovat ze signálu, jako to provádí např. software STRFPak [12]. Charakteristika STRF, pro N neuronových odezev, se získá vztahem:
20
(
)
(
)
∑
(
)
kde τ znamená uvaţované zpoţdění v milisekundách před naměřenou odezvou neuronu, Xk jsou poměrné nosné kmitočty, T reprezentuje délku měření neuronu signálem v sekundách, pokud se při měření pouští signál o celé délce, rovná se délce měřicího signálu. Konstanta σs2 se liší podle typu spektrotemporální obálky signálu tak, ţe pro obálku DMR platí: √
√
Pro obálku typu RN se získá takto:
. Sdb jsou jednotlivé hodnoty spektrotemporální obálky měřicího signálu, je to
substituce za DMR, nebo RN, podle konkrétního typu pouţitého signálu. Parametr tn udává okamţik naměřené neuronové odezvy. [7]
Obrázek 10 - Znázornění principu analýzy naměřených neuronových odezev. Jednotlivá barevná okna jsou spektrální obálky úseků před naměřenou odezvou neuronu. Jejich součtem se získá charakteristika STRF. [7] Time znamená čas, action potentials jsou akční potenciály neuronu, inhibition je inhibice (potlačení), a excitation je vzruch. Octave frequency jsou nosné harmonické na oktávu.
21
3
Implementace
Tato kapitola se zabývá samotnou implementací aplikace způsobem zvoleným z moţných řešení. Budou zde rozebrána a odůvodněna provedení jednotlivých funkcí. Celá aplikace je vytvořena v programovacím jazyce C++, konkrétně v prostředí C++ Builder od společnosti Borland. C++ Builder jsem pouţil proto, ţe obsahují knihovny VCL (Visual Component Library), které slouţí k vytvoření grafického uţivatelského rozhraní, coţ je dalším poţadavkem práce.
3.1 Globální proměnné Všechny parametry včetně náhodně generovaných vzorků Ω a Fm jsou uloţeny jako globální proměnné. Jsou tedy společné pro generátor i analyzační nástroj. Díky tomu je přístup k nim a manipulace snazší. Například pokud vygenerujeme signál a hned poté jej chceme analyzovat, nemusí se znovu načítat datový soubor „*.par“, protoţe tytéţ hodnoty jsou uloţeny právě v těchto globálních proměnných. Pole pro vzorky Ω a Fm jsou realizována dynamicky.
3.2 Generátor Generátor je realizován samostatnou funkcí, která se spouští tlačítkem Generate v hlavním formuláři, poloţkou v menu Generate a nebo klávesovou zkratkou Ctrl+G. Zajišťuje samotné generování měřicího zvukového signálu. 3.2.1 Příprava parametrů Po spuštění této funkce se nejprve otevře dialogové okno (save dialog), kde si uţivatel zadá název a umístění výstupních souborů. Následně pokračuje inicializace všech pomocných proměnných důleţitých pro chod samotného podprogramu a pokračuje proces generování.
22
3.2.2 Časově variabilní parametry Ω a Fm Řešení podle článku: ESCABI, Monty A.; SCHREINER, Christoph E. Nonlinear Spectrotemporal Sound Analysis by Neurons in the Auditory Mindbrain. The Journa lof Neuroscience. 15. 5. 2002, 22, s. 4114-4131 [7] v prostředí MATLAB® získá tyto šumové signály tak, ţe vygeneruje gaussovsky rozdělené náhodné vzorky (funkcí randn) s vzorkovací frekvencí 6 Hz pro Ω a 3 Hz pro Fm. Následně je nutné signály převzorkovat na vzorkovací frekvenci výstupního signálu. Prostředí MATLAB® pro účel převzorkování pouţívá kubickou interpolaci vyuţívající techniku spline. Dalším krokem je převést signál z gaussovského do rovnoměrného rozloţení hodnot, k tomu se pouţívá funkce erf():
( )
√
∫
Ta převede rozsah hodnot do intervalu <-1,1>, tento rozsah se následně přepočítá na poţadovaný konečný rozsah <0, 4> pro Ω a <-350, 350> pro Fm. Realizace časových průběhů funkcí Ω a Fm v jazyce C++ vyţadovala odlišný přístup neţ v prostředí MATLAB®. V jazyce C++ totiţ standardně není k dispozici funkce převzorkování s kubickou interpolací. Bylo tedy nutné vyvinout náhradní řešení, které vykazuje co nejpodobnější výsledky jako řešení v MATLAB®. Další odlišnost od implementace v MATLABu spočívá v samotném generování náhodných čísel. Funkce rand(), v jazyce C++, generuje náhodná čísla v rovnoměrném rozdělení (v rozsahu 0 aţ 32767), nikoli gaussovském. Zvolený postup řešení tedy je vygenerování náhodných rovnoměrně rozdělených čísel, jejich převzorkování a interpolace, a nakonec (podle potřeby) úprava na poţadovaný rozsah hodnot. Není zde potřeba pouţívat funkci erf() na převod do rovnoměrného rozdělení. Rozsah hodnot při generování je upraven funkcí modulo na poţadované intervaly. Funkce rand() (C++) navíc generuje tzv. pseudonáhodná čísla, to znamená, ţe hodnoty sice vypadají náhodně, ale jsou to vţdy stejné posloupnosti čísel. Tento problém byl odstraněn tím, ţe se zinicializovala počáteční hodnota tak, aby tato řada pseudonáhodných čísel začínala pokaţdé na jiném
23
místě. Toho jsem docílil funkcí srand(Time(NULL)), která podle aktuálního systémového času nastaví počáteční hodnotu generátoru čísel. Jedním z řešení, jak získat převzorkovaný interpolovaný signál, bylo doplnit původní posloupnosti Ω a Fm nulami mezi vzorky tak, aby výsledný počet vzorků odpovídal poţadované cílové vzorkovací frekvenci (viz obr. 11), a aplikovat vhodný číslicový filtr, který by odstranil neţádoucí vyšší harmonické. Byly testovány IIR (Infinite Impulse Response) filtry typu Butterworth různých řádů, navrţené pomocí prostředí MATLAB®. Výsledky však byly nedostatečné.
Obrázek 11 - Převzorkovaný náhodný signál Ω (Fm) před intepolací.
24
Výsledné řešení vychází z myšlenky filtrace lineárně interpolovaného signálu. Původní vzorky se neprokládají nulami, ale v mezilehlých vzorcích se aplikuje lineární interpolace (viz obr 12). Proloţení vzorků přímkami vede k zásadnímu zmenšení počtu neţádoucích vyšších harmonických. Pak je jiţ reálné navrhnout vyhovující číslicový filtr, který průběh funkce vyhladí. V konečné implementaci je pouţit Butterworthův filtr IIR 2. řádu. Tvar interpolovaného signálu Ω a Fm je téměř stejný jako signál vygenerovaný v prostředí MATLAB®, porovnání těchto signálů je na obrázku 14 Vlastnosti výsledné spektrotemporální obálky závisejí především na spektru náhodných signálů Ω a Fm, nikoli na jejich časovém průběhu. Spektrum signálu vytvořeného naší
Obrázek 12 - Signál Ω (Fm) po lineární interpolaci.
metodou vyšlo dokonce lépe, neţ výsledek z MATLABu®,viz obrázek 15. Naše řešení má strmější útlum neţ pouţití kubické interpolace v MATLABu®. Jen v důsledku filtrování se občas stalo, ţe hodnoty přesáhly poţadované meze a to u Ω rozsah <0,4> a u Fm interval <-350,350>. Bylo tedy ještě potřeba rozsah upravit do poţadovaných mezí.
25
Vzhledem k tomu, ţe oba parametry Fm a Ω mají jiné vzorkovací frekvence, a navíc jsou v aplikaci pouţity dvě výsledné vzorkovací frekvence signálu, je nutné navrhnout pro kaţdý signál Fm a Ω a pro kaţdou výslednou vzorkovací frekvenci samostatné filtry. Tyto filtry pouţívají stejný algoritmus, ale mají rozdílné koeficienty. Aplikace tedy pouţívá čtyři různé filtry.
Obrázek 14 – Signál Ω (Fm) po lineární interpolaci a následné filtraci. Na tomto obrázku je porovnání tvarů signálů interpolovaných v MATLABu a řešení v C++. Zeleně je znázorněn výsledek řešení v MATLAB, a modře řešení v C++.
Obrázek 13 - Porovnání spekter obou řešení. Řešení v MATLABu je znázorněno zelenou barvou, řešení v C++ modrou. Zde je patrné, že námi navržené řešení má strmější útlum.
26
3.2.3 Generování signálu DMR (RN) Vzhledem k tomu, ţe tento signál je realizován dvourozměrným polem, pro dlouhé signály a pro větší počet nosných frekvencí velikost tohoto pole narůstala do obrovských rozměrů. Takto velké pole nebylo moţné alokovat v paměti a aplikace se stala nestabilní. Řešení tohoto problému bylo jednou z nejdůleţitějších částí práce. Jedno z moţných řešení je ukládat vzorky do pomocného souboru (technika se pouţívá například u vnějšího řazení prvků). Tato moţnost se neosvědčila, protoţe rychlost generátoru rapidně klesla. Navíc počet vzorků, které se mohly uloţit do souboru, byl omezen oborem hodnot ukazatele v souboru (není moţné adresovat více neţ počet Bytů odpovídající rozsahu typu unsigned long integer), coţ znamená značné omezení délky generovaného signálu. Další zpomalení plynulo z toho, ţe v případě výpočtu většího mnoţství obálek (signál RN) by bylo nutné vzorky ze souborů zpětně načítat a přepočítávat. V případě velkého mnoţství vzorků by tato operace zásadně sníţila rychlost celého procesu generování. Konečným řešením tohoto problému je rozdělit výpočet signálu DMR (RN) do menších bloků. Zvolil jsem blok signálu o délce 8 s. Představuje totiţ nejkratší moţnou délku, u které vychází celočíselný počet časových vzorků při pouţité neceločíselné vzorkovací frekvenci. Pole pro uloţení vzorků DMR (RN), i pro vyšší počet harmonických, se nyní bezpečně vejde do paměti. Rychlost čtení, hledání a zapisování dat do paměti je mnohonásobně rychlejší, neţ práce se soubory. Generování probíhá tedy tak, ţe se pro kaţdých 8 sekund signálu vypočtou postupně všechny obálky. Kaţdá obálka má však své parametry Fm a Ω, proto je potřeba provést pokaţdé výpočet
těchto
spojitých parametrů výše popsaným
způsobem
tj.
převzorkováním náhodných vzorků a jejich interpolací pro kaţdou obálku samostatně. Poté se vypočítají samotné vzorky signálu DMR (RN). V případě většího počtu obálek se ještě všechny vzorky sečtou a převedou do rovnoměrného rozloţení viz Kapitola 2.2.2.
27
Následně se pomocí vygenerované spektrotemporální obálky DMR nebo RN modulují jednotlivé harmonické nosné a jejich sečtením se vytvoří poţadovaný měřicí zvukový signál. Protoţe se obálka generuje po blocích, vţdy kaţdý další úsek výsledného zvukového signálu se připojí k jiţ hotovému výstupnímu signálu. Takto vygenerovaný signál se uloţí do souboru „*.dat“, a parametry pro moţnost opětovné rekonstrukce do „*.par“. Poté se uvolní alokovaná paměť pomocných proměnných a ukončí se proces generátoru. Struktura těchto souborů je popsána v příloze A.
3.3 Analyzátor Pro proces analýzy naměřených dat je nejdůleţitější přesné získání spektrotemporální obálky měřicího signálu. Řešení pouţité v balíku STRFPak pouţívá jako vstup „*.wav“ soubor s měřicím signálem, z nějţ je short-time Fourierovou transformací zpětně rekonstruována spektrotemporální obálka. Toto řešení však není zcela přesné, z důvodu neurčitosti v časovém a frekvenčním rozlišení transformace. Výhodou ovšem je, ţe aplikace STRFPak umí rekonstruovat spektrotemporální obálku jakéhokoli zvukového signálu. V našem řešení jsme šli jinou cestou. Při generování signálu se uloţí všechny potřebné parametry včetně náhodných vzorků Ω a Fm do binárního souboru „*.par“. Z něj lze spektrotemporální obálku znovu vypočítat tak, aby měla naprosto stejný průběh, jako obálka měřicího signálu. Toto řešení má ale nevýhodu v tom, ţe neumí analyzovat jiné zvukové signály, neţ ty, které byly vygenerované samotnou aplikací. Vstupy analyzátoru tedy jsou:
soubor s parametry spektrotemporální obálky „*.par“,
textový soubor naměřených neuronových odezev „*.txt“
délku uvaţovaného úseku spektrotemporální obálky před naměřenou odezvou.
28
Zpoţdění lze nastavit v panelu generátoru textovým polem v rozmezí hodnot od 1 ms do 1 000 ms. Textový soubor obsahuje časy jednotlivých neuronových odezev v milisekundách. Odezvy jsou zapsány ve vědecké notaci a kaţdá hodnota leţí na samostatném řádku. Popis formátu tohoto souboru je v příloze: Soubor naměřených neuronových odezev *.txt. Proces analýzy se spouští tlačítkem Analyze v bloku analyzátoru hlavního formuláře, poloţkou v menu Analyze|Analyze a nebo klávesovou zkratkou Ctrl+A. Proces analýzy vychází z výše popsaného principu. Nejprve se zinicializují pomocné proměnné, načtou se hodnoty časů změřených odezev a spočítá se jejich počet. Vytvoří se datová struktura pro jednotlivé rekonstruované části obálky a struktura pro uloţení výsledku analýzy (pole STRF). Velikosti těchto „oken“ jsou určeny vzorkovací frekvencí a délkou uvaţovaného úseku obálky. Protoţe se jedná o hodnotu maximálně 1 000 ms, je počet vzorků těchto bloků zaokrouhlen, respektive se ořízne desetinná část. Například pro vzorkovací frekvenci f=48 828,125 Hz a délku uvaţovaného úseku τ=1 000 ms je počet časových vzorků roven počtu 48 828. Následně pokračuje cyklus výpočtu spektrotemporální obálky tak, ţe se pro kaţdý čas odezvy neuronu nejprve vypočítá jemu odpovídající číslo vzoku, od něj se odečte hodnota počtu vzorků v rekonstruovaném okně tak, aby číslo vzorku odpovídající neuronové odezvě bylo posledním časovým vzorkem rekonstruovaného okna spektrotemporální obálky. Dále se vypočte samotná obálka měřicího signálu, a pokud je obálek více (signál RN), spočítají a sečtou se všechny tyto obálky rekonstruovaného bloku. Po získání této části spektrotemporální obálky se její hodnoty přičtou do pole STRF (výsledek analýzy). Tento cyklus se opakuje pro všechny naměřené neuronové odpovědi. Jakmile proběhne tento součet, vynásobí se výsledné pole STRF konstantou popsanou v teoretickém popisu (vytvoří se průměr). Nakonec se ze získaného pole STRF vykreslí grafické znázornění pomocí speciálního formuláře, který umoţní téţ výsledek uloţit do binárního souboru a bitmapy.
29
3.4 Uživatelské rozhraní 3.4.1 Hlavní formulář Hlavní formulář uţivatelského rozhraní je znázorněn na obrázku 15. Formulář obsahuje veškeré informace a prvky potřebné k ovládání aplikace. Konkrétně samostatný blok pro generátor, a blok ovládání vyhodnocovacího nástroje. Ve spodní části hlavního formuláře se nachází stavové okno, do kterého se vypisují probíhající aktivity, jako například progrese generátoru či analyzátoru, načtení nových vstupů apod.
Obrázek 15 - Hlavní formulář uživatelského rozhraní.
30
V levé části hlavního formuláře se nachází panel obsahující zadané parametry generátoru, po spuštění aplikace nejsou parametry zadány, tudíţ jsou pole prázdná. Pod tímto panelem se nachází tlačítka:Set up parameters a Generate. Tlačítko Set up parameters slouţí k otevření dialogového okna, které je určeno k zadání jednotlivých parametrů. Dále tlačítko Generate slouţí ke spuštění generace signálu. Toto tlačítko je v případě, kdy nejsou nastaveny vstupní parametry, neaktivní, aby se zabránilo nechtěnému spuštění generujícího podprogramu. Pravá část aplikace slouţí k obsluze analyzačního nástroje, tedy k otevření datového souboru s parametry pro výpočet spektrotemporální obálky měřicího signálu a souboru s naměřenými odezvami, které se vyhodnocují. Cesty obou souborů s názvy jsou zobrazeny v textových polích pro lepší orientaci. Tlačítka: Load…slouţí k otevření těchto vstupních souborů pomocí dialogu pro otevření (Open dialog). Textové pole umístěné pod tlačítky pro načtení souborů slouţí k zadání délky zpoţdění při analýze, tj. jaký časový úsek zpět analyzátor uvaţuje před kaţdou odezvou neuronu. Zpoţdění je nastavitelné v rozmezí 1 aţ 1 000 ms. Pod tímto panelem se nachází tlačítko Analyze, které spustí samotnou proceduru analýzy. Tlačítko je neaktivní v případě, ţe nejsou zadány ţádné vstupy analyzátoru. Popsané ovládací prvky jsou téţ integrovány do hlavního menu, aplikace je tedy ovladatelná i pomocí poloţek nabídky. Jednotlivým funkcím byly přiřazeny tyto klávesové zkratky:
File|Exit-F10 konec programu
Generator|Set up parameters- Ctrl+P zobrazí formulář pro zadání parametrů
Generator|From file- Ctrl+F spustí dialog pro načtení parametrů ze souboru
Generator|Generate- Ctrl+G spustí generátor
Analyze|Load .par file- Ctrl+L načte soubor s parametry
Analyze|Load spike file- Ctrl+S načte textový soubor s naměřenými odezvami
Analyze|Analyze- Ctrl+A spustí analýzu
31
3.4.2 Formulář pro zadání nových parametrů
Obrázek 16 - Formulář pro zadávání nových parametrů generátoru.
Formulář lze spustit buď z hlavní nabídky: Generator|Set up parameters, klávesovou zkratkou Ctrl+P, nebo z hlavního formuláře tlačítkem: Set up parameters. Formulář obsahuje jednotlivá vstupní pole. U kaţdého pole je ošetřeno, aby šlo zadat jen kladné, celé číslo. Pro pole dolní frekvence a horní frekvence je ošetřeno, aby minimální kmitočet nepřesahoval maximální, mohou však být rovny. Horní frekvence je pouze přibliţná, protoţe se jednotlivé nosné kmitočty vypočítávají podle počtu nosných na oktávu a zadané dolní frekvence. Nejvyšší kmitočet tedy nemusí vyjít právě roven zadanému hornímu kmitočtu. Zadaná hodnota délky signálu se zkontroluje a v případě potřeby zaokrouhlí nahoru na násobek osmi sekund. Zaokrouhlení je potřeba, z důvodu pouţití neceločíselné vzorkovací frekvence, pokud by délka signálu nebyla dělitelná osmi beze zbytku, nevycházel by počet vzorků výsledného signálu celé číslo. Hloubku modulace lze zadat jen jako nezáporné, celé číslo. Vzorkovací frekvence se zadává
32
pomocí přepínacích tlačítek. Implicitně je nastavena na hodnotu: fvz=48 828,125 Hz. Ve spodní části se nacházejí tlačítka OK (uloţení parametrů) a Cancel (Storno). Potvrzením tlačítkem OK se spustí kontrola, zda jsou vyplněny všechny údaje a v případě ţe ne, nedojde k uloţení parametrů. Dále se také vygenerují náhodné vzorky pro parametry Ω a Fm způsobem, který byl popsán v předchozích kapitolách. Všechny parametry se nakonec uloţí do globálních proměnných. 3.4.3 Nástroj pro vykreslení grafického výstupu analyzátoru
Obrázek 17 - Nástroj pro vykreslení výsledku analýzy.
33
Tento formulář se automaticky spouští na konci kaţdého procesu analýzy. Můţete jej vidět na obrázku 17. Formulář umoţňuje také uloţit tento grafický výstup do bitmapového souboru pomocí nabídky File|Save. Proces vykreslování tohoto grafu funguje tak, ţe tento formulář převezme dvourozměrné pole s vypočtenými vzorky (pole je realizováno globální proměnnou), z něhoţ vytvoří výslednou bitmapu. Míchání barev zajišťuje funkce mixcolor(), která z hodnoty vytvoří příslušnou barvu. Hodnoty okolo nuly mají zelenou barvu, záporné hodnoty se zbarvují do modré, naopak kladné hodnoty se vybarvují do červené. Vzhledem k tomu, ţe kaţdá sloţka výsledné barvy je celočíselná, a má rozsah <0,255>bylo nutné rozsah hodnot v poli představující pole STRF upravit. Hodnoty se neupravují přímo v tomto poli, ale je alokováno nové, do kterého se přepočítané hodnoty zkopírují. Přepočítání probíhá tak, ţe se v původním poli najde hodnota s největší absolutní hodnotou, tou se kaţdý vzorek vydělí a následně vynásobí hodnotou 255, která odpovídá maximálnímu rozsahu barevné sloţky. Vlastnosti pole po přepočtu byly testovány tak, ţe pro obě pole (před a po úpravě) byly vytvořeny grafy v prostředí MATLAB®. Podoba obou grafů byla naprosto stejná, takţe tato úprava neměla vliv na informační obsah polí, ale pouze upravila rozsah hodnot.
34
4
Testování
Tuto desktopovou aplikaci bylo samozřejmě nutno otestovat, protoţe cílem jejího vytvoření byl také poţadavek na její stabilitu a rychlost. Testovací PC (Personal Computer) sestava byla následující: Základní deska Asus K8V-X SE, chipset VIA K8T800, CPU (Central Processing Unit) AMD (Advanced Micro Devices) Athlon 2800+ single core, 1,5 Gb RAM (Random Access Memory), HDD (Hard Disk) Seagate Barracuda 200 Gb, 7200 ot/m, OS Windows XP SP2.
4.1 Testování stability U aplikace bylo nutno otestovat několik případů: Nejdelší moţný generovaný signál Největší mnoţství nosných harmonických při generování Největší počet analyzovaných naměřených neuronových odezev na měřicí signál. Při testování na délku signálu se aplikace chovala stabilně do délky měřicího signálu 20 minut (pro vzorkovací frekvenci 48 828,125 Hz) a 10 minut (pro kmitočet 97 656,25 Hz). U delších signálů vykazovala aplikace problémy s alokací paměti určitých parametrů. Maximální počet nosných kmitočtů pouţitých při generování spektrální obálky kdy byla aplikace ještě stabilní, je přibliţně 300. Rychlost generování však v těchto krajních případech velice klesla, protoţe aplikace začne zapisovat data na pevný disk, tím pádem je čtení a zapisování pomalejší. Hranici omezení počtu naměřených neuronových odezev se nepodařilo zjistit. Testovací data, která byla k dispozici, obsahovala kolem 700 naměřených odezev, a aplikace se 35
chovala naprosto stabilně. Problém s mnoţstvím alokované paměti se neobjevil, protoţe maximální délka počítané obálky při analýze je pouze 1 s, a vzhledem k tomu, ţe generátor ukládá do paměti 8 s obálky, je v procesu analýzy ještě rezerva.
4.2 Testování rychlosti Testováním rychlosti generátoru a analyzátoru bylo potvrzeno, ţe je tato implementace mnohem rychlejší neţ řešení v MATLABu. Rychlost generování i analýzy jsou samozřejmě závislé na výpočetním výkonu dané PC sestavy, takţe měření konkrétních časů těchto operací je zbytečné. Analyzátor je schopen zpracovat všechny signály vygenerované touto aplikací, oproti tomu původní řešení STRFPak nebylo schopno zpracovat signál delší neţ 1s s přibliţně 100 nosnými kmitočty, coţ znamená veliké omezení.
36
5
Závěr
Cílem této bakalářské práce bylo v jazyce C++ vytvořit aplikaci, schopnou generovat signály pro měření neuronů ve sluchové dráze. Práce měla nahradit, vylepšit a zapouzdřit obě stávající implementační řešení v prostředí MATLAB®. Tato řešení měla nedostatky, které bylo nutno odstranit, zejména neefektivní správu paměti a nutnost mít nainstalované prostředí MATLAB®. Analyzátor dokonce nebyl podle testování schopen zpracovat měřicí signály delší neţ 1 s v kmitočtovém rozsahu 500 Hz aţ 20 000 Hz při počtu 300 nosných kmitočtů. Výstup analyzátoru měl být v podobě binárního souboru, tak i grafu. Všechny tyto poţadavky se podařilo splnit v celém rozsahu a tím naplnit účel této bakalářské práce. Aplikace je schopna generovat měřící signály, úspěšně je ukládat a také znovu načítat. Je přenositelná a spustitelná kdekoliv v operačním systému Windows©. Generátor můţe spolehlivě generovat signály do délky 20 minut při 300 nosných frekvencí. (pro vzorkovací frekvenci 48 828,125 Hz) a 10 minut (pro kmitočet 97 656,25 Hz). Jsou samozřejmě ošetřeny nestandardní vstupy. Úspěšně se podařilo vyřešit problematiku interpolace signálu některých náhodných parametrů při generování vlastního signálu. Bylo potřeba vyřešit náhradní řešení pro kubickou interpolaci, která není v jazyce C++ standardně k dispozici. Toto řešení znamenalo vytvořit funkci pro převzorkování signálu, dále funkci pro lineární interpolaci, a konečně bylo potřeba implementovat dolnopropustní diskrétní IIR filtry pro konečné vyhlazení signálu. Výsledek tohoto řešení má dokonce lepší spektrum neţ řešení v MATLABu®. Všechny pouţité algoritmy jsem vyvíjel tak, aby byly přehledné, rychlé a co nejjednodušší. Některé matematické funkce jako například erf() nebyly obsaţeny v standardních matematických knihovnách, a proto jsem je musel čerpat z cizích zdrojů, nebo celé sám navrhnout. U procesu generování se objevil problém s nedostatkem paměti pro uloţení celé spektrální obálky signálu, proto bylo nutno obálku rozdělit do kratších úseků délky 8 s. Délka úseku byla zvolena jako nejmenší blok, u kterého při pouţití námi pouţívaných vzorkovacích frekvencí vyšel celočíselný počet vzorků. Toto rozdělení nemá na rychlost procesu generování vliv, naopak zmenšuje paměťovou náročnost celé aplikace.
37
Analyzační nástroj částečně pouţívá algoritmus generátoru, pozměněna byla velikost úseku počítání spektrotemporální obálky. Proces analýzy naměřených neuronových odpovědí byl vytvořen podle principu uvedeného v článku [7]. Bohuţel se ale nepodařilo zrekonstruovat analýzu přesně tak, aby dávala stejné výsledky jako aplikace STRFPak. [12]. Tato aplikace totiţ pouţívá více různých výpočetních algoritmů, které se díky nedostatečné dokumentaci tohoto programového balíku nepodařilo blíţe odkrýt. STRFPak navíc zobrazuje osu kmitočtů lineárně, naše řešení pouţívá logaritmickou stupnici, coţ ztěţuje přesné porovnání výsledků. Podařilo se také vytvoření funkce schopné vykreslovat grafický výsledek analýzy, který lze uloţit jako binární soubor, nebo i ve formě bitmapy. Nad rámec zadání se povedlo navrhnout a implementovat grafické rozhraní pro jednodušší manipulaci a přehlednější práci. Dále také nastavení některých parametrů jako hloubka modulace generátoru, která byla původně pevně nastavena na konstantních hodnotách 30, nebo 45 dB, je nyní volitelná a to v rozsahu od 0 do 65 535 dB. Také délka zpoţdění pro analýzu signálu je volitelná v rozsahu 1 aţ 1 000 ms. V původní implementaci se také nepočítalo s uloţením všech potřebných parametrů pro zpětnou rekonstrukci signálu. Ta byla vyřešena druhým výstupním souborem. Díky němu je potom analýza mnohem přesnější (signál se nemusí numericky rekonstruovat). Navrhnul bych několik moţných vylepšení pro tuto práci. Například realizaci objektově orientovaným způsobem, tudíţ vytvoření adekvátních tříd a metod pro zpřehlednění celého zdrojového kódu. Dále by se pro výpočetně náročné funkce, jako je proces generování a analýzy, daly pouţit vícevláknové procesy. Je vysoce pravděpodobné, ţe proces generování a analýzy by se tímto zrychlil. Je zapotřebí otestovat, zda by se neobjevily problémy s pamětí při práci s delšími signály. Toto by proto mohlo být předmětem dalšího zkoumání. Jako další moţnost vylepšení bych také navrhnul pouţití DLL knihoven. Grafické rozhraní by se tímto neměnilo, výpočetně náročné algoritmy, které je potřeba neustále vyvíjet a zdokonalovat by obsahovaly právě DLL knihovny. Tím by se nemusela obměňovat celá aplikace, ale plně by dostačovala pouze výměna těchto knihoven. Tato úprava by více zdokonalila vytvořenou aplikaci. Zapracovat by se dalo i na efektivitě pouţitých algoritmů. Aplikace je sice několikanásobně rychlejší neţ původní implementace řešení v MATLAB®, ale efektivita není dokonalá. Zlepšit by se 38
mohl výpočet parametrů Ω a Fm. Nyní v kaţdém cyklu generace osmisekundové části výstupního signálu sRN se tyto parametry interpolují pro celou délku tohoto signálu. To není zcela efektivní, ale řešení tohoto problému by zabralo mnoho času a znamenalo by přepsání mnoha pouţitých funkcí, a proto ho uvádím jako moţnost dalšího vylepšení zdrojového kódu. Jako vylepšení pro analyzační nástroj bych navrhnul zapracovat na parsování textových souborů s časy naměřených odezev neuronů. V této verzi soubor obsahuje pouze časy jednoho měření. Měření se však provádí, pro stejný signál, několikrát za sebou, a nástroj, který tyto soubory generuje, vloţí do souboru časy všech měření. Je tedy nutno časy měření, které nechceme analyzovat, nejprve ze souboru vymazat. Pro ulehčení by analyzátor mohl po načtení tohoto souboru nabídnout uţivateli, které měření zaznamenané v souboru, chce analyzovat.
39
Seznam použité literatury [1] Builder [online]. Grafika Publishing, s.r.o. , 1997 [cit. 2011-05-24]. Dostupné z WWW: http://www.builder.cz/ [2]BUREŠ, Zbyněk. Modelování lidské sluchové dráhy a vnímání zvuku. Praha, 2007. 215 s. Dizertační práce. České vysoké učení technické v Praze [3] Bytes [online]. 2005 [cit. 2011-05-24]. 'erf' function in C. Dostupné z WWW: http://bytes.com/topic/c/answers/216183-erf-function-c [4] Center for Computer Research in Music and Acoustics [online]. 2003 [cit. 2011-0524]. WAVE PCM sound file format . Dostupné z WWW: http://ccrma.stanford.edu/courses/422/projects/WaveFormat/ [5] Cplusplus.com [online]. 2000 [cit. 2011-05-24]. Dostupné z WWW: http://cplusplus.com/ [6] Error function. In Wikipedia : the free encyclopedia [online]. St. Petersburg (Florida) : Wikipedia Foundation, last modified on 20.4.2011 [cit. 2011-05-24]. Dostupné z WWW: http://en.wikipedia.org/wiki/Error_function [7] ESCABI, Monty A.; SCHREINER, Christoph E. Nonlinear Spectrotemporal Sound Analysis by Neurons in the Auditory Mindbrain. The Journal of Neuroscience. 15.5.2002, 22, s. 4114-4131. [8] HERMES, D.J., et al. Spectro-temporal characteristics of single units in the auditory midbrain of the lightly anaesthetised grassfrog (rana temporaria L.) investigated with noise stimuli. Hearing research. 21.5.1981, 5, s. 147-178. [9] Infinite impulse response. In Wikipedia : the free encyclopedia [online]. St. Petersburg (Florida) : Wikipedia Foundation, last modified on 14.5.2011 [cit. 2011-0524]. Dostupné z WWW: http://en.wikipedia.org/wiki/Infinite_impulse_response
40
[10] KADLEC, Václav. Učíme se programovat v Borland C++ Builder a jazyce C++. Praha : Computer Press, 2002. 381 s. ISBN 80-7226-550-4 [11] Math Works [online]. 2011 [cit. 2011-05-24]. Product Documentation. Dostupné z WWW: http://www.mathworks.com/help/techdoc/ [12] MATOUŠEK, David. C++ Builder - řešené příklady. 1. Praha : BEN - technická literatura, 2010. 98 s. ISBN 978-80-7300-258-9 [13] STRFPak : The spatio- and spectrotemporal receptive field estimation package [online]. 2007 [cit. 2011-05-21]. Dostupné z WWW: http://strfpak.berkeley.edu/ [14] WAV. In Wikipedia : the free encyclopedia [online]. St. Petersburg (Florida) : Wikipedia Foundation, last modified on 22.5.2011 [cit. 2011-05-24]. Dostupné z WWW: http://en.wikipedia.org/wiki/WAV
41
Seznam obrázků Obrázek 1 - Ukázka charakteristiky STRF. Na vodorovné ose je znázorněn čas v milisekundách (delay - zpoţdění) před neuronovou odezvou, na svislé ose jsou vyneseny kmitočty spektra (octave frequency - frekvence oktávy). Červená oblast je kmitočtová oblast excitace (excitation - vzruch) neuronu, modrá oblast znázorňuje inhibované (inhibition - potlačení) kmitočty. [7]............................................................ 12 Obrázek 2 - Ukázka spektrální obálky v okamţitém časovém okamţiku. Této obálce se v čase mění fázový posuv a počet period na oktávu. ...................................................... 13 Obrázek 3 - Znázornění metody získání měřicího signálu z bílého šumu. Vyšrafovaná oblast odpovídá poţadovanému frekvenčnímu rozsahu signálu, ostatní kmitočty se vyfiltrují. Spektrum signálu je dále modulováno sinusovou spektrální obálkou. ........... 14 Obrázek 4 - Znázornění metody získání spektrotemporální obálky pomocí nosných harmonických, ty jsou znázorněny jako f1 aţ fn. ........................................................... 14 Obrázek 5 - Ukázka spektrální obálky signálu DMR. .................................................... 15 Obrázek 6 - Průběh spektra parametrů Fm a Ω. Mezní frekvence Fzlomu je pro Ω 3 Hz a pro Fm 1,5 Hz. ............................................................................................................. 16 Obrázek 7 - Ukázka spektra zvuku přirozené vokalizace koček. [7] Na vodorovné ose je čas (time), na svislé jsou oktávy okolo frekvence 1 000 Hz (octaves above 1 000 Hz). 17 Obrázek 8 - Ukázka spektra signálu RN ......................................................................... 18 Obrázek 9 - Ukázka spektra zvuku bublání potoka (Babbling brook). Spektrum signálu RN má připomínat spektrum takovýchto přírodních zvuků. [7] Na vodorovné ose je vynesen čas (time), na svislé ose kmitočty oktáv okolo 1 000 Hz (Octaves above 1 000 Hz). ....................................................................................................................... 19
42
Obrázek 10 - Znázornění principu analýzy naměřených neuronových odezev. Jednotlivá barevná okna jsou spektrální obálky úseků před naměřenou odezvou neuronu. Jejich součtem se získá charakteristika STRF. [7] Time znamená čas, action potentials jsou akční potenciály neuronu, inhibition je inhibice (potlačení), a excitation je vzruch. Octave frequency jsou nosné harmonické na oktávu...................................................... 21 Obrázek 11 - Převzorkovaný náhodný signál Ω (Fm) před intepolací. .......................... 24 Obrázek 12 - Signál Ω (Fm) po lineární interpolaci. ...................................................... 25 Obrázek 13 - Porovnání spekter obou řešení. Řešení v MATLABu je znázorněno zelenou barvou, řešení v C++ modrou. Zde je patrné, ţe námi navrţené řešení má strmější útlum. ................................................................................................................ 26 Obrázek 14 – Signál Ω (Fm) po lineární interpolaci a následné filtraci. Na tomto obrázku je porovnání tvarů signálů interpolovaných v MATLABu a řešení v C++. Zeleně je znázorněn výsledek řešení v MATLAB, a modře řešení v C++. .................... 26 Obrázek 15 - Hlavní formulář uţivatelského rozhraní. .................................................. 30 Obrázek 16 - Formulář pro zadávání nových parametrů generátoru. ............................. 32 Obrázek 17 - Nástroj pro vykreslení výsledku analýzy. ................................................. 33
Seznam tabulek Tabulka 1 – Struktura souboru s uloţenými parametry signálu ..................................... 47 Tabulka 2 - Struktura datového souboru s uloţeným výsledkem analýzy ..................... 48
43
Seznam zkratek AMD Advanced Micro Devices DLL
Dynamic-Link Library
DMR Dynamic Moving Ripple erf
Error Function
exe
Execute
GB
Gigabyte
GHz
Gigahertz
HDD Hard Disk Hz
Hertz
IIR
Infinite Impulse Response
OS
Operating System
PC
Personal Computer
RAM Random Access Memory RN
Ripple Noise
SP
Service Pack
STRF Spectrotemporal Receptive Field STRFPak TDT
Spectrotemporal Receptive Field Package
Tucker Davis Technologies,
VCL Visual Component Library XP
Experience
44
6
Přílohy
A
Formáty vstupních a výstupních souborů
B
Popis funkcí a modulů tvořící aplikaci
C
Přiloţené CD s přeloţenou aplikací a jejím zdrojovým kódem
45
Příloha A
Formáty výstupních a vstupních souborů
Formáty vstupních a výstupních souborů Datový soubor s parametry: *.par V tomto souboru jsou uloţeny všechny parametry důleţité pro opakovanou, nebo zpětnou rekonstrukci měřicího signálu. Pouţívá se buď jako vstup generátoru, kde zajišťuje, aby samotný vygenerovaný signál byl vţdy stejný, při jakémkoliv opakování generace signálu, nebo jako jeden ze vstupů analyzátoru. Tím je umoţněna přesná rekonstrukce spektrotemporální obálky signálu během analýzy. Soubor je také vţdy výstupem při generování nového signálu. V případě, kdy se měřicí signál generuje s tímto souborem na vstupu, výstupem generátoru je také „*.par“ soubor, který je obsahově stejný. Pouze má nově zadaný název, který je stejný i pro soubor s generovaným měřícím signálem (liší se příponou). Soubor v sobě obsahuje tyto parametry:
Počet obálek,
délka signálu v sekundách,
vzorkovací frekvence,
dolní frekvence,
horní frekvence,
počet harmonických na oktávu,
hloubka modulace
jednotlivé vzorky parametru Ω (vzorkované 6Hz)
jednotlivé vzorky parametru Fm (vzorkované 3Hz)
Vzorky parametrů Ω a Fm, jak jsem uvedl v předchozích kapitolách, jsou generovány náhodně, a proto je potřeba je ukládat společně s ostatními parametry pro přesnou rekonstrukci spektrotemporální obálky. Nejprve jsou uloţeny vzorky Ω pro jednotlivé obálky za sebou, a poté vzorky Fm stejným způsobem. Strukturu tohoto souboru lze vidět v tabulce 1.
46
Příloha A
Formáty výstupních a vstupních souborů
Tabulka 1 – Struktura souboru s uloženými parametry signálu pořadí 1 2 3
parametr Počet obálek vzorkovací frekvence délka signálu
offset
4 hloubka modulace 5 minimální frekvence 6 maximální frekvence počet harmonických na 7 oktávu 8 Omega 9 Fm
14 2B 16 4B 20 4B
datový typ (C++) unsigned int double unsigned int unsigned short int unsigned int unsigned int
24 4B
unsigned int
4B*6*délka 28 signálu*počet obálek
float
velikost (B) 0 4B 4 8B 12 4B
28+velikost Ω
4B*3*délka signálu*počet obálek
float
Soubor vzorků měřícího signálu: *.dat Jedná se o soubor syrových dat, který slouţí k uloţení pouze samotných vzorků generovaného měřicího signálu. Původně jsem měl v úmyslu pouţít známý formát „*.wav“, avšak kvůli práci s neceločíselnými vzorkovacími frekvencemi jej nebylo moţné pouţít. Proto jsem vytvořil tento formát. Veškeré potřebné parametry jako: počet obálek, délka signálu, vzorkovací frekvence, minimální frekvence, maximální frekvence, počet harmonických na oktávu a hloubka modulace jsou uloţeny v datovém souboru, který je popsán v předchozí kapitole. V souboru jsou uloţeny za sebou jednotlivé časové vzorky o velikosti 2 B, které jsou datového typu short integer (2 Bytový celočíselný typ se znaménkem). Z toho vyplývá, ţe rozsah vzorků je v oboru hodnot <-32768,32767>. Počet vzorků se určí ze vzorkovací frekvence a délky signálu výpočtem:
47
Příloha A
Formáty výstupních a vstupních souborů
Soubor naměřených neuronových odezev *.txt Jedná se o obyčejný textový soubor, ve kterém jsou obsaţeny jednotlivé časy neuronových odezev. Kaţdý čas neuronové excitace se nachází na jednotlivém řádku. Jednotkami jsou milisekundy. Tyto časy jsou zapsány ve vědecké notaci v tzv. „E formě“ (uvedeno na příkladu). Hodnoty mají tedy následný tvar např.: 9,42759155273438E+0002 = 942, 759155273438 ms. Výstupní datový soubor s výsledky analýzy Tento binární soubor obsahuje výsledek proběhlé analýzy naměřených neuronových odezev na měřicí signál. Jeho struktura je znázorněna v tabulce 2. Tabulka 2 - Struktura datového souboru s uloženým výsledkem analýzy
1 Počet časových vzorků 2 počet nosných kmitočtů
0 4B 4 4B
datový typ (C++) unsigned long int unsigned int
3 jednotlivé nosné kmitočty
4B * počet nosných 8 kmitočtů
float
pořadí parametr
4 jednotlivé vzorky
offset
velikost (B)
8B+4B*počet 8B*počet nosných nosných kmitočtů*Počet kmitočtů časových vzorků
double
Vzorky dvourozněrného pole hodnot analýzy jsou uloţeny v řadách od nejniţšího nosného kmitočtu, po nejvyšší kmitočet, pro jeden časový okamţik. Tyto řady jsou za sebou umístěny tak, ţe první řada obsahuje vzorky pro největší časové zpoţdění uvaţované v analýze, a poslední řada vzorků je pro zpoţdění
.
48
Příloha B
Popis modulů a funkcí tvořící aplikaci
Popis modulů a funkcí tvořící aplikaci Aplikace se skládá z několika formulářů. Hlavní formulář s názvem Form1 obsahuje všechny události pro chod této aplikace v grafickém uţivatelském rozhraní. Nachází se v souboru main.cpp a main.h. Dále formulář FNew (obsaţen v souborech New.cpp a New.h) slouţí k zadávání nových parametrů pro generátor. Formulář FBitmap, který se nachází v souborech Bitmap.h a Bitmap.cpp, obsahuje funkce pro vykreslení grafu analýzy. Byla vytvořena také knihovna lib.cpp, která obsahuje funkce, jeţ nebyly standardně k dispozici. Jedná se o tyto funkce: intmixcolor(shortint c), voidlinspace(float a, float b, unsigned long int n, floattmp[]), double log2(double n), floatmyabs(float x), double myabsdouble(double x), floatmax(unsigned long int s, float *p), void filterom1(float *x, unsigned long int l), void filterom2(float *x, unsigned long int l), void filterfm1(float *x, unsigned long int l), void filterfm2(float *x, unsigned long int l), voidinterp(float *x, unsigned long int l), double erf(double x), double erfc(double x). Funkce mixcolor() se stará o vypočtení hodnoty barvy při vykreslování grafu. Nulová hodnota představuje zelenou, pro kladné hodnoty se zvyšuje červená sloţka, a pro maximální hodnotu (255) vrátí červenou. Pro záporné hodnoty je princip stejný, ale barva přechází do modré. Linspace()se stará o lineární rozloţení prvků v poli. Parametry a a b udávají dolní a horní mez hodnot, kterými se má pole vyplnit. Dále parametr n určuje počet poloţek v poli a poslední parametr tmp[] představuje pole, ve kterém se tato operace provádí. 49
Příloha B
Popis modulů a funkcí tvořící aplikaci
Funkce log2() vrací logaritmus čísla o základu 2. Dále funkce myabs() a myabsdouble() vrací absolutní hodnotu čísla. Další vytvořená funkce, funkce max() slouţí k prohledání pole a nalezení jeho maximální hodnoty. Parametr s zde udává počet prvků pole, a parametr p reprezentuje samotné prohledávané pole. Funkce filterom1(), filterom2(), filterfm1() a filterfm2() slouţí k filtraci signálů během procesu interpolace. Jedná se o IIR Butterworthovy filtry pro parametry Ω a Fm. Filtry č.1 jsou navrţeny pro vzorkovací frekvenci fvz=48 828,125, filtryč.2 jsou vytvořeny pro kmitočet fvz=97 656,25. Funkce interp() se stará o lineární interpolaci převzorkovaného pole při procesu interpolace. Prvním parametrem je ukazatel na pole, které chceme interpolovat, a druhý parametr udává počet prvků v poli. Konečně funkce erf() reprezentuje matematickou funkci pro převod čísel do rovnoměrného rozdělení, jejíţ význam je popsán výše. Implementaci této funkce jsem musel vyhledat, protoţe nebyla v matematických knihovnách standardně k dispozici.
50