Wstep: Różnice pomiędzy wersjami

Z Brain-wiki
 
(Nie pokazano 85 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
 +
==[[Analiza_sygnałów_-_wykład|⬆]] Próbkowanie sygnałów analogowych==
 +
Sygnały zapisujemy, przetwarzamy i analizujemy w postaci ciągów liczb. Przejście od sygnału ciągłego do cyfrowego odbywa się przez proces próbkowania, czyli zapisywania kolejnych amplitud sygnału w ustalonych, stałych odstępach czasu,  [[TI/Cyfrowy_świat|omawiany wcześniej na TIiK]].
  
 +
[[Plik:AD.png|220px|bezramki]]
 +
<!--Ciągły sygnał z górnego rysunku, po próbkowaniu w punktach symbolizowanych czarnymi kropkami na rysunku dolnym, na dysku zostaje zapisany jako ciąg liczb:-->
 +
102, 195, 80, 16, 147, 178
  
 +
Żeby odtworzyć fizyczne własności sygnału, czyli narysować zapisane wartości próbek w odpowiedniej skali, musimy znać ''częstość próbkowania'' i ''stałą kalibracji''.
  
[[Plik:wstep_rys_3.jpg|thumb|center|600px|alt=próbkowanie zmienia ciągłys sygnał| <figure id="fig:8"></figure> Próbkowane z częstością 1 oscylacje o częstościach ''f'', od góry: 1,3, 1, 0,5 i 0,3.
+
Wyrażana w hercach (Hz) częstość próbkowania (ang. ''sampling frequency'', <math>f_s</math>) to liczba próbek na sekundę. Jest ona odwrotnością odstępu w czasie między kolejnymi próbkami (<math>\Delta t</math>):
Sinusa o częstości 0,3 można odtworzyć dokładnie z samych wartości dyskretnych (kropki),
+
<div align = "center>
podobnie dla granicznej częstości 0,5. Natomiast próbkowane z tą samą częstością szybsze
+
<math>f_s = \dfrac{1}{\Delta t}</math>
oscylacje wprowadzają przekłamania &mdash; widoczna na samej górze oscylacja o częstości 1,3
+
</div>
daje w chwilach próbkowania wartości ''dokładnie takie same''  jak sygnał na dole.
 
Zjawisko to nosi nazwę ''aliasingu''  ([[STAT:Klasyczna#Przekszta.C5.82cenie_Fouriera_sygna.C5.82.C3.B3w_dyskretnych.2C_aliasing | porównaj)]].]]
 
  
 +
Stała kalibracji to współczynnik, przez który mnożymy zapisane liczby, żeby otrzymać wartości w jednostkach fizycznych, na przykład mikrowoltach.
  
 +
Oczywiście musimy też wiedzieć, w jakim formacie zapisano na dysku liczby (formaty omawialiśmy na wykładzie o [[TI/Zera_i_jedynki|binarnych reprezentacjach liczb]]), oraz, w przypadku sygnałów wielozmiennych o jednolitym próbkowaniu, znać liczbę kanałów. Taka dodatkowa informacja (metainformacja) jest konieczna do poprawnego wyświetlenia danych z pliku, w którym zapisano dane wielokanałowe, jak np. kilka odprowadzeń EEG lub dane kilku spółek giełdowych, próbkowane i zapisywane w jednakowych odstępach czasu.
  
 +
[[Plik:WakeEEG Svarog 3chans.png|1200px|bezramki]]
 +
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
 +
| <strong>Informacje o częstości próbkowania, stałej kalibracji, liczbie i nazwach kanałów itp. to metainformacja, klucz do poprawnego odczytu i intepretacji zapisanych liczb.</strong>
 +
|-
 +
|Zawartość pliku "wakeEEG.xml", zawierającego metainformację określającą sposób wyświetlania i opisu liczb zawartych w pliku "wakeEEG.bin" według formatu opracowanego na WF UW w programie Svarog:
 +
<pre>
 +
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 +
<rs:rawSignal xmlns:rs="http://signalml.org/rawsignal">
 +
  <rs:exportFileName>moto128.bin</rs:exportFileName>
 +
  <rs:sourceFileName>durka_moto3.bin</rs:sourceFileName>
 +
  <rs:sourceFileFormat>
 +
    <rs:rawSignalInfo/>
 +
  </rs:sourceFileFormat>
 +
  <rs:samplingFrequency>128.0</rs:samplingFrequency>
 +
  <rs:channelCount>20</rs:channelCount>
 +
  <rs:sampleCount>20480</rs:sampleCount>
 +
  <rs:sampleType>FLOAT</rs:sampleType>
 +
  <rs:byteOrder>LITTLE_ENDIAN</rs:byteOrder>
 +
  <rs:pageSize>20.0</rs:pageSize>
 +
  <rs:blocksPerPage>1</rs:blocksPerPage>
 +
  <rs:eegSystemName>
 +
    <rs:eegSystemSymbol>EEG 10_20 Cap19</rs:eegSystemSymbol>
 +
    <rs:eegSystemType>adults</rs:eegSystemType>
 +
  </rs:eegSystemName>
 +
  <rs:channelLabels>
 +
    <rs:label>Fp1</rs:label>
 +
    <rs:label>Fp2</rs:label>
 +
    <rs:label>F7</rs:label>
 +
    <rs:label>F3</rs:label>
 +
    <rs:label>Fz</rs:label>
 +
    <rs:label>F4</rs:label>
 +
    <rs:label>F8</rs:label>
 +
    <rs:label>T7</rs:label>
 +
    <rs:label>C3</rs:label>
 +
    <rs:label>Cz</rs:label>
 +
    <rs:label>C4</rs:label>
 +
    <rs:label>T8</rs:label>
 +
    <rs:label>P7</rs:label>
 +
    <rs:label>P3</rs:label>
 +
    <rs:label>Pz</rs:label>
 +
    <rs:label>P4</rs:label>
 +
    <rs:label>P8</rs:label>
 +
    <rs:label>O1</rs:label>
 +
    <rs:label>O2</rs:label>
 +
    <rs:label>FCz</rs:label>
 +
  </rs:channelLabels>
 +
  <rs:exportDate>2013-03-20T12:59:21</rs:exportDate>
 +
  <rs:calibrationGain>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
    <rs:calibrationParam>0.01</rs:calibrationParam>
 +
  </rs:calibrationGain>
 +
  <rs:calibrationOffset>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
    <rs:calibrationParam>0.1</rs:calibrationParam>
 +
  </rs:calibrationOffset>
 +
</rs:rawSignal>
 +
</pre>
 +
|}
  
===Zapis cyfrowy i korekcja błędów===
 
Aby zrozumieć, dlaczego łatwość korekcji błędów związana jest z
 
zapisem cyfrowym, przyjrzyjmy się bliżej analogowym i cyfrowym zapisom
 
dźwięku.  Na płycie analogowej dźwięk kodowany jest w zmiennym
 
wyżłobieniu rowka, w którym przemieszcza się igła gramofonu. W
 
przybliżeniu możemy wyobrazić sobie, że "podskok" igły w większym
 
wgłębieniu rowka odwzorowywany jest jako większe wychylenie membrany
 
głośnika (po zamianie w impuls elektryczny i przejściu przez
 
wzmacniacz). Tak więc wyżłobienie rowka płyty oryginalnie odwzorowuje
 
dokładnie zapisany dźwięk. Jego zarysowanie lub zabrudzenie wprowadzi
 
przy odtwarzaniu zakłócenia (zwykle trzaski).  Jednoznaczne
 
rozróżnienie, które z wyżłobień rowka winylowej płyty odzwierciedlają
 
oryginalny zapis muzyki, a które powstały skutkiem uszkodzeń, jest
 
właściwie niemożliwe, dlatego też muzyka ze starych płyt kojarzy nam
 
się z obecnością trzasków i szumu.<ref>Tak naprawdę sprawa nie
 
jest beznadziejna:
 
* część zakłócen pochodzi z zanieczyszczeń; w tym przypadku zwykle  pomaga delikatne czyszczenie płyty.
 
* Do pozostałych zakłóceń, których nie da się usunąć mechanicznie, stosuje  się potężną metodologię analizy sygnałów (będącą przedmiotem następnych  rozdziałów), która pomaga zgadnąć, które dźwięki w zapisie mogą pochodzić z  zakłóceń. Zwykle jednak nie da się usunąć dokładnie wszystkich zakłóceń bez  naruszenia brzmienia oryginału.</ref>
 
  
W przypadku zapisu cyfrowego możemy w prosty sposób ''wykryć''  fakt wystąpienie zakłóceń. Wyobraźmy sobie, że zapisujemy muzykę jako szereg liczb, opisujących amplitudę fali dźwiękowej mierzoną w ustalonych odstępach czasu (rys. <xr id="fig:9"></xr>; dla płyty kompaktowej <math>\Delta t = 1/44 100</math> sekundy).  Ponieważ urządzenie, które będzie zamieniać ten zapis z powrotem na muzykę, i tak musi być swego rodzaju specjalizowanym komputerem (odtwarzaczem
 
CD), to do programu odtwarzającego możemy wprowadzić pewną modyfikację. Umówmy się dla przykładu, że z każdych dziesięciu kolejnych liczb, do zapisu muzyki będziemy wykorzystywać tylko
 
dziewięć, a ostatnią będziemy dobierać tak, żeby suma kolejnych dziesięciu liczb zawsze wynosiła np. milion.
 
  
[[Plik:wstep_rys_4.jpg|thumb|center|600px|alt=digitalizacja sygnału analogowego|<figure id="fig:9"></figure> Od góry: ciągły (analogowy) zapis fali dźwiękowej, poniżej próbkowanie, czyli wybór chwil, w których ją mierzymy, dalej zamiana zmierzonych wartości na liczby i liczb na bity. Pasek na dole może być np. fragmentem ścieżki na płycie CD: białe pola (zera) odbijają światło lasera, a czarne (jedynki) nie.]]
+
==Aliasing i częstość Nyquista==
 +
[[Plik:Aliasing gif.gif|590px|bezramki]]
  
Taki sposób zapisu wprowadza redundancję, czyli
+
W procesie próbkowania kluczową rolę odgrywa twierdzenie o próbkowaniu (inaczej twierdzenie Nyquista-Shannona, czasem w skrócie twierdzenie Nyquista). Mówi ono, że sygnał ciągły możemy odtworzyć za zapisanych próbek, jeśli częstość próbkowania <math>f_s</math> była wyższa niż dwukrotność najwyższej z występujących w sygnale częstości <math>f_{max}</math>, nazywana częstością Nyquista <math>f_N</math>:
nadmiar informacji w zapisie, ponieważ przy prawidłowym odczycie
+
<div align = "center>
wystarczyłoby znać dziewięć kolejnych liczb, aby wyznaczyć dziesiątą
+
<math> f_s = \dfrac{1}{\Delta t} > 2* f_{max} = f_N</math>
(jako milion minus suma pozostałych dziewięciu).  Jednak jeśli
+
</div>  
wczytamy z takiego zapisu wszystkie liczby, i suma którejś dziesiątki
+
Jeśli częstość próbkowania nie była wystarczająco wysoka, nie tylko stracimy informację o zmianach amplitudy sygnału "pomiędzy próbkami", ale dojdzie też do zafałszowania sygnału w niższych częstościach, które z pozoru nie powinny być zaburzone. Efekt ten jest bliżej omówiony w rozdziale [[Aliasing]].
okaże się inna niz milion, to mamy pewność, że w tym miejscu wystąpił
 
błąd.<ref>Ale poprawna suma nie daje gwarancji, że błędu nie ma.
 
W jednej dziesiątce mogą wystąpić np. dwa jednakowe błędy o
 
przeciwnych znakach i suma pozostanie niezmieniona. Dlatego sumy
 
kontrolne liczy się w bardziej wyrafinowany sposób (np. CRC --
 
''Cyclic Redundancy Check'' ) </ref> Taka informacja jest bardzo cenna:
 
* Jeśli ''jesteśmy pewni'' , że nagły skok amplitudy w kilku kolejnych  próbkach jest wynikiem błędu zapisu, a nie efektem zamierzonym przez muzyka, to  możemy ten skok "przemilczeć", czyli np. zastąpić "popsute" próbki średnią  wartością poprzednich.
 
* Możemy zwiększyć redundancję i zapisać dwie jednakowe kopie;  jeśli uszkodzeniu ulegnie fragment pierwszej kopii, program może  automatycznie sięgnąć do odpowiedniego fragmentu drugiej  kopii<ref>Prawdopodobieństwo wystąpienia uszkodzeń w tych samych  fragmentach dwóch zapisów jest już bez porównania mniejsze niż  pojedynczego uszkodzenia. Sposobem wprowadzania nadmiarowości, który  minimalizuje prawdopodobieństwo wystąpienia takich pechowych  przypadków, rządzi dość złożona matematyka z pogranicza statystyki,  której nie będziemy tu omawiać. W każdym razie, dwie jednakowe kopie  umieszczone jedna za drugą zwykle nie okazują się rozwiązaniem  otymalnym.</ref>. 
 
* W przypadku transmisji przez modem, program może zażądać powtórnego  przesłania uszkodzonego fragmentu.
 
  
Niezależnie od tych korzyści, jeśli chcemy analizować sygnały z pomocą
+
[[Plik:Nyquist1.png|600px|bezramki]]
komputera ''(maszyny cyfrowej)'', i tak jesteśmy "skazani" na
 
pracę z ich dyskretną formą.
 
  
Mimo tego, większość ogólnych twierdzeń będziemy rozważać w
+
==Sygnał dyskretny jako wektor==
przestrzeni funkcji ciągłych &mdash; o ile nie tyczą się ''explicite''  
+
[[Plik:AD.png|mały|220px|<pre>102, 195,  80,  16, 147, 178</pre>]]
efektów próbkowania. Teoria funkcji ciągłych jest asymptotycznie
+
Skoro sygnał to po prostu ciąg liczb, możemy go potraktować jak wektor. Na płaszczyźnie wektor to para współrzędnych (''x'', ''y''), w przestrzeni trójwymiarowej trójka liczby (x, y, z), które wyobrażamy sobie jako strzałkę wiodącą od punktu (0, 0, 0) do (x, y, z). Sygnał składający się z pięciu punktów będzie wektorem w przestrzeni pięciowymiarowej, więc intuicja "strzałki" dla większości z nas przestaje być użyteczna. Pomimo tego, możemy wciąż korzystać z użytecznych pojęć z dziedziny algebry wektorów, jak ortogonalność czy iloczyn skalarny.
zgodna z wynikami dla sekwencji dyskretnych &mdash; dla odstępu próbkowania
 
dążącego do zera. Jej rezultaty, prostsze pojęciowo i łatwiejsze do
 
wyprowadzenia, są wystarczająco dokładne by wyjaśnić ogólne własności
 
dyskretnych obliczeń.
 
  
W uzasadnionych przypadkach będziemy oczywiście dyskutować efekty
 
próbkowania; w takich sytuacjach będziemy rozróżniać sygnał ciągły
 
<math>s(t)</math> od dyskretnej sekwencji <math>s[n]</math>.
 
  
[[TI:Technologia_Informacyjna/Cyfrowy_świat| Podobne tematy opisuje rozdział "Cyfrowy Świat"]] z podręcznika Technologii Informacyjnej.
+
===Iloczyn skalarny===
 +
Iloczyn skalarny przyjmiemy jako miarę podobieństwa dwóch sygnałów. Obliczać go będziemy tak samo jak dla wektorów — przypomnijmy: niech <math>\mathbf{x} = [x_1, x_2, x_3]</math>, i <math>\mathbf{y} = [y_1, y_2, y_3]</math>; iloczyn skalarny tych wektorów oznaczamy <math display="block">\mathbf x \cdot \mathbf y</math> (''zarówno wytłuszczenie symboli wektorów, jak i symbol mnożenia/ilocznu skalarnego "<math>\cdot</math>", będziemy dalej pomijać''):
 +
 
 +
<div align = "center">
 +
<math display="block">\displaystyle \mathbf a \cdot \mathbf b = \sum_{i=1}^3 x_i y_i = x_1 y_1 + x_2 y_2 + x_3 y_3</math>
 +
</div>
 +
 
 +
A jak to będzie wyglądać dla sygnałów złożonych z więcej niż trzech punktów? Weźmy
 +
 
 +
<math>x=[-2, -2, 2, -1, -2]</math>
 +
 
 +
<math>y=[-1, -1, 1,  1, 0]</math>
 +
 
 +
Zamiast strzałek w pięciowymiarowej przestrzeni, łatwiej wizualizować na wykresach wartości kolejnych próbek:
 +
 
 +
[[Plik:Product2.png|bezramki]]
 +
 
 +
<math>x\cdot y = [-2, -2, 2, -1, -2] \cdot [-1, -1, 1,  1, 0] = 2+2+2-1+0 = 5</math>
 +
 
 +
 
 +
 
 +
===Energia sygnału===
 +
Iloczyn skalarny sygnału z samym sobą, czyli <math>x\cdot x</math>, w analizie sygnałów nazywać będziemy jego energią — jeśli sygnałem będzie np. prąd elektryczny, płynący w obwodzie o jednostkowej oporności, to wytracona przez niego energia wyniesie właśnie <math>x\cdot x</math>
 +
 
 +
[[Plik:Product3.png|bezramki]]
 +
 
 +
<math>x\cdot x = [-2, -2, 2, -1, -2] \cdot [-2, -2, 2, -1, -2] = 4+4+4+1+4=17</math>
 +
 
 +
 
 +
===Ortogonalność===
 +
Kolejnym użytecznym pojęciem, które możemy zaczerpnąć bezpośrednio z algebry wektorów, jest ortogonalność. Dwa wektory (sygnały) są do siebie ortogonalne, jeśli ich iloczyn skalarny wynosi zero, jak poniżej:
 +
 
 +
[[Plik:Product6.png|500px|bezramki]]
 +
 
 +
W przypadku sygnału złożonego z 16 punktów, możemy ten fakt sprawdzić obliczając iloczyn skalarny punkt po punkcie, albo też zauważając prawidłowości występujące w każdym okresie górnego sygnału. W przypadku dłuższych i bardziej złożonych sygnałów może to już nie być takie oczywiste, jak np. ortogonalność wszystkich sinusów na poniższym rysunku, których częstości są całkowitymi wielokrotnościami częstości podstawowej:
 +
 
 +
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
 +
| <strong>Zbiór ortogonalnych sinusów</strong>
 +
|-
 +
|<math>f(x)=\sin(kx), k=1,2,\ldots</math>
 +
[[Plik:Ort sines cont.png|700px|bezramki]]
 +
|}
 +
 
 +
==Liczby zespolone==
 +
Przypomnijmy w skrócie: <math>i^2=-1</math>. Liczbę zespoloną <math>z</math> możemy zapisać w postaci algebraicznej jako
 +
: <math>z=a+bi,</math>
 +
gdzie <math>a</math> to część rzeczywista, <math>b</math> — część urojona.
 +
 
 +
Sprzężenie zespolone liczby <math>z</math> oznaczamy <math>\overline{z}</math>:
 +
: <math>\overline{z} = a - bi</math>
 +
a jej moduł to <math>|z| = \sqrt{a^2 + b^2}</math> (inaczej <math>|z| = z \cdot \overline{z}</math>).
 +
 
 +
Postać trygonometryczna:
 +
: <math>z = a + bi = |z| \cdot \dfrac{a}{|z|} + |z| \cdot \dfrac{b}{|z|}i = |z| \cdot (\cos \phi + i\sin \phi).</math>
 +
 
 +
Wykorzystując wzór Eulera<ref>wzorem Eulera bywa również nazywane równanie <math>e^{i\pi}+1=0</math></ref>
 +
:<math>e^{i\phi} = \cos(\phi) + i\sin(\phi)</math>
 +
możemy liczbę zespoloną zapisać jako
 +
:<math>z = |z|e^{i\phi}</math>
 +
 
 +
==[[Szereg Fouriera]]==
 +
Sygnał ''okresowy'' (o okresie <math>T</math>) można przedstawić w
 +
postaci szeregu Fouriera:
 +
 
 +
<equation id="eq:15">
 +
<math>
 +
s(t) =\sum_{n=-\infty}^{+\infty} c_n e^{-i\frac{2\pi n}{T} t},
 +
</math>
 +
</equation>
 +
 
 +
gdzie
 +
<equation id="eq:16">
 +
<math>
 +
c_{n} = \frac{1}{T}\int_{0}^{T} s(t) e^{i \frac{2\pi n}{T} t} d t
 +
</math>
 +
</equation>
 +
 
 +
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
 +
| <strong>'''Dowód'''  powyższego wzoru:  </strong>
 +
|-
 +
| Mnożymy obie strony <xr id="eq:15">równania</xr> przez <math>e^\frac{2\pi i k t}{T}</math>
 +
i całkujemy po <math>dt</math> od <math>0</math> do <math>T</math>:
 +
 
 +
<math>
 +
\int_0^T s(t) e^{{{2\pi i k t}\over{T}}} dt =
 +
\sum_{n=-\infty}^{+\infty} \int_0^T c_n e^{i{{2 \pi (k-n)}\over{T}} t}dt
 +
</math>
 +
 +
Całki po prawej stronie znikają dla <math>k \ne n</math>. Jedyny niezerowy
 +
wyraz dla <math>k = n</math> wynosi <math>\int_0^T c_n dt</math>, czyli <math>c_n T</math> (bo <math>e^0=1</math>).
 +
|}
 +
Każdą funkcję okresową możemy przedstawić w postaci sumy sinusów i kosinusów z odpowiednimi wagami — przypomnijmy: <math>e^{i \phi} = \cos(\phi) + i \sin(\phi)</math>.
 +
 
 +
Wagi <math>c_n</math> możemy traktować jako względny udział odpowiadających im częstości.
 +
 
 +
 
 +
===Przykład: szereg Fouriera dla prostokąta===
 +
Policzmy postać współczynników Fouriera dla funkcji <math>\Theta(t)</math>,
 +
określonej na przedziale <math>[0,1]</math> w następujący sposób:
 +
 
 +
:<equation id="eq:18">
 +
<math>
 +
\Theta(t) = \left\{
 +
\begin{matrix}
 +
1 &, & t \in [0, \frac{1}{2})\\
 +
0 &, & t \in [ \frac{1}{2}, 1]
 +
\end{matrix}
 +
\right.
 +
</math>
 +
</equation>
 +
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
 +
| <strong>obliczenia:  </strong>
 +
|-
 +
|Bezpośrednio z <xr id="eq:16">wzoru</xr> dostajemy (dla <math>T = 1</math>)
 +
 +
<math>\begin{matrix}
 +
c_{n} = \frac{1}{T}\int_{0}^{T} \Theta(t) e^\frac{i 2\pi n t}{T} d t
 +
= \int_{0}^\frac{1}{2} e^{{{i 2\pi n t}}} d t = ( \mathrm{dla}\; n \ne 0 ) =
 +
\left [\frac{1}{i 2\pi n} e^{{i 2\pi n t}} \right ]_{t=0}^{t=\frac{1}{2}} \\
 +
= \frac{1}{i 2\pi n} ( e^{i \pi n} - 1 ) =
 +
\left\{
 +
\begin{matrix}
 +
0 & \mathrm{dla}\; n = \pm2, \pm4, \ldots\\
 +
i/\pi n & \mathrm{dla}\; n = \pm1, \pm3, \ldots
 +
\end{matrix}
 +
\right .\\
 +
(\mathrm{dla}\; n=0) \;\; c_0 = \int_{0}^\frac{1}{2} 1 d t = \frac{1}{2}
 +
\end{matrix}</math>
 +
<br/>
 +
<br/>
 +
 
 +
Tak więc z <xr id="eq:15">wzoru</xr>
 +
 
 +
<math>\begin{matrix}
 +
\Theta(t) = \sum_{-\infty}^{\infty}  c_n e^{-i 2 \pi t n} =
 +
\frac{1}{2}\; + \sum_{n=\pm1, \pm3, \ldots} \frac{i}{\pi n} e^{-i 2 \pi t n}= \\
 +
= \frac{1}{2}\; + \sum_{n=\pm1, \pm3, \ldots} \frac{i}{\pi n} \left( \cos(2\pi n t) - i \sin( 2\pi n t) \right)=\\
 +
= \frac{1}{2}\; + \sum_{n=\pm1, \pm3, \ldots} \frac{i}{\pi n} \cos(2\pi n t)\;\; + \sum_{n=\pm1, \pm3, \ldots} \frac{1}{\pi n} \sin( 2\pi n t)
 +
\end{matrix}</math>
 +
 
 +
 
 +
W sumie kosinusów wyrazy dla <math>n>0</math> znoszą odpowiednie wyrazy dla <math>-n</math> (bo <math>cos(-x)=cos(x)</math>), w sumie
 +
sinusów wyrazy dla <math>\pm n</math> dodają się (bo <math>sin(-x)=-sin(x)</math>)
 +
|}
 +
Dostajemy
 +
 
 +
<equation id="eq:19">
 +
<math>
 +
\displaystyle \Theta(t) = \frac{1}{2} + \frac{2}{\pi}\sum_{n=1}^{\infty} \frac{\sin\left(2\pi (2n-1) t\right)}{(2n-1)}
 +
</math>
 +
</equation>
 +
 
 +
[[Plik:klasyczna_rys_2.png|bezramki|centruj|600px]]
 +
<!--|<figure id="fig:20"></figure>Od góry, kolejno:
 +
funkcja <math>\Theta</math> (<xr id="eq:18">równanie </xr>) uzupełniona do funkcji okresowej,  pierwszych 30 współczynników szeregu Fouriera,
 +
kwadraty współczynników szeregu Fouriera — dyskretne widmo,
 +
pierwszy wyraz rozwinięcia Fouriera, sumy pierwszych 10, 50, 500 i 5000 wyrazów  <xr id="eq:19">rozwinięcia</xr>. <br>
 +
Jak widać, najtrudniejsza do wyrażenia z pomocą funkcji
 +
trygonometrycznych jest nieciągłość funkcji <math>\theta(t)</math> w punktach <math>\left\{\pm \frac{k}{2}, k \in N \right\}</math>; niejednorodna
 +
zbieżność szeregów Fouriera w tych rejonach nosi nazwę ''efektu Gibbsa''.]]
 +
-->
 +
 
 +
Od góry, kolejno:
 +
funkcja <math>\Theta</math> (<xr id="eq:18">równanie </xr>) uzupełniona do funkcji okresowej,  pierwszych 30 współczynników szeregu Fouriera,
 +
kwadraty współczynników szeregu Fouriera — dyskretne widmo,
 +
pierwszy wyraz rozwinięcia Fouriera, sumy pierwszych 10, 50, 500 i 5000 wyrazów  <xr id="eq:19">rozwinięcia</xr>. <br>
 +
Jak widać, najtrudniejsza do wyrażenia z pomocą funkcji
 +
trygonometrycznych jest nieciągłość funkcji <math>\theta(t)</math> w punktach <math>\left\{\pm \frac{k}{2}, k \in N \right\}</math>; niejednorodna
 +
zbieżność szeregów Fouriera w tych rejonach nosi nazwę ''efektu Gibbsa''.
 +
 
 +
==[[Przekształcenie Fouriera]]==
 +
Przejdźmy do nieskończoności z okresem sygnału: <math>T\rightarrow\infty</math>.
 +
Wtedy odstęp <math>\left(\frac{2\pi}{T}\right)</math>
 +
między częstościami kolejnych elementów sumy szeregu Fouriera
 +
 
 +
<math>\displaystyle
 +
s(t) =\sum_{n=-\infty}^{+\infty} c_n e^{-i\frac{2\pi t}{T} n},
 +
</math>
 +
 
 +
dąży do <math>0</math> i suma przechodzi w całkę
 +
 
 +
<equation id="eq:21">
 +
<math>\displaystyle
 +
s(t)=\int_{-\infty}^{\infty}\hat{s}(f)e^{-i 2\pi t f} d f
 +
</math>
 +
</equation>
 +
 +
funkcja <math>\hat{s}(f)</math>, zastępująca dyskretny ciąg współczynników szeregu Fouriera
 +
 
 +
<math>\displaystyle
 +
c_{n} = \frac{1}{T}\int_{0}^{T} s(t) e^\frac{2\pi i n t}{T} d t
 +
</math>
 +
 
 +
to '''transformata Fouriera''' sygnału <math>s(t)</math>, czyli wynik działania przekształcenia (transformacji) Fouriera <math>\mathcal{F}</math>.
 +
 
 +
<equation id="eq:22">
 +
<math>\displaystyle
 +
\mathcal{F}\left( s(t) \right) \equiv \hat{s}(f)=\int_{-\infty}^{\infty}s(t)e^{i 2\pi f t} d t
 +
</math>
 +
</equation>
 +
 
 +
 
 +
<div align="right">
 +
[[Analiza_sygnałów_-_wykład|⬆]]  [[Szereg_Fouriera|⮕]]
 +
</div>

Aktualna wersja na dzień 10:12, 3 wrz 2024

Próbkowanie sygnałów analogowych

Sygnały zapisujemy, przetwarzamy i analizujemy w postaci ciągów liczb. Przejście od sygnału ciągłego do cyfrowego odbywa się przez proces próbkowania, czyli zapisywania kolejnych amplitud sygnału w ustalonych, stałych odstępach czasu, omawiany wcześniej na TIiK.

AD.png

102, 195, 80, 16, 147, 178

Żeby odtworzyć fizyczne własności sygnału, czyli narysować zapisane wartości próbek w odpowiedniej skali, musimy znać częstość próbkowania i stałą kalibracji.

Wyrażana w hercach (Hz) częstość próbkowania (ang. sampling frequency, [math]f_s[/math]) to liczba próbek na sekundę. Jest ona odwrotnością odstępu w czasie między kolejnymi próbkami ([math]\Delta t[/math]):

[math]f_s = \dfrac{1}{\Delta t}[/math]

Stała kalibracji to współczynnik, przez który mnożymy zapisane liczby, żeby otrzymać wartości w jednostkach fizycznych, na przykład mikrowoltach.

Oczywiście musimy też wiedzieć, w jakim formacie zapisano na dysku liczby (formaty omawialiśmy na wykładzie o binarnych reprezentacjach liczb), oraz, w przypadku sygnałów wielozmiennych o jednolitym próbkowaniu, znać liczbę kanałów. Taka dodatkowa informacja (metainformacja) jest konieczna do poprawnego wyświetlenia danych z pliku, w którym zapisano dane wielokanałowe, jak np. kilka odprowadzeń EEG lub dane kilku spółek giełdowych, próbkowane i zapisywane w jednakowych odstępach czasu.

WakeEEG Svarog 3chans.png


Aliasing i częstość Nyquista

Aliasing gif.gif

W procesie próbkowania kluczową rolę odgrywa twierdzenie o próbkowaniu (inaczej twierdzenie Nyquista-Shannona, czasem w skrócie twierdzenie Nyquista). Mówi ono, że sygnał ciągły możemy odtworzyć za zapisanych próbek, jeśli częstość próbkowania [math]f_s[/math] była wyższa niż dwukrotność najwyższej z występujących w sygnale częstości [math]f_{max}[/math], nazywana częstością Nyquista [math]f_N[/math]:

[math] f_s = \dfrac{1}{\Delta t} \gt 2* f_{max} = f_N[/math]

Jeśli częstość próbkowania nie była wystarczająco wysoka, nie tylko stracimy informację o zmianach amplitudy sygnału "pomiędzy próbkami", ale dojdzie też do zafałszowania sygnału w niższych częstościach, które z pozoru nie powinny być zaburzone. Efekt ten jest bliżej omówiony w rozdziale Aliasing.

Nyquist1.png

Sygnał dyskretny jako wektor

102, 195,  80,  16, 147, 178

Skoro sygnał to po prostu ciąg liczb, możemy go potraktować jak wektor. Na płaszczyźnie wektor to para współrzędnych (x, y), w przestrzeni trójwymiarowej trójka liczby (x, y, z), które wyobrażamy sobie jako strzałkę wiodącą od punktu (0, 0, 0) do (x, y, z). Sygnał składający się z pięciu punktów będzie wektorem w przestrzeni pięciowymiarowej, więc intuicja "strzałki" dla większości z nas przestaje być użyteczna. Pomimo tego, możemy wciąż korzystać z użytecznych pojęć z dziedziny algebry wektorów, jak ortogonalność czy iloczyn skalarny.


Iloczyn skalarny

Iloczyn skalarny przyjmiemy jako miarę podobieństwa dwóch sygnałów. Obliczać go będziemy tak samo jak dla wektorów — przypomnijmy: niech [math]\mathbf{x} = [x_1, x_2, x_3][/math], i [math]\mathbf{y} = [y_1, y_2, y_3][/math]; iloczyn skalarny tych wektorów oznaczamy [math]\mathbf x \cdot \mathbf y[/math] (zarówno wytłuszczenie symboli wektorów, jak i symbol mnożenia/ilocznu skalarnego "[math]\cdot[/math]", będziemy dalej pomijać):

[math]\displaystyle \mathbf a \cdot \mathbf b = \sum_{i=1}^3 x_i y_i = x_1 y_1 + x_2 y_2 + x_3 y_3[/math]

A jak to będzie wyglądać dla sygnałów złożonych z więcej niż trzech punktów? Weźmy

[math]x=[-2, -2, 2, -1, -2][/math]

[math]y=[-1, -1, 1, 1, 0][/math]

Zamiast strzałek w pięciowymiarowej przestrzeni, łatwiej wizualizować na wykresach wartości kolejnych próbek:

Product2.png

[math]x\cdot y = [-2, -2, 2, -1, -2] \cdot [-1, -1, 1, 1, 0] = 2+2+2-1+0 = 5[/math]


Energia sygnału

Iloczyn skalarny sygnału z samym sobą, czyli [math]x\cdot x[/math], w analizie sygnałów nazywać będziemy jego energią — jeśli sygnałem będzie np. prąd elektryczny, płynący w obwodzie o jednostkowej oporności, to wytracona przez niego energia wyniesie właśnie [math]x\cdot x[/math]

Product3.png

[math]x\cdot x = [-2, -2, 2, -1, -2] \cdot [-2, -2, 2, -1, -2] = 4+4+4+1+4=17[/math]


Ortogonalność

Kolejnym użytecznym pojęciem, które możemy zaczerpnąć bezpośrednio z algebry wektorów, jest ortogonalność. Dwa wektory (sygnały) są do siebie ortogonalne, jeśli ich iloczyn skalarny wynosi zero, jak poniżej:

Product6.png

W przypadku sygnału złożonego z 16 punktów, możemy ten fakt sprawdzić obliczając iloczyn skalarny punkt po punkcie, albo też zauważając prawidłowości występujące w każdym okresie górnego sygnału. W przypadku dłuższych i bardziej złożonych sygnałów może to już nie być takie oczywiste, jak np. ortogonalność wszystkich sinusów na poniższym rysunku, których częstości są całkowitymi wielokrotnościami częstości podstawowej:

Liczby zespolone

Przypomnijmy w skrócie: [math]i^2=-1[/math]. Liczbę zespoloną [math]z[/math] możemy zapisać w postaci algebraicznej jako

[math]z=a+bi,[/math]

gdzie [math]a[/math] to część rzeczywista, [math]b[/math] — część urojona.

Sprzężenie zespolone liczby [math]z[/math] oznaczamy [math]\overline{z}[/math]:

[math]\overline{z} = a - bi[/math]

a jej moduł to [math]|z| = \sqrt{a^2 + b^2}[/math] (inaczej [math]|z| = z \cdot \overline{z}[/math]).

Postać trygonometryczna:

[math]z = a + bi = |z| \cdot \dfrac{a}{|z|} + |z| \cdot \dfrac{b}{|z|}i = |z| \cdot (\cos \phi + i\sin \phi).[/math]

Wykorzystując wzór Eulera[1]

[math]e^{i\phi} = \cos(\phi) + i\sin(\phi)[/math]

możemy liczbę zespoloną zapisać jako

[math]z = |z|e^{i\phi}[/math]

Szereg Fouriera

Sygnał okresowy (o okresie [math]T[/math]) można przedstawić w postaci szeregu Fouriera:

[math] s(t) =\sum_{n=-\infty}^{+\infty} c_n e^{-i\frac{2\pi n}{T} t}, [/math]

gdzie

[math] c_{n} = \frac{1}{T}\int_{0}^{T} s(t) e^{i \frac{2\pi n}{T} t} d t [/math]

Każdą funkcję okresową możemy przedstawić w postaci sumy sinusów i kosinusów z odpowiednimi wagami — przypomnijmy: [math]e^{i \phi} = \cos(\phi) + i \sin(\phi)[/math].

Wagi [math]c_n[/math] możemy traktować jako względny udział odpowiadających im częstości.


Przykład: szereg Fouriera dla prostokąta

Policzmy postać współczynników Fouriera dla funkcji [math]\Theta(t)[/math], określonej na przedziale [math][0,1][/math] w następujący sposób:

[math] \Theta(t) = \left\{ \begin{matrix} 1 &, & t \in [0, \frac{1}{2})\\ 0 &, & t \in [ \frac{1}{2}, 1] \end{matrix} \right. [/math]

Dostajemy

[math] \displaystyle \Theta(t) = \frac{1}{2} + \frac{2}{\pi}\sum_{n=1}^{\infty} \frac{\sin\left(2\pi (2n-1) t\right)}{(2n-1)} [/math]
Klasyczna rys 2.png

Od góry, kolejno: funkcja [math]\Theta[/math] (równanie 3) uzupełniona do funkcji okresowej, pierwszych 30 współczynników szeregu Fouriera, kwadraty współczynników szeregu Fouriera — dyskretne widmo, pierwszy wyraz rozwinięcia Fouriera, sumy pierwszych 10, 50, 500 i 5000 wyrazów rozwinięcia 4.
Jak widać, najtrudniejsza do wyrażenia z pomocą funkcji trygonometrycznych jest nieciągłość funkcji [math]\theta(t)[/math] w punktach [math]\left\{\pm \frac{k}{2}, k \in N \right\}[/math]; niejednorodna zbieżność szeregów Fouriera w tych rejonach nosi nazwę efektu Gibbsa.

Przekształcenie Fouriera

Przejdźmy do nieskończoności z okresem sygnału: [math]T\rightarrow\infty[/math]. Wtedy odstęp [math]\left(\frac{2\pi}{T}\right)[/math] między częstościami kolejnych elementów sumy szeregu Fouriera

[math]\displaystyle s(t) =\sum_{n=-\infty}^{+\infty} c_n e^{-i\frac{2\pi t}{T} n}, [/math]

dąży do [math]0[/math] i suma przechodzi w całkę

[math]\displaystyle s(t)=\int_{-\infty}^{\infty}\hat{s}(f)e^{-i 2\pi t f} d f [/math]

funkcja [math]\hat{s}(f)[/math], zastępująca dyskretny ciąg współczynników szeregu Fouriera

[math]\displaystyle c_{n} = \frac{1}{T}\int_{0}^{T} s(t) e^\frac{2\pi i n t}{T} d t [/math]

to transformata Fouriera sygnału [math]s(t)[/math], czyli wynik działania przekształcenia (transformacji) Fouriera [math]\mathcal{F}[/math].

[math]\displaystyle \mathcal{F}\left( s(t) \right) \equiv \hat{s}(f)=\int_{-\infty}^{\infty}s(t)e^{i 2\pi f t} d t [/math]


  1. wzorem Eulera bywa również nazywane równanie [math]e^{i\pi}+1=0[/math]