Wykład nr 5
Transformata Fouriera - sygnały dyskretne okresowe i nieokresowe2009

Sygnały okresowe dyskretne - Dyskretny Szereg Fouriera
Próbkowanie sygnału009

Dyskretny szereg Fouriera to transformacja na sygnale dyskretnym

Fourier[{2,3,-4,3,2}]

InverseFourier[%]

Jeśli sygnał, z natury ciągły, chcemy przechowywać w formi cyfrowej, musimy zastąpić funkcję ciągłą w czasie jej wartościami zmierzonymi w określonych odstępach czasu. 
Generujemy w ten sposób listę np. 21 punktów jednakowo odległych sygnału okresowego:
If we want to keep a signal, that is continuous in nature, in a digital form, we have to change a continuous function to discrete values in certain periods of time.
We generate this way a list of 21 points.

datap1=Table[N[Sin[10  Pi n/21]],{n,21}];
ListPlot[datap1,PlotStyle->PointSize[0.02]]

datap1

Jak widać po połączeniu tych punktów wykres nie do końca przypomina sinusoidę:
As You can see by joining these points we don't really  get our original function:

ListPlot[datap1, Joined->True]

Zwiększymy zatem częstotliwość próbkowania:
So lets take more samples:

datap2=Table[N[Sin[10  Pi n/51]],{n,51}];
ListPlot[datap2,PlotStyle->PointSize[0.02]]

ListPlot[datap2, Joined->True]

data1=Table[N[Sin[10  Pi n/101]],{n,101}];
ListPlot[data1,PlotStyle->PointSize[0.02]]

ListPlot[data1, Joined->True]

Widmo sygnału data1: 
Uwaga widmo sygnału okresowego dyskretnego jest dyskretne:

ListPlot[Abs[Fourier[data1]],PlotRange->All,PlotStyle->PointSize[0.02]]

ListPlot[Abs[Fourier[data1]],Joined->True,PlotRange->All]

Jeszcze parę uwag o próbkowaniu: powyżej wszystkie funkcje były próbkowane w przedziale od 0 do 1. jeżeli np. chcemy spróbkować funkcję f(x)  w przedziale x∈<a,b> i uzyskać k próbek to próbkujemy:
f(n) , n∈<a,b,((b-a)/(k-1))>
Poniżej przykład funkcji w przedziale od 5 do 10 spróbkowanej 51 razy.

data5=Table[N[Sin[2 Pi n]],{n,5,10,0.1}];
ListPlot[data5,PlotStyle->PointSize[0.02],PlotRange->All]

ListPlot[Abs[Fourier[data5]],Joined->True,PlotRange->All]

data5=Table[N[Sin[9 Pi n]],{n,5,10,0.1}];
ListPlot[Abs[Fourier[data5]],Joined->True,PlotRange->All]

Kto wie co tu się stało w poniższym przykładzie?

data5=Table[N[Sin[10 Pi n]],{n,5,10,0.1}];
ListPlot[Abs[Fourier[data5]],Joined->True,PlotRange->All]

Jak wygląda widmo zaszumionego sygnału9

Do sygnału dyskretnego, okresowego dodajemy szum:
Now to this discrete signal we add some noise:

data2=Table[N[Sin[10  Pi n/100]+(Random[]-1/2)],{n,100}];
ListPlot[data2,PlotStyle->PointSize[0.02]]

ListPlot[data2, Joined->True]

ListPlot[{data1,data2}, Joined->True,PlotStyle->{Hue[1],Hue[.6]}]

Widmo sygnału z szumem: jak widać na  wykresie można odróżnić widmo sygnału od widma szumu:
Notice that on this plot we can tell apart the spectrum of the original signal and the spectrum of the noise

ListPlot[Abs[Fourier[data2]],Joined->True,PlotRange->All]

Zjawisko aliasingu009

