X4L - wzmacniacz z DSP z serii X
Biznes „nagłośnieniowy” – w porównaniu z innymi dziedzinami techniki (np. przemysłem samochodowym, czy ...
Każdy z nas mniej więcej orientuje się, jakie zalety i wady ma praca w dziedzinie cyfrowego przetwarzania dźwięku.
Bezspornym faktem jest to, że w dzisiejszych czasach dokonanie i zmiksowanie zupełnie przyzwoicie brzmiącego nagrania jest osiągalne dla „zwykłego śmiertelnika”, dysponującego przeciętnym komputerem z przeciętnym interfejsem audio, kilkoma dobrymi mikrofonami i jeszcze paroma drobiazgami (no i przede wszystkim dobrym słuchem oraz pewnymi umiejętnościami, czego jednakże za żadne pieniądze kupić się nie da).
Również w dziedzinie nagłośnienia pozostało już niewielu zagorzałych fanów mikserów analogowych, którzy w swoich riderach piszą „no digital mixer”.
Technika cyfrowa jest tak obszernym i tak skomplikowanym tematem, iż można jej poświęcić kilka książek, a i tak wszystkiego się nie opisze. Inna sprawa, że dla przeciętnego użytkownika cyfrowych urządzeń i tak pozycja taka była by totalnie niestrawna. Warto jednak znać kilka podstawowych pojęć z tej dziedziny i wiedzieć, choćby w bardzo ogólnej formie, czym różni się procesor stałoprzecinkowy od zmiennoprzecinkowego, na czym polega próbkowanie, a na czym kwantowanie itp.
Na początek wyjaśnijmy sobie najważniejszą rzecz – na czym polega różnica między sygnałem analogowym a cyfrowym? Skąd się wzięły te nazwy? Otóż sygnał analogowy jest odwzorowaniem przebiegu zmian parametrów fizycznych (ciśnienia, prędkości akustycznej) przez sygnał elektryczny (napięcie, natężenie prądu). Nazwa „sygnał analogowy” wzięła się stąd, iż w „zamierzchłych” czasach, kiedy jeszcze nie istniały komputery cyfrowe (tak, tak, sporego grona Czytelników nie było wtedy jeszcze na świecie), wszelkie obliczenia wykonywały maszyny wielkości szafy trzydrzwiowej, zbudowane z setek lamp elektronowych, a potem tranzystorów i diod. Wszelkie operacje wykonywały układy różniczkująco-całkujące, komunikujące się ze sobą ze sobą za pomocą staromodnych kabli połączeniowych, używanych w telekomunikacji. W taki sposób ciągłe napięcie lub prąd w rzeczywistym obwodzie były analogowe do pewnej zmiennej w równaniu różniczkowym, takiej jak prędkość, temperatura, ciśnienie powietrza itp. Sygnał analogowy jest więc określony w każdej chwili czasu i może przyjmować dowolne wartości w danym zakresie. Dlatego też nazywany jest często sygnałem ciągłym.
Następnym krokiem w kierunku „cyfryzacji” sygnału jest proces próbkowania (nieco więcej o tym za moment). W dalszym ciągu sygnał taki może przybierać dowolne wartości, ale jest określony tylko w tych konkretnych chwilach czasowych, których umiejscowienie na osi czasu jest zależne od częstotliwości próbkowania. Otrzymujemy więc sygnał zwany w literaturze sygnałem o czasie dyskretnym (nie chodzi tu o dochowanie tajemnicy, ale właśnie o fakt określenia wartości sygnału tylko w pewnych „dyskretnych” punktach osi czasu). Taki sygnał nie naddaje się jednak do tego, aby procesor mógł go „strawić”. Musimy dokonać również operacji kwantyzacji, która spowoduje, że wartość sygnału przybierze również określone wartości. Oznacza to, że dopuszczamy tu do powstawania pewnego błędu w przetwarzaniu, który możemy minimalizować przez zmniejszenie szerokości przedziałów kwantowania (czyli zmniejszeniu wysokości „schodków”), jednakże nigdy nie uda nam się zlikwidować go całkowicie.
A więc jest, nasz upragniony, długo oczekiwany, najprawdziwszy z prawdziwych sygnał cyfrowy! I cóż się okazuje? O ile sygnał analogowy był przebiegiem, z obserwacji którego (przy odrobienie umiejętności i znajomości tematu) możemy określić pewne cechy tego sygnału, o tyle sygnał cyfrowy to po prosty nudny, monotonny ciąg cyfr, i to w dodatku w kodzie dwójkowym, dla normalnego Europejczyka równie wymowny jak „Baśnie tysiąca i jednej nocy” w oryginalnej wersji językowej (dla niewtajemniczonych – po arabsku). W ten prosty sposób doszliśmy, dlaczego tak trudno dogadać się człowiekowi z komputerem. On po prostu „myśli” w zupełnie innym języku – swoją drogą, o wiele łatwiejszym od ludzkiego, bo operującym tylko dwoma znakami – „0” i „1”. Symbole „0” i „1” odpowiadają po prostu różnym poziomom napięć, np. „0” odpowiada napięciom w zakresie 0-0,8 V, „1” odpowiada np. napięciom w granicach 4-5 V.
Podstawowymi zaletami zmiennych binarnych są:
–– łatwość ich generowania
–– pewność transmisji
–– łatwość ich zapamiętywania (zapisywania na nośnikach)
–– prostota układów realizujących operacje logiczne i arytmetyczne na zmiennych binarnych.
Otaczający nas świat jest jednak opisany zmiennymi o znacznie bardziej złożonej strukturze aniżeli zmienne binarne, musimy zatem symbole przedstawiające te zmienne kodować za pomocą uporządkowanych zbiorów symboli zer i jedynek.
Oczywiście nie chodzi mi o Komitety Obrony Demokracji, ale o kody, którymi posługujemy się my, ludzie, i te, których używają komputery. Kod dziesiętny (ludzki) składa się z 10 cyfr – od 0 do 9. Jeśli „idziemy” od 0 wzwyż, dochodzimy do 9, i w kolejnym kroku (czyli dodając kolejną jedynkę) wskakuje nam znowu 0, a na pozycji wyżej pojawia się 1, jako pierwsza dziesiątka. I tak dalej, aż do 99, i znowu te pozycje nam się zerują, a pojawia się 1 przed nimi jako określenie setek, potem tysięcy, milionów itd.
Z kodem binarnym (komputerowym) jest podobnie, z tym że tam ten przyrost kolejnych pozycji „w górę” odbywa się o wiele szybciej. Kiedy po zerze pojawi się jedynka zaraz potem zeruje nam się ona, a „wskakuje” jedynka „oczko wyżej” i tak dalej. Może przykład, będzie łatwiej. Rozpiszmy sobie, jak się ma pierwsze 15 cyfr kodu dziesiętnego do binarnego:
Widać więc, że w zależności od ilości pozycji w kodzie binarnym możemy określić ile liczb kodu binarnego nam się ”zmieści”. W przypadku czterech pozycji możemy opisać 16 cyfr (od 0 do 15), dla pięciu pozycji już 32, dla ośmiu – 256, a dla szesnastu – 65.536 itd.
Pojedynczy znak binarny nazywa się bitem. Osiem bitów tworzy bajt (ang. byte). Pomiędzy tym jest jeszcze ciąg czteroelementowy, czasami zwany kęsem BCD. I dalej, szesnaście bitów tworzy słowo 16-bitowe, 32 – słowo 32-bitowe itd.
Duże zbiory informacji byłyby mało czytelne, gdyby trzeba było powiedzieć, że plik dźwiękowy ma rozmiar 684752158 bajtów. Dlatego, jak w normalnym życiu, stosuje się przedrostki: kilo (k), mega (M) i giga (G), z tym że 1 kilobajt to nie 1.000 bajtów, ale 1.024 (210 bajta). Tak samo przedrostek mega nie oznacza 1.000.000 ale 1024*1024, czyli 1.048.576, no i giga to 1024*1024*1024.
Przedstawiony tu kod binarny nazywany jest kodem binarnym prostym. Istnieją jeszcze pewne odmiany kodów binarnych, każdy bazujący tylko na ciągu „0” i „1”, ale sposób ich organizacji w całym ciągu jest różny dla różnych kodów. Są to np. kody dwójkowo-dziesiętne (kody BCD – ang. Binary Coded Decimal), kod uzupełnień do dwóch (U2 – najbardziej rozpowszechniony w operacjach arytmetycznych), kod Graya. Mamy też kody detekcyjne, służące do wykrywania przekłamań i błędów transmisji, oraz kody korekcyjne, do zadań których należy naprawianie tychże błędów, aby na wyjściu otrzymać prawidłowy, niezniekształcony sygnał cyfrowy. Nie będziemy jednak sobie nimi głowy zawracać, bo to już wyższa szkoła jazdy, do niczego nam zupełnie niepotrzebna w naszej codziennej pracy realizatorów.
Pod tym tajemniczym hasłem kryje się kilka zdań na temat formatu danych numerycznych. Często spotkać można w literaturze sformułowanie typu: „...wyposażony w procesor operujący na danych zmiennoprzecinkowych...”, albo po prostu „procesor zmiennoprzecinkowy”. Rozróżniamy następujące formaty danych numerycznych:
Liczby stałoprzecinkowe (stałopozycyjne).
Istotą tego formatu jest umownie ustalone (tzn. istniejące tylko w świadomości programisty) położenie przecinka między bitami „całości” a „ułamków”. Zaletami liczb stałoprzecinkowych są:
–– duża szybkość realizacji operacji arytmetycznych
–– duża łatwość konwersji kodu
–– duża dokładność przedstawiania liczby dziesiętnej
–– powszechność stosowania tego formatu w układach wejść i wyjść analogowych.
Wadą liczb stałoprzecinkowych jest:
–– konieczność aktualizacji i wyrównania współczynników skalowych,
–– konieczność korekcji przepełnienia arytmetycznego
Zdając sobie sprawę z tego, że ostatnie dwa punkty zasadniczo są równie pasjonujące, jak zestawienie rocznej produkcji roślin motylkowych na białostocczyźnie (z całym szacunkiem do tego pięknego regionu), nie będę rozwijał tego tematu. Poprzestańmy na tym, że są to dość kłopotliwe uciążliwości, które spowodowały, że w bardziej zaawansowanych systemach stosuje się
Liczby zmiennoprzecinkowe.
Liczba taka składa się z dwóch liczb binarnych:
–– K-bitowego ułamka M, zwanego mantysą
–– L-bitowej liczby całkowitej W, będącej wykładnikiem potęgowym. Odpowiada jej liczba dziesiętna X = M * 2W.
Dużą zaletą liczb zmiennoprzecinkowych jest radykalne uproszczenie programowania w stosunku do liczb stałoprzecinkowych. Do wad należy zaliczyć mniejszą dokładność przedstawiania liczby dziesiętnej oraz mniejszą szybkość operacji arytmetycznych.
Jest to proces odwracalny (to bardzo istotne stwierdzenie), polegający na zamianie sygnału ciągłego o czasie ciągłym na ciąg próbek odpowiadających wartościom sygnału ciągłego, odczytywanych w określonych, z góry ustalonych chwilach czasu. Z matematycznego punktu widzenia sygnał spróbkowany jest iloczynem sygnału oryginalnego i funkcji próbkującej. W idealnym przypadku pobieranie próbek odbywa się w nieskończenie krótkim okresie czasu. W rzeczywistości nie ma czegoś takiego, jak „nieskończenie krótki czas”, a więc potrzeba pewnego okresu czasu na odczytanie i zarejestrowanie wartości sygnału – co już powodować będzie pewne problemy i powstawanie błędów konwersji.
Jak już wspomniałem, sygnał spróbkowany jest w 100% odwracalny, pod warunkiem że nie występują w trakcie przetwarzania błędy. Wiemy już, że tak kolorowo nie ma – błędy są i będą. Można je jednak podzielić na takie, których możemy się ustrzec, i takie, których do końca nie jesteśmy w stanie wyeliminować (możemy je jedynie minimalizować). Do tych pierwszych zaliczyć możemy zjawisko aliasingu.
Jeśli zapytamy kogoś „z branży”, co to jest aliasing, to na 90% odpowie, że jest to nakładanie się widm. I jest to fakt bezsporny, co bardzo dobrze uwidacznia się, jeśli narysujemy to sobie na wykresie częstotliwościowym. Próbkowanie powoduje powstawanie kopii widma próbkowanego sygnału, oddalonych od siebie o odległość równą częstotliwości próbkowania. Jeśli jednak będziemy zmniejszać częstotliwość próbkowania, to w pewnym momencie dojdziemy do takiej sytuacji, w której widma zaczną się stykać ze sobą. Dalsze zaś zmniejszanie tej częstotliwości spowoduje, że widma zaczną nachodzić na siebie, powodując, że w tym zakresie wspólnym nie jesteśmy w stanie określić jaką wartość przyjmie sygnał. To jest właśnie aliasing, co doskonale pokazuje rysunek.
Można też na to spojrzeć inaczej, od strony czasowej. Jeśli mamy dane próbki i ktoś poprosi nas o wykreślenie pomiędzy nimi przebiegu sinusoidalnego, to jeden wykreśli przebieg taki, jak narysowany grubszą linia na rysunku obok, ale ktoś inny może narysować ten przebieg w taki sposób, jak linią cieńszą.
Oznacza to, że nie możemy bez niejednoznaczności określić częstotliwości tego przebiegu jedynie na podstawie wartości próbek, bez dodatkowych informacji. To tak, jakby ktoś zapytał nas: „jeśli wynikiem dodawania dwóch liczb jest liczba cztery, to jaki są te dwie liczby?” Ile ludzi, tyle może być par tych liczb (zakładająć, iż możemy wybierać ze zbioru liczb rzeczywistych – w przypadku liczb naturalnych mamy tylko 3 kombinacje). Podobnie jest z próbkowaniem. Jeszcze jaśniejsze to się stanie jeśli wrócimy znów do wykresów w funkcji częstotliwości i zobaczymy, że dany ciąg próbek może odpowiadać częstotliwości zarówno 1 kHz albo 7 kHz, ale też i 13 kHz, 19 kHz itd.
Aby pozbyć się takich niejednoznaczności, a także uniknąć nakładania się widm, musimy określić jaki zakres częstotliwości nas interesuje, czyli zastosować filtrację dolnoprzepustową. Filtr taki nosi nazwę filtru antyaliasingowego. Zgodnie więc z twierdzeniem o próbkowaniu, zwanym też twierdzeniem Shanona-Kotielnikowa, częstotliwość próbkowania powinna być co najmniej dwa razy większa od największej składowej widma sygnału przetwarzanego (często mówi się też o tzw. kryterium Nyquista, mówiącym dokładnie to samo). Jeśli więc mamy do przetworzenia sygnał audio w zakresie słyszalnym dla ludzi, czyli w paśmie od 20 Hz do 20 kHz, wystarczy, że będziemy próbkować z częstotliwością 40 kHz (ale zawsze lepiej mieć ten margines, żeby widma nie stykały się ze sobą, stąd np. popularna częstotliwość próbkowania fs = 44,1 kHz), pod warunkiem wszakże, że wcześniej zastosujemy filtr antyaliasingowy, obcinający nam pasmo przy 20 kHz. Ktoś mógłby zapytać: po co ten filtr, skoro i tak powyżej tego pasma nie ma nic, co nas interesuje? Owszem, ale trzeba zwrócić uwagę, że próbkowanie powoduje powielanie widma, a więc to, co nawet jest daleko, daleko poza pasmem nas interesującym, i tak znajdzie się w paśmie „roboczym”.
Cała teoria próbkowania doskonale się sprawdza, jeśli wyjdziemy z założenia, że czas pobierania próbki jest zerowy, co niestety nie jest zgodne z rzeczywistością. Zatem nie mamy do czynienia z ciągiem impulsów delta o zerowym czasie trwania, tylko z falą prostokątną o niezerowym współczynniku wypełnienia.
Na powielenia widma sygnału będzie nakładać nam się widmo okna prostokątnego, które ma postać funkcji sinc x. To powoduje powstawanie zniekształceń w wynikowym sygnale cyfrowym. Zniekształcenia te nazywa się zniekształceniami apertury (niezerowego czasu pobierania próbki). Skutki tego są, niestety, trudne do wyeliminowania, ponieważ nawet jeśli ograniczymy czas pobierania próbki do minimum, to i tak konieczne jest „zamrożenie” sygnału w fazie pamiętania, co umożliwi prawidłową pracę kwantyzera. Należy więc minimalizować ten czas przetwarzania sygnału przez konwerter analogowo-cyfrowy, a poza tym skutkom tego błędu możemy przeciwdziałać, wprowadzając filtr korygujący zniekształcenia typu sinc x.
Innym rodzajem błędów próbkowania jest efekt niestabilności częstotliwości próbkowania, czyli tzw. jitter. W praktycznych układach proces próbkowania jest synchronizowany zegarem kwarcowym, jednakże mogą wystąpić takie sytuacje (jak np. stany przejściowe związane z konwersją formatów), w których trzeba uwzględnić to zjawisko. Słyszalnym efektem jittera jest wzrost szumów, nawet o kilka dB.
Marian Ortyl