Docsity
Docsity

Przygotuj się do egzaminów
Przygotuj się do egzaminów

Studiuj dzięki licznym zasobom udostępnionym na Docsity


Otrzymaj punkty, aby pobrać
Otrzymaj punkty, aby pobrać

Zdobywaj punkty, pomagając innym studentom lub wykup je w ramach planu Premium


Informacje i wskazówki
Informacje i wskazówki

Wykorzystanie efektu Dopplera do sterowania komputerem ..., Egzaminy z Linux

Wykrywanie gestów, zjawisko. Dopplera. W niniejszej pracy chcielibyśmy zająć się przedstawieniem pewnej moż- liwości sterowania komputerem, wykorzystując do ...

Typologia: Egzaminy

2022/2023

Załadowany 23.02.2023

Henryka
Henryka 🇵🇱

4.5

(155)

405 dokumenty

1 / 31

Toggle sidebar

Ta strona nie jest widoczna w podglądzie

Nie przegap ważnych części!

bg1
Uniwersytet Wrocławski
Wydział Matematyki i Informatyki
Instytut Matematyczny
specjalność: matematyka z informatyką
Krzysztof Makaro
Wykorzystanie efektu Dopplera do sterowania
komputerem przy pomocy gestów.
Praca magisterska
napisana pod kierunkiem
dr hab. Macieja Paluszyńskiego
Wrocław 2016
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f

Podgląd częściowego tekstu

Pobierz Wykorzystanie efektu Dopplera do sterowania komputerem ... i więcej Egzaminy w PDF z Linux tylko na Docsity!

Uniwersytet Wrocławski

Wydział Matematyki i Informatyki

Instytut Matematyczny

specjalność: matematyka z informatyką

Krzysztof Makaro

Wykorzystanie efektu Dopplera do sterowania

komputerem przy pomocy gestów.

Praca magisterska

napisana pod kierunkiem

dr hab. Macieja Paluszyńskiego

Wrocław 2016

................................................... (imiona i nazwisko)

………………………………………………… …................................................... (aktualny adres do korespondencji) (numer PESEL)

................................................... (adres e-mail)

................................................... (wydział)

................................................... (kierunek studiów)

................................................... ................................................... (poziom i forma studiów) (numer albumu)

OŚWIADCZENIE O PRAWACH AUTORSKICH I DANYCH OSOBOWYCH

Ja niżej podpisany/a ……………………………………………………………………………………….. student/ka Wydziału …………………………………………………………………………………………………. kierunek ………………………………………….. oświadczam, że przedkładana praca dyplomowa na temat: ……………………………………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………..  jest mojego autorstwa i nie narusza autorskich praw w rozumieniu ustawy z dnia 4 lutego 1994 r. o prawie autorskim i prawach pokrewnych (tekst jednolity: Dz. U. z 2006 r. Nr 90, poz. 631, z późn. zm.) oraz dóbr osobistych chronionych prawem;  nie zawiera danych i informacji uzyskanych w sposób niedozwolony;  nie była wcześniej przedmiotem innej urzędowej procedury związanej z nadaniem dyplomu uczelni wyższej lub tytułu zawodowego;  treść pracy dyplomowej przedstawionej do obrony, zawarta na przekazanym nośniku elektronicznym, jest identyczna z jej wersją drukowaną.

Oświadczam, iż zostałem/am poinformowany/a o prawie dostępu do treści moich danych osobowych oraz ich poprawiania. Udostępnienie przez mnie danych osobowych ma charakter dobrowolny.

Wyrażam zgodę, na:

 udostępnienie mojej pracy dla celów naukowych i dydaktycznych;  przetwarzanie moich danych osobowych w myśl ustawy z dnia 29 sierpnia 1997 r. o ochronie danych osobowych (tekst jednolity: Dz. U. z 20 14 r., poz. 1182 , z późn. zm.);  umieszczenie mojej pracy w bazie danych Uczelni i jej przechowywanie przez okres stosowny do potrzeb Uczelni;  wykorzystanie mojej pracy jako elementu komparatywnej bazy danych Uczelni;  udostępnienie mojej pracy innym podmiotom celem prowadzenia kontroli antyplagiatowej prac dyplomowych i innych tekstów, które zostaną opracowane w przyszłości;  porównywanie tekstu mojej pracy z tekstami innych prac znajdujących się w bazie porównawczej systemu antyplagiatowego i zasobach Internetu.