Przy przejściu od reprezentacji ciągłej do dyskretnej tracimy informację o wartości sygnału pomiędzy próbkami. Próby odtworzenia go, tylko na podstawie informacji o dysktretnej sekwencji próbek, mogą prowadzić do przekłamań:
Going from the continuous representation to discrete we loose information about the values of the signal between the samples. Sometimes we may have a problem reconstructing the signal only on basis of its' samples:

datap1=Table[N[Sin[10  Pi n/20]],{n,8}];
Show[{ListPlot[datap1,PlotStyle->PointSize[0.03]],Plot[Sin[ Pi 0.5n], {n,0,8},PlotStyle->Hue[3/4]],Plot[Sin[2.5 Pi n], {n,0,8},PlotStyle->Hue[.4]]}]

Zjawisko to nazywamy aliasingiem. Jednak przy pewnych dodatkowych założeniach o sygnale, możliwe jest jego całkowite odtworzenie z sekwencji dyskretnych próbek. 
Dla uniknięcia maskowania widma (aliasingu) wskazane jest, aby czestotliwość próbkowania była wyższa od częstotliwości sygnału.  Mówi o tym twierdzenie Nyquista: częstotliwośc próbkowania powinna być przynajmniej dwa razy wyższa od częstotliwości próbkowanego sygnału.

Zjawisko przecieku09

Dla ilustracji tego zjawiska przyjmiemy analizę sygnału sinusoidalnego o częstotliwości 1000Hz spróbkowanego z częstotliwością 10KHz. Analiza 1000 próbek tego sygnału odpowiada dokładnie 100 jego okresom:

f=100;
fp=1000;
data=Table[N[Sin[f 2 Pi n/fp]],{n,0,1000-1}];
ListPlot[data, Joined->True]

Na wykresie widma widzimy dokładnie jeden pik odpowiadający częstotliwości 1000 Hz:

ListPlot[Abs[Fourier[data]],Joined->True,PlotRange->All]

Analiza 1024 próbek tego sygnału odpowiada dokładnie 102,4 jego okresom:

f=100;
fp=1000;
datap=Table[N[Sin[f 2 Pi n/fp]],{n,0,1024-1}];
ListPlot[datap, Joined->True]

Okazuje się, że widmo jest bardziej rozmyte:

ListPlot[Abs[Fourier[datap]],Joined->True,PlotRange->All]

Pobranie do analizy całkowitej liczby okresów powoduje, że otrzymane widmo jest widmem prawidłowym. Tak np. dla sygnału haromnicznego otrzymujemy dokładnie jeden prążek. Pobranie innej ilości próbek powoduje znaczne zniekształcenie widma, co widać na wykresie powyżej. Wynika to z właściwości Transformaty Fouriera, traktującej pobrany do analizy ciąg próbek jako jeden okres sygnału. Niestety do wykonania analizy widma zazwyczaj nie mamy możliwości poprania dokładnej krotności liczby okresów. Aby zmiejszyć błąd przecieku stosujemy inne nieprostokątne okna wycinające.

Przykłady okien wycinajacych:
Okno Trojkątne:

NN=1024;
Window1=Join[Table[2 n/NN,{n,0,NN/2}],Table[2-2 n/NN,{n,1+NN/2,NN-1}]];

ListPlot[Window1,Joined->True,PlotRange->All]

Okno Hanninga:

NN=1024;
Window2=Table[0.5-0.5 Cos[2 Pi n/NN],{n,0,NN-1}];

ListPlot[Window2,Joined->True,PlotRange->All]

Okno Hamminga:

NN=1024;
Window3=Table[0.54-0.46 Cos[2 Pi n/NN],{n,0,NN-1}];

ListPlot[Window3,Joined->True,PlotRange->All]

A teraz sprawdźmy, czy zastosowanie okna trójkątnego zmiejszyło rozmycie:

ListPlot[Abs[Fourier[datap Window1]],Joined->True,PlotRange->All]

