Laboratorium 9: Ruchoma średnia

Zadanie

Wyobraźmy sobie że mamy zestaw danych (pochodzących z jakichś pomarów). Są one lekko zaszumione. Naszym zadaniem jest zastosowane metody ruchomej średniej aby je wygładzić.

Na potrzby tego zadania trzeba będzie:

  • na podstawie zadanej liczby N (długość seri danych);

  • wygenerować N wartości zmiennoprzecinkowych;

  • a następnie „wygładzić dane" stosując metodę ruchomej średniej o m składnikach ($m<N$).

Trzeba też zadać w odpowiedni sposób wartość m. (m to zazwyczaj nieparzysta liczba całkowita: 3, 5, 7,…)

Następnie program dokonuje odpowiednich przeliczeń i wyprowadza na ekran obok siebie dwie kolumny liczb: dane oryginalne i dane przetworzone1.

Ruchoma średnia

Niech $w_i,\quad i=0, 1,\ldots, N-1$2. Ruchoma średnia to metoda wygładzania danych polegająca na wyliczeniu na podstawie danych z tablicy $w$ nowej tablicy $t$ w sposób następujący:

$$t_i = \dfrac{1}{m}\sum_{j=-(m-1)/2}^{j=(m-1)/2} w_{i+j}$$

Wartość $m$ przyjmowana jest jako liczba nieparzysta (3, 5, 7,…)3.

Zdecydować trzeba, co robimy z elementami tablicy, dla których nie można4 wyliczyć pełnej średniej. Można wybrać jeden z dwu wariantów:

  1. Przepisujemy je bez zmian;

  2. Wyliczamy taką średnią jaką się da wyliczyć.

To znaczy gdy $m = 5$, $j$ zmienia się w zakresie od -2 do 2 (włącznie), zatem niedostępne są elementy $w_{-1}$ i $w_{-2}$ potrzebne do wyliczenia $t_0$. Czyli albo:

  1. przepisujemy bez zmian $t_0\leftarrow w_0$ i $t_1\leftarrow w_1$, kolejne elementy liczymy zgodnie z wzorem. Podobnie na drugim końcu tablicy.

  2. Wyliczamy to „co się da":

    $$t_0=\frac{1}{3} (w_0 + w_1 + w_2)$$

    $$t_1=\frac{1}{4} (w_0 + w_1 + w_2 +w_3)$$

    (a $t_2$ już „normalnie": $t_2=\frac{1}{5}(w_0+w_1+w_2+w_3+w_4)$). I podobnie na końcu tablicy.

Generacja losowych danych zmiennoprzecinkowych

Funkcja rand() generuje pseudolosoway liczby całkowite z zakresu od zera do wartości RAND_MAX (to, najprawdopodobniej wartość 2 147 483 647).

x = rand() / RAND_MAX może dać wyniku liczbę z zakresu od 0 do 1. (o ile tylko dzielenie wykonan się poprawnie5).

x - 0.5 będzie to wartość (pseudolosowa) z zakresu $(-0.5, 0.5)$, a 2 * (x - 0.5) to wartość pseudolosowa z zakresu $(-1.,1.)$.


  1. I proszę nie epatować cyframi po przeciunku, jedna lub dwie powinny wystarczyć; specyfikacja formatu %f daje 6 cyfr po przecinku natomiast specyfikacja %.2f — da tylko dwie. ↩︎

  2. Zwracam uwagę, że w opisie dane numerowane są od 0, podobnie jak w przypadku języka C (gdzie indeksy tablicy rozpoczynają się od zera). ↩︎

  3. Czemu? ↩︎

  4. Pierwsze i ostatnie elemanty tablicy. ↩︎

  5. Zarówno rand() jak i RAND_MAX to wartości całkowite, więc trzeba dokonąc jakiegoś rzutowania. ↩︎

Poprzedni
Następny