Wrocław, …………………………………. …………………………………………

(rrrr – mm - dd) (czytelny podpis autora pracy)

Wstęp

W pracy opisaliśmy sposób sterowania programami komputerowymi przy pomocy gestów dłoni. Wykorzystujemy do tego tor audio (mikrofon i głośniki) obecny w prawie każdym komputerze typu laptop. W prezentowanym projek- cie kluczowym elementem umożliwiającym rozpoznawanie gestów jest efekt Dopplera. Zaprojektowany przez nas program analizuje niesłyszalny sygnał akustyczny odbity od poruszającej się ręki i na podstawie analizy częstotliwo- ściowej ocenia wykonany ruch. Aplikację napisaliśmy w języku skryptowym Python i działa ona na komputerach posiadających system operacyjny Linux oraz Windows. W rozdziale pierwszym opisaliśmy dokładniej szczegóły tech- niczne i wykorzystywane zjawisko Dopplera. Omówiliśmy także inne znane podejścia do zagadnienia wykrywania gestów. Natomiast w rozdziale drugim przedstawiliśmy konkretne rozwiązania programowe, oraz omówiliśmy uzy- skane efekty. Inspiracją do stworzenia tego projektu była strona D. Rappa [1]. Autor opisał tam skrypt realizujący przewijanie stron internetowych przy pomocy gestów. Program został napisany w języku javascript i wykorzystuje w swoim działaniu właśnie zjawisko Dopplera. Natomiast opisany w tej pracy projekt może sterować różnymi aplikacjami, gdyż emuluje on kręcenie rolką myszy.

Rozdział 1

Wykrywanie gestów, zjawisko

Dopplera.

W niniejszej pracy chcielibyśmy zająć się przedstawieniem pewnej moż- liwości sterowania komputerem, wykorzystując do tego wbudowane w kom- puterze głośniki oraz mikrofon. Wykonywane przed komputerem gesty ręki będziemy wykrywać i rozpoznawać dzięki ich interakcji z falą akustyczną. Wykorzystamy tu zjawisko zwane efektem Dopplera [2]. Podstawowe gesty od których zaczniemy analizę to ruch ręką w przód lub w tył. Oznacza to, iż będziemy poruszać ręką w kierunku mikrofonu lub też oddalać ją od niego. Docelowo będziemy chcieli wykrywać bardziej złożone ruchy, w tym ruch ręką w górę, co będzie znaczyło, że chcemy przewinąć stronę internetową w dół, czyli przesuwanie rolką myszy w dół. Jest bowiem w czym wybierać. Moż- liwości rozpoznawania gestów przez różne aplikacje, którym wykrywanych gestów dostarczają urządzenia peryferyjne komputerów, jest bardzo wiele. Problem rozpoznawania gestów i ogólniej sterowanie aplikacjami przy pomo- cy gestów jest bardzo intensywnie badane. Możemy wyróżnić kilka podejść do zagadnienia rozpoznawania gestów. Wśród najbardziej rozpowszechnio- nych i najczęściej używanych w codziennym życiu metod, jest wykrywanie gestów, które wykonujemy palcem na ekranach dotykowych. Gdy widzimy na ekranie wyświetlony napis: TAK, to wystarczy go dotknąć. Podobną do tej metody jest również funkcja Touchpada, stosowana w laptopach, która zastępuje poruszanie myszką. Zaletą powyższego sposobu jest jego intuicyj- ność. W tej metodzie nie jest aż tak ważna dokładność, chyba że mamy do czynienia z małą powierzchnią ekranu dotykowego lub też posługujemy się bardziej zaawansowanymi lub szybszymi gestami wykorzystywanymi na przy- kład w grach zręcznościowych. Inną możliwością na skorzystanie z gestów jest użycie kamery. Jedną z bibliotek wspierających przetwarzanie obrazu z ka- mer, ale też poszczególnych obrazów jest OpenCV. Biblioteka ta jest uży-