Wg. mnie jest trochę lepiej. Polecam Wam sprawdzenie działania okien Hanninga i Hamminga.

Sygnały nieokresowe dyskretne - Dyskretna Transformata Fouriera
Aperiodic and discrete signals - Discrete-time FT

Ten rodzaj transformaty Fouriera stosujemy przy sygnałach dyskretnych i nieokresowych np dla dyskretnej delty:

ListPlot[Table[DiscreteDelta[1+n], {n,-5,5}],PlotStyle->PointSize[0.02]]

Transformata Fouriera takiego sygnały jest funkcją ciągłą:

dd1=FourierSequenceTransform[DiscreteDelta[1+n],n,ω]

Sygnał dyskretny nieokresowy determinuje jego nieskończoność. Poniżej przedstawiona została odwrotna transformata transformaty sygnału początkowego. Wypisanych zostało oczywiście tylko pare punktów (w rzeczywistości jest ich nieskończenie wiele). Widać, że otrzymujemy z powrotem sygnał początkowy czyli dyskretną deltę, która przyjmuje wartość 1 dla n=-1.

Chop[Table[InverseFourierSequenceTransform[dd1,ω,n],{n,-5,5}]]

Poniżej znajduje się jeszcze kilka przykładów

dd2=FourierSequenceTransform[DiscreteDelta[2+n],n,ω]

Chop[Table[InverseFourierSequenceTransform[dd2,ω,n],{n,-5,5}]]

dd3=FourierSequenceTransform[DiscreteDelta[1+n]+DiscreteDelta[2+n],n,ω]

Chop[Table[InverseFourierSequenceTransform[dd3,ω,n],{n,-5,5}]]

Poniżej przedstawione są wykresy wartości bezwzględnej, części rzeczywistej i części urojonej, transformat trzech powyższych funkcji dyskretnych.

Plot[{Abs[dd1],Re[dd1],Im[dd1]},{ω,-3,3},PlotStyle->{Hue[0.8],Hue[.7],Hue[0]}]
Plot[{Abs[dd2],Re[dd2],Im[dd2]},{ω,-3,3},PlotStyle->{Hue[.8],Hue[.7],Hue[0]}]
Plot[{Abs[dd3],Re[dd3],Im[dd3]},{ω,-3,3},PlotStyle->{Hue[.8],Hue[.7],Hue[0]}]

I jeszcze jeden wniosek z wykresów: transformata Fouriera takiego dyskretnego i nieokresowego sygnału jest ciągła i okresowa.

Clear[dd1,dd2,dd3]

Pytania na kolokwium

1. Proszę podać klasyfikacje transformat Fouriera ze względu na okresowość i nieokresowość a także ciągłość i dyskretność sygnału w czasie. p.p 
2. Na czym polega zjawisko aliasingu i jak go uniknać p.p. 
3. Na czy polega zjawisko przecieku i jakie są sposoby jego zapobiegania p.r

Ćwiczenia na laboratorium

Ćwiczenie nr 8 - 3p.
Należy:
Dana jest funkcja postaci:
f(t)=(e^(-(t^2)))sin t
Należy:
1. Przedstawić wykres funkcji f(t).
2. Spróbkować funkcję f(t), w przedziale <0, 2\pi>, n = 256 razy.
3. Wyznaczyć współczynniki rozwinięcia dyskretnego szeregu Fouriera (Fourier[]) spróbkowanej funkcji.
4. Na osobnych wykresach przedstawić część rzeczywistą, część urojoną i moduł współczynników rozwinięcia.
5. Zauważ, że dla współczynników rozwinięcia słusznym jest: (Subscript[c, k])=(Subscript[(SuperStar[c]), n-k]) Jest to prawda dla wszystkich sygnałów dyskretnych rzeczywistych. Zatem, by wyznaczyć
wszystkie współczynniki rozwinięcia, tak naprawdę wystarczy znać pierwsza ich połowę.