Laboratorium 3: Interpolacja trygonomrtryczna

W przypadku gdy, funkcja (zjawisko), którą się zajmujemy jest okresowa czyli g(y+t)=g(y) dla wszystkich y, do interpolacji najlepiej użyć funkcji okresowych. Dokonując zamiany zmiennych (x=2πt) można rozpatrywać funkcje okresowe o okresie 2π.

Zadanie interpolacji trygonometrycznej polega na znalezieniu dla danej funkcji f: tn(x)=j=0ncjeijx (i=1). Oczekujemy, że wielomian ten przyjmie w n+1 punktach xk z przedziału [0,2π] te same wartości co interpolowana funkcja, tzn.: tn(xk)=f(xk) gdzie xkxl, gdy kl.

Zadanie te rozwiązuje się podobnie jak poprzednie rozwiązując układ n+1 równań liniowych z n+1 niewiadomymi co,c1,,cn j=0ncjzkj=f(xk) gdzie zk=eixk.

Załóżmy, że węzły interpolacji są równoodległe czyli xk=2kπn+1;(k=0,1,,n).

Ze względu na to, że funkcje eijx są ortogonalne (w sensie iloczynu skalarnego) zagadnienie można potraktować jako rzut dowolnego wektora w przestrzeni na osie. Można pokazać, że współczynniki cj można wyznaczyć w sposób następujący: cj=(f,eijx)n+1=1n+1k=0nf(xk)eijxk (zapis (,) oznacza iloczyn skalarny.

Jak wiadomo, wielomian tn(x)=j=0ncjeijx przedstawiony może być w postaci alternatywnej: tn(x)=12a0+j=1m(ajcosjx+bjsinjx)+δ12am+1cos(m+1)x gdzie δ=0, a m=12n, gdy n parzyste oraz δ=1, a m=12(n1), gdy n nieparzyste. Współczynniki aj oraz bj równe są odpowiednio:

aj=2n+1k=0nf(xk)cosjxk bj=2n+1k=0nf(xk)sinjxk

Powyższy wzór nie jest wykorzystywany do obliczeń. Zazwyczaj stosuje się Szybką Transformatę Fouriera (FFT). Algorytm opracowany przez Cooleya i Tookeya w 1965 pominę. Koszt podejścia klasycznego wymaga (n+1)2 operacji. Natomiast, w przypadku algorytmu FFT, gdy n+1 może być przedstawione (rozłożone) jako iloczyn r1r2rp będzie rzędu (n+1)(r1+r2++rp). Algorytm FFT najczęściej stosowany jest, gdy n+1=2k, wymaga on wówczas nlog2n działań.

Pewnym problemem stosowania interpolacji trygonometrycznej jest to, że funkcja jest okresowa. To znaczy zakładamy, że tn(0)=tn(xn+1). Dokonując pomiarów zazwyczaj tak nie jest. W dalszym ciągu „można" stosować FFT, funkcja będzie okresowa, ale… Aby uwolnić się od tego problemu, nakłada się zmierzone dane funkcję okna. Typowa funkcja okna dla x=0 i x=2π przyjmuje wartość zero co powoduje zniekształcenie badanego przebiegu.

Mathematica

Interpolacja trygonometryczna

Zajmę się głównie szybką transformatą Fouriera. Funkcja Fourier służy do wyliczenia FFT z zadanego przebiegu danych. Najprostsze jeż użycie będzie takie:

a=Fourier[1,1,2,2,1,1,0,0]a=Fourier[1,1,2,2,1,1,0,0]

2.82843,+0.i,0.5+1.20711i,0.,+0.i,0.5,0.207107i,0.,+0.i,0.5,+0.207107i,0.,+0.i,0.51.20711i

Odwrotna transformata Fouriera:

InverseFourier[a]InverseFourier[a]

1.,1.,2.,2.,1.,1.,0.,1.570092458683775`*-16 W każdym razie działa. Ósma wartość to „prawie” zero.

Teraz jakiś przebieg okresowy.

err=.0001;err=.0001;

Parametr err to zakres zaburzeń.

data=Table[2Sin[0.2πn]+Sin[0.8πn]+RandomReal[{err,err}],{n,0,127}];data=Table[2Sin[0.2πn]+Sin[0.8πn]+RandomReal[{err,err}],{n,0,127}];

fftdata=Fourier[data];fftdata=Fourier[data]; ListPlot[Abs[fftdata]]ListPlot[Abs[fftdata]]

Jak zinterpretować ten wykres? Czemu są cztery ekstrema (piki)?

Można również skorzystać z funkcji Periodogram.

Periodogram[data]Periodogram[data]

Jak zinterpretować ten rezultat?

Jak na podstawie powyższych wykresów zidentyfikować częstości przebiegu?

  1. Hint1: Wygenerować jeden okres przebiegu o częstości 1 Hz i pokazać jego transformatę Fouriera oraz periodogram.

  2. Hint2: Funkcja periodogram ma dodatkowy parametr SampleRate. Mówi on ile próbek na jednostkę czasu wykonano. Używany jest do skalowania osi X.

Matlab

Interpolacja trygonometryczna

Podstawowym narzędziem jest funkcja fft:

Fs = 1000;                    % Sampling frequency
T = 1/Fs;                     % Sample time
L = 1000;                     % Length of signal
t = (0:L-1)*T;                % Time vector
% Sum of a~50 Hz sinusoid and a~120 Hz sinusoid
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t); 
y = x + 2*randn(size(t));     % Sinusoids plus noise
plot(Fs*t(1:50),y(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('time (milliseconds)')

figure_0.png

NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);
% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2+1))) 
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')

figure_1.png

Zwracam uwagę, że pokazane rozwiązanie sugeruje, żeby długość ciągu danych była potęgą dwójki (polecenie: NFFT = 2^nextpow2(L);) czego nie wymaga Mathematica.

Zadania

  1. Użyć interpolacji trygonometrycznej do znalezienia okresu zmienności tygodniowego (lub miesięcznego) wykresu temperatury. Wyglądać może on jakoś tak:

    Można skorzystać z tych danych.

    Oct 132015Oct 14Oct 15Oct 16Oct 17Oct 18Oct 1905k10k15k
    IRxy
  2. Przed rozpoczęciem tego zadania sugeruję zapoznanie się z informacjami zawartymi w rozdziale o Jupyterze oraz przeanalizowanie przykładowych notatników na temat wczytywania danych, eliminacji błędnych danych i szybkiej transformaty Fouriera.

  3. Mając transformatę Fouriera warto spróbować przeprowadzić „naiwną, ręczną filtrację danych", która polegać będzie na wyzerowani nieistotnych składowych transformaty i po zostawieniu tylko tych które wnoszą istotny wkład w przebieg oraz porównaniu przebiegów.

  4. Opisać od czego zależy rozdzielczość (zdolność do identyfikowania w przebiegu złożonym składowych o bardzo bliskich częstotliwościach) szybkiej transformaty Fouriera. Można posiłkować się notatnikiem Jupyter.

  5. Zwrócić uwagę na znaczenie twierdzenia Shannona (o próbkowaniu) i wytłumaczyć na co mają wpływ:

    • częstotliwość próbkowania,
    • czas próbkowania.
Poprzedni
Następny