padku jest to kamera. Będziemy badać obraz klatka po klatce. Na początku, każdy przychodzący ze źródła obraz zamieniamy na jego skalę szarości. Na takim czarno-białym zdjęciu wywołujemy funkcję, która wyszukuje twarz, a pętla for we wszystkich znalezionych miejscach rysuje niebieski kwadrat oznaczający twarz. Następnie wyświetlamy obraz z kamery z nałożoną naszą ingerencją w postaci oznaczania twarzy (klawisz ESC wychodzi z programu). Inne bardziej rozbudowane podejście do zagadnienia wykrywania gestów za- stosowano w przystawce Kinect do konsoli do gier Xbox 360 firmy Microsoft.

Rysunek 1.1: Przystawka Kinect [12]

Kinect posiada dwie kamery, promiennik podczerwieni, cztery mikrofony kie- runkowe oraz akcelerometr [6]. Promienie światła podczerwonego emitowane w kierunku jednej lub maksymalnie dwóch osób, stojących naprzeciwko urzą- dzenia, służą do odczytania odległości. Dzięki kamerze z filtrem podczerwieni przystawka Kinect bada obraz postaci oświetlonych światłem podczerwonym. Zastosowane algorytmy umożliwiają rozpoznanie sylwetki oraz gestów wyko- nanych przed urządzeniem. Ciekawym zastosowaniem Kinecta, jest użycie w lokalach typu bar jako dodatkowa atrakcja, rozrywka przyciągająca klien- tów. Gra taneczna polegająca na powtarzaniu wyświetlanych ruchów przez dwie osoby stojące przed ekranem z dołączoną przystawką Kinect, jest jed- nym z przykładów praktycznego wykorzystania tej technologii. Innym sposobem wykorzystania gestów do sterowania aplikacjami jest opaska MYO firmy Thalmic Labs.

Rysunek 1.2: Opaska Myo [5]

Dzięki umiejscowieniu jej na przedramieniu może ona wykorzystać napięcie mięśniowe występujące przy wykonywaniu gestów ręką. Urządzenie posia- da też akcelerometr co dodaje mu możliwości odczytu położenia i pochylenia opaski. Jak zapewniają twórcy, możemy również dzięki niej sterować dronem. Obracanie ręki w celu zmiany położenia opaski powoduje zmianę kierunku lo- tu drona. Jednak na pewno opaska nie jest aż tak intuicyjna jak powszechny joystick, za pomocą którego sterowanie dronem, śmigłowcem czy też samo- chodem jest proste. Jeszcze innym urządzeniem jest gadżet wyprodukowany przez firmę Le- ap Motion. Sprzęt ten jest kolejną ciekawostką na rynku, pozwalającą na przetwarzanie naszych gestów w konkretne funkcje sterujące w grze, czy też w innej aplikacji. Kontroler podłącza się za pomocą kabla USB, a następ- nie kładzie w dogodnym miejscu do wykonywania gestów, na przykład przed monitorem. Jest ono wyposażone w dwie kamery oraz trzy diody LED ze światłem podczerwonym, dlatego też gesty wykonuje się nad urządzeniem. Oprogramowanie wykorzystuje obraz z kamer nagrany w podczerwieni, przy pomocy czego gesty łatwiej jest rozpoznawać. Jednakże, pomimo innowacyj- ności dwóch ostatnich gadżetów, nie potrafiły one w żaden sposób podbić rynku, a tym bardziej zdeklasować Kinecta. Technologia sterowania komputerem przy pomocy gestów jest intensywnie rozwijana i powszechnie stosowana, co niesie za sobą pewne realne zagroże- nia. Można wyobrazić sobie złośliwe oprogramowanie, które śledzi i nagrywa, ewentualnie przesyła gdzieś zarejestrowane obrazy wraz z innymi danymi o użytkowniku. Jest to oczywiście tylko przykład potencjalnego zagrożenia

