DSP dla kaûdego (cz. 3.) ------------------------ ÎYK MATEMATYKI Swobodne projektowanie i programowanie "czego dusza zapragnie" wymaga sporej wiedzy i praktyki. Niestety, ûeby móc zaszaleê, trzeba najpierw trochë przysiâôê faîdów, co moûe jest na poczâtku nieco nudnawe, ale gwarantuje wspaniaîe wyniki. A wiëc pora na kolejnâ porcjë bitów. William Mobius Zrobienie efektów typu "blur" czy "smooth" w rysunkach, czy teû "zamglenie" dúwiëku to w istocie zmniejszenie zawartoôci wyûszych czëstotliwoôci w sygnale. Uzyskanie tego metodami cyfrowymi wymaga wczeôniejszej zamiany sygnaîu na takâ wîaônie postaê -- postaê cyfrowâ. W rezultacie otrzymujemy dane, które w zaleûnoôci od rodzaju (grafika, dúwiëk) tworzâ zbiór, czyli >ciâg liczb<. Teraz wprowadzimy sobie parë oznaczeï tak, aby w dalszej czëôci kaûdy Czytelnik z prawidîowo rozwiniëtym intelektem mógî pojâê, o co chodzi. Oznaczymy zbiór, czyli ciâg danych wejôciowych (np. zbiór próbek dúwiëku), jako: x(i) Moûna sobie to porównaê z rysunkami 1. i 3. w pierwszej czëôci cyklu. Zauwaûymy, ûe nastâpiîa zmiana oznaczenia: x(n) na: x(i). Otóû symbol "n" przyjâî sië w literaturze dla ogólnego oznaczania numeru próbki, ale symbole typu: "i", "j", "k" "l" i podobne sâ praktyczniejsze, gdyû przydajâ sië przy programowaniu. Interpretacja tego jest doôê prosta, jako ûe osobom programujâcym w jëzykach wyûszego poziomu nieodparcie kojarzy sië z >jednowymiarowâ< tablicâ liczb. Oznacza to teû, ûe bez kîopotu moûemy róûnorakie algorytmy i wzory matematyczne zamieniaê od razu na programy dla komputera. Jest tu, co prawda, kilka wyjâtków, chociaûby jëzyk C, w którym zamiast tego moûemy uûyê tzw. wskaúników, ale aby nie zaciemniaê tekstu, pominiemy tu te sprawy. Tablica oznaczona jako x(i) ma zdefiniowanâ dîugoôê oznaczanâ zazwyczaj "N", co jest jednoczeônie dîugoôciâ próbki dúwiëkowej. W programach komputerowych wygodniej oznaczaê to jako "n", poniewaû wiëkszoôê jëzyków nie dopuszcza nazw dla zmiennych oznaczanych jednoczeônie duûymi i maîymi literami. Wprowadúmy teû symbol "q", który bëdzie oznaczaî liczbë bitów okreôlajâcych dokîadnoôê odwzorowania poziomów sygnaîu, czyli rozdzielczoôê poziomów, oraz symbol "Ql", okreôlajâcy wîaôciwâ liczbë poziomów. Te dwie dane sâ ze sobâ ôciôle zwiâzane za pomocâ zaleûnoôci: Ql=2^q Oznacza to, ûe np. przy 8 bitach liczba poziomów bëdzie wynosiîa 256. Poglâdowe przedstawienie przykîadowego zbioru danych przedstawia rys. 1. Mamy tam sampel skîadajâcy sië z 34 liczb, czyli n=34 oraz q=3, Ql=8. Jeden rzut oka wystarczy na zorientowanie sië, na czym rzecz polega. Jeûeli napiszemy wiëc: a=x(5) to odczytujemy po prostu zawartoôê piâtej komórki w tablicy, którâ kopiujemy do zmiennej "a". Moûna teû przyjâê konwencjë typu 0..n-1 (liczenie próbek od zera) i wtedy odczytanie tej konkretnej wartoôci wyglâda, rzecz jasna, tak: a=x(4) Nieco inaczej sprawa wyglâda z danymi graficznymi. W tym wypadku mamy bowiem szerokoôê i wysokoôê (pîaszczyznë). Wygodnie wiëc zapisywaê obrazek jako tablicë >dwuwymiarowâ<: x(k,l) gdzie: x -- nazwa tablicy; k -- numer komórki (szerokoôê obrazu); l -- numer komórki (wysokoôê obrazu). Teraz caîkowita liczba danych w poziomie oznaczana jest jako "m", natomiast caîkowita liczba danych w pionie jako "n". Analogiczne odczytanie wartoôci takiej tablicy wymaga podania dwóch wspóîrzëdnych: a=x(12,35) Przedstawienie poglâdowe tego zapisu ilustruje rys. 2. W tym konkretnym wypadku mamy szesnastowartoôciowâ skalë natëûenia oraz rozdzielczoôê 24 x 50. Przy czym, podobnie jak w wypadku dúwiëku, wspóîrzëdne punktu moûna podawaê zarówno liczâc od jedynki (tak jak na rysunku): 1..m x 1..n jak i liczâc od zera: 0..m-1 x 0..n-1 W tym drugim wypadku zmienne mogâ przyjmowaê wartoôci 0..23 i 0..49. Jest to caîkowicie równowaûne i tylko od programisty zaleûy, jakiej konwencji bëdzie uûywaî. Teraz trochë skomplikujemy zapis, gdyû napiszemy: a=x(i-1) Cóû oznacza taki zapis i czy ma sens matematyczny? Popatrzmy na rys. 3. Widaê tam kawaîek sampla oraz krótki programik. Przeanalizujmy go. Jak widaê, program pobiera osiem kolejnych wartoôci i wpisuje do tablicy o nazwie "x". Zaraz potem wypisuje numer komórki w tablicy oraz zawartoôê tej komórki, a takûe... no wîaônie. Po uwaûnym przyjrzeniu sië wynikom (co widaê po prawej stronie) moûemy zauwaûyê, ûe przy danym "i" w skrajnie prawej kolumnie powtarza sië zapis lewej kolumny, lecz >cofniëty< o jednâ wartoôê. Ciekawa sprawa wystëpuje przy i=1. Wtedy index "i-1" pokazuje na komórkë tablicy, której teoretycznie nie ma, a wiëc program powinien sië zatrzymaê i wyôwietliê bîâd. Jednak na ogóî jëzyki wysokiego poziomu dopuszczajâ istnienie komórki tablicy o numerze zero. A poniewaû nic tam nie zostaîo umieszczone, pierwszâ odczytanâ wartoôciâ jest zero. Do czego moûna te dziwne obliczenia wykorzystaê, o tym w nastëpnym odcinku.