łu i zakres działania danego sprzętu może zbytnio spowolnić nasz program. Przeglądając Internet, natknęliśmy się na projekt Daniela Rappa [9], który wzorował się na publikacji o SoundWave [1], inżynierów z firmy Microsoft. Zaciekawił nas odmienny sposób rozpoznawania ruchów ręką przy użyciu prostego sprzętu, obecnego praktycznie w każdym laptopie. Gesty wykrywa- ne są dzięki znanemu w fizyce efektowi Dopplera, który polega na pozornym zwiększaniu się częstotliwości fali podczas zbliżania się źródła emisji fali do obserwatora oraz analogicznie, zmniejszania się częstotliwości w miarę od- dalania się źródła od punktu obserwacji. Inaczej mówiąc, efekt ten polega na ”powstawaniu różnicy częstotliwości wysyłanej przez źródło fali oraz re- jestrowanej przez obserwatora, który porusza się względem źródła fali” [11]. Poniżej przedstawimy wyprowadzenie wzoru na częstotliwość pozorną.

Rysunek 1.3: Układ obserwator-emiter

obserwator emiter

v

X

Wyobraźmy sobie sytuację, gdy źródło dźwięku (emiter) porusza się w kie- runku obserwatora. Dla uproszczenia przyjmijmy, że emiter nadaje dźwięk bazowy sinusoidalny o częstotliwości f i porusza się względem obserwato- ra z prędkością v. Przyjmijmy, że fala dźwiękowa porusza się z prędkością c. Obliczymy czas pomiędzy sąsiednimi przejściami przez 0 fali akustycznej odebranej przez obserwatora. Niech pierwsze przejście przez 0 zostanie wy- emitowane w momencie t = 0 w odległości X od obserwatora. Kolejne przej- ście przez 0 zostanie wyemitowane w momencie T 2 ( T = (^1) f , okres emitowanej

fali) w odległości

X

vT 2

od obserwatora. Pierwsze przejście przez 0 zostanie przez obserwatora zareje- strowane w momencie T 0 = xc. Kolejne przejście przez 0 będzie zarejestrowane w momencie

T 1 =

XvT 2 c

T

Z punktu widzenia obserwatora połowa okresu odebranej fali akustycznej to:

T ′ 2

= T 1 − T 0 =

Xvt 1 c

  • t 1 −

X

c

= t 1

cv c

Zatem otrzymujemy z tego częstotliwość pozorną f’:

f ′^ =

T 1 − T 0

1 f

cv c

= f

c ( cv )

Widzimy więc, że gdy v > 0 (emiter zbliża się do obserwatora) pozorna częstotliwość jest większa od bazowej, a gdy v < 0 (emiter oddala się od obserwatora) pozorna częstotliwość jest mniejsza od emitowanej. Korzysta- jąc z powyższego wzoru mogliśmy podjąć decyzję, podobnie jak zrobili to autorzy publikacji o SoundWave, jakiej częstotliwości bazowej powinniśmy użyć, aby móc jak najlepiej i najłatwiej wychwytywać później zmiany czę- stotliwości pozornej. Ważne jest, aby dźwięk nie przeszkadzał użytkownikowi w korzystaniu z aplikacji. Dlatego musieliśmy wybrać częstotliwość dźwięku, tak, aby nie był on słyszalny dla człowieka. Pozostał nam więc wybór pomię- dzy ultradźwiękami i infradźwiękami. Ultradźwięki w tym wypadku okazały się bardziej przydatne, ponieważ przy dużych częstotliwościach i ustalonej prędkości gestu, można zauważyć większe odchylenie od częstotliwości bazo- wej, typu 30 Hz. Natomiast w przypadku infradźwięków jest to wiele mniej niż 1 Hz. Dlatego zwierzęta, jak na przykład nietoperze w swojej echolokacji, wykorzystują właśnie ultradźwięki. Zauważmy przy okazji, że z tego powodu używanie aplikacji w pobliżu zwierząt, nie tylko nietoperzy, może być dla nich niebezpieczne. Spowodowane jest to tym, że zwierzęta mają wyższą granicę słyszalnych częstotliwości. Dla człowieka jednak dźwięki rozpoczynające się od 20 kHz są już niesłyszalne. Jak pokazują poniższe obliczenia dla ultradźwięków i infradźwięków, dla tych pierwszych mamy większą różnicę pomiędzy częstotliwością nadawaną i pozorną. Zgodnie z wyprowadzonym powyżej wzorem 1.4 dla infradźwię- ków, czyli częstotliwości z zakresu 1-20 Hz, możemy obliczyć częstotliwość pozorną, dla przykładowej częstotliwości źródła f = 10 Hz

f (^) pd = f

c cv

≈ 10_._ 0292 Hz (1.5)

Gdzie f (^) pd oznacza częstotliwość odbitą od ręki poruszającej się w dół. We wzorze przyjęliśmy typową prędkość ruchu ręki v = 1ms i prędkość dźwięku w powietrzu c = 343ms [2]. Następnie dla częstotliwości pozornej, odbitej od ręki oddalającej się od mikrofonu mamy:

f (^) pg = f

c c + v

≈ 9_._ 9709 Hz (1.6)

Rozdział 2

Opis aplikacji rozpoznającej

gesty.

Wyprowadzony w rozdziale pierwszym wzór na dopplerowskie odchyle- nie częstotliwości posłużył nam do oceny możliwości wykorzystania dźwięku dla naszych zastosowań. Do stworzenia aplikacji, którą zaprezentujemy w ni- niejszym rozdziale bardzo mocno przyczyniła się wspomniana już publikacja o SoundWave [1]. Na samym początku najważniejszą rzeczą było eksperymentalne zbada- nie, czy da się wychwycić zmiany częstotliwości w trakcie poruszania ręką. Do tego został użyty program Audacity, w którym wygenerowaliśmy ton o czę- stotliwości 20 kHz. Ruch ręką, który będziemy testować jest to poruszenie otwartą dłonią ze złączonymi palcami, z prędkością około jednego metra na sekundę. Testy polegały na poruszaniu ręką, w której był trzymany głośnik nadający sinusoidalny ton 20 kHz, gdzie w tym samym czasie, również przy pomocy wyżej wspomnianego programu mikrofon nagrywał próbki odbie- ranego dźwięku, nadawanego przez poruszający się głośnik. Korzystając ze wzoru Dopplera wiedzieliśmy czego możemy oczekiwać. Wyniki obserwacji były obiecujące, dlatego też warto było podjąć następne, bardziej zbliżone do efektu końcowego, próby zastosowania efektu Dopplera. Dużym krokiem przybliżającym do zamierzonego celu była zamiana głośników i mikrofonu na te wbudowane w laptopie. Następnie przetestowanie za pomocą programu Audacity czy jest możliwe, aby rozróżnić ruch ręką w dół, od tego w górę. Okazało się, jak widać na poniżej zamieszczonych zrzutach ekranu z tego programu, że różnica jest wystarczająco widoczna, nawet gołym okiem.

Rysunek 2.1: Bez poruszania ręką

Na powyższym rysunku przedstawiona jest analiza częstotliwościowa ode- branego tonu 20 kHz. Widoczny jest on z prawej strony jako słupek wystający z tła składającego się z szumu.

Rysunek 2.2: Ruch ręki w górę

Rysunek 2.4: Tabela natężenia częstotliwości najbliższych tonowi głównemu.

Rysunek 2.5: Tabela natężenia częstotliwości najbliższych tonowi głównemu. Rysunek 2.6: Tabela natężenia częstotliwości najbliższych tonowi głównemu. W Tabelach 2.4, 2.5 i 2.6 są wielkości dla odpowiednich Rysunków 2.1,

  • Wstęp
  • 1 Wykrywanie gestów, zjawisko Dopplera.
  • 2 Opis aplikacji rozpoznającej gesty.
  • Bibliografia
  • 19897 -79, częstotliwość Hz decybele dB (w ujemnej skali)
  • 19918 -80,
  • 19940 -78,
  • 19961 -64,
  • 19983 -43,
  • 20004 -40,
  • 20026 -48,
  • 20047 -70,
  • 20069 -76,
  • 19897 -47, częstotliwość Hz decybele dB (w ujemnej skali)
  • 19918 -45,
  • 19940 -51,
  • 19961 -63,
  • 19983 -44,
  • 20004 -40,
  • 20026 -49,
  • 20047 -75,
  • 20069 -75,
  • 19897 -75, częstotliwość Hz decybele dB (w ujemnej skali)
  • 19918 -74,
  • 19940 -74,
  • 19961 -68,
  • 19983 -54,
  • 20004 -51,
  • 20026 -59,
  • 20047 -65,
  • 20069 -64,

jest ustalony jako 0 dB. Kolejnym etapem podczas konstruowania programu było opanowanie do- stępu do danych pochodzących z wejścia i wychodzących na wyjście audio w komputerze. Potrzebna była możliwość włączenia na stałe niezbędnego tonu podstawowego, oraz odbioru w czasie rzeczywistym, strumienia pró- bek z mikrofonu. Do obu tych czynności wykorzystaliśmy następujące bi- blioteki języka Python: pyaudio, pygame i winsound. Dzięki temu powstał program, który można wykorzystać na komputerach z różnymi systemami operacyjnymi. Częstotliwość tonu podstawowego została wybrana na posta- wie omówionych w rozdziale pierwszym przesłanek. Aby efekt przesunięcia dopplerowskiego był jak najłatwiej wykrywalny częstotliwość powinna być jak największa. Nadawany dźwięk winien być też poza zakresem słyszalno- ści, co łącznie wyklucza infradźwięki. Z drugiej strony częstotliwość nie może być zbyt wysoka, żeby mogła być przetwarzana przez tory audio różnych komputerów. Próby przeprowadzone na kilku komputerach potwierdziły, że częstotliwość 20 kHz jest dla nas odpowiednia do zastosowania. Należało też wziąć pod uwagę prędkość wykonywanych gestów. Okazuje się, że ruch dłonią z prędkością 1 metra na sekundę jest stosunkowo naturalny dla człowieka, ale i możliwy do wykrycia, jak widać na rysunkach 2.2 i 2.3. Pokazują one sy- gnał po odbiciu od dłoni poruszającej się z taką właśnie, typową, prędkością. Zauważmy dodatkowo, że program może napotkać problemy w przypadku zbyt wolnych i zbyt szybkich ruchów. Eksperymenty wykazały jednak, że za- kres szybkości wykrywanych prawidłowo ruchów jest zupełnie wystarczający w praktyce. Poruszanie ręką zbyt wolno, mogłoby wpłynąć na to, iż nie uda- łoby się nam zauważyć, subtelnej wówczas, różnicy w częstotliwości pozornej. Jednocześnie zbyt szybki ruch może być zbyt uciążliwy, a nawet niebezpiecz- ny zarówno dla użytkownika jak i dla sprzętu. Dla zbadania prędkości ręki użyliśmy początkowo wzoru Dopplera 1.4. Dzięki analizie spektralnej, przed- stawionej na Rysunkach 2.1 - 2.3 oraz opisanej w Tabelach 2.1 - 2.3, pocho- dzących z programu Audacity możemy odczytać jaką częstotliwość pozorną otrzymaliśmy przy wykonywaniu gestów ręką. Dlatego po przekształceniu wzoru Dopplera ze względu na szukaną przez nas prędkość ręki, poruszającej się zgodnie do rozchodzącej się fali akustycznej, otrzymamy:

f (^) pd = f

c cv

vd = c

f c f (^) pd

m s

Natomiast dla gestu ręką poruszającą się zgodnie z kierunkiem fali dźwięko-

11 import time # funkcje daty i czasu 12 from sys import platform as _platform # modu ł do rozdzielania funkcji do r ó ż nych system ó w operacyjnych 13 if _platform == " win32 " : 14 import winsound 15 16 pyautogui. FAILSAFE = False # funkcja wy ł ą czaj ą ca bezpieczne wsp ó ł dzia ł anie symulacji z ruchami prawdziwej myszy 17 18 global flaga 19 global opoznienie 20 global mysz 21 mysz = 22 opoznienie = 23 flaga =1 # flaga do wy ł ą czenia programu i wyj ś cia z p ę tli 24 25 class odtwarzacz () : 26 def init ( self , interval =1) : 27 self. interval = interval 28 watek = threading. Thread ( target = self. run , args =() ) 29 watek. daemon = True 30 watek. start () 31 32 def run ( self ) : 33 if _platform == " linux " or _platform == " linux2 " : 34 cz_bazowa , cz_probkowa , okres = 20000 , 44100 , 24000000 # cz ę stotliwo ś ć 20 kHz , pr ó bkowanie 44 ,1 kHz , czas trwania 10 min. 35 kanal = 1 36 pg. mixer. pre_init ( channels = kanal , frequency = cz_probkowa ) 37 pg. init () 38 global sound 39 def loop () : 40 sinusoida = (2**15 - 1) * np. sin (2.0 * np. pi * cz_bazowa * np. arange (0 , okres ) / float ( cz_probkowa ) ) 41 tab_dzwiek = np. array ( sinusoida , dtype = np. int16 ) 42 global dzwiek 43 dzwiek = pg. sndarray. make_sound ( tab_dzwiek ) 44 dzwiek. set_volume (0.5) 45 while (1) : # p ę tla odtwarzajaca minut ę d ź wi ę ku 20 kHz 46 loop () 47 dzwiek. play () 48 time. sleep ( okres / float ( cz_probkowa ) ) 49 elif _platform == " win32 " :

50 while (1) : 51 winsound. Beep (20000 ,600000) # d ź wi ę k o cz ę stotliwo ś ci 20 kHz trwaj ą cy 10 min. 52 53 odtwarzacz () # uruchomienie odtwarzacza d ź wi ę ku 54 55 nfft = 512 # wielko ś ć okna , czyli ilo ś ć cz ę stotliwo ś ci pomi ę dzy -22 kHz , a 22 kHz , testowane dla 512 i 1024 56 rozmiar_bufora = 4* nfft # bufor 57 format = pyaudio. paInt16 # format wej ś ciowy sygna ł u 58 kanaly = 2 # mikrofon dwukana ł owy 59 czestotliwosc = 44100 # cz ę stotliwo ś ć pr ó bkowania 60 61 global A ,B ,C , H 62 A =483* nfft /512+5(( nfft /512) -1) # pocz ą tek tablicy tymczasowej 63 B =493 nfft /512 -5(( nfft /512) -1) # koniec tablicy tymczasowej 64 C =315 nfft /512 -5(( nfft /512) -1) # miejsce do odczytu kla ś ni ę cia 65 H =( int ) ( nfft /512) - 66 67 mikrofon = pyaudio. PyAudio () 68 max_y = 2.0*( mikrofon. get_sample_size ( format ) 8 -1) - 69 70 strumien = mikrofon. open ( format = format , 71 channels = kanaly , 72 rate = czestotliwosc , 73 input = True , 74 frames_per_buffer = rozmiar_bufora ) 75 def program () : 76 N = max ( strumien. get_read_available () / nfft , 1) * nfft 77 dane = strumien. read ( N ) 78 _# X = 1.0 np. arange ( - nfft /2+1 , nfft /2) / nfft * czestotliwosc_ 79 y = np. array ( struct. unpack ( " % dh " %( N * kanaly ) , dane ) ) / max_y 80 y_L = y [::2] 81 y_P = y [1::2] 82 Y_L = np. fft. fft ( y_L , nfft ) 83 Y_P = np. fft. fft ( y_P , nfft ) 84 Y = abs ( np. hstack (( Y_L [ - nfft /2: -1] , Y_P [: nfft /2]) ) ) 85 global A , B 86 tmp = Y [ A : B ] 87 maksimum = np. where ( tmp == tmp. max () ) 88 maks = tmp [ maksimum [0][0]] 89 M = maksimum [0][0]