Funkcja mediany

0

Cześć!
Mam za zadanie napisać program, który będzie generował pewien sygnał, później go zaszumiał, a następnie odszumiał za pomocą mediany (program bierze 5 próbek (1,2,3,4,5), sortuje, wyznacza medianę i jej wartość to pierwszy wynik, następnie kolejne 5 (2,3,4,5,6) itd.) I właśnie z tym ostatnim mam problem. Mam już fragment kodu tej funkcji, ale nie wiem jak go skończyć. (ip to ilość próbek zadawana przez użytkownika)

void wygladzWynikmediana(float *wyniki, int ip)
{
	int i = 0;
	int u = 0;
	FILE *f;
	int t = fopen_s(&f, "wynikiwygładzonemediana.csv", "w");

	if (ip > 6)
	{
		for (i = 0; i < ip - 5; ++i)
		{
			if (wyniki[i] > wyniki[i + 1]);
			{
				u = wyniki[i+1];
				wyniki[i+1] = wyniki[i];
				wyniki[i] = u;
			}
			printf("%d    %f\n", i, wyniki[i]);
			fprintf(f, "%d; %f\n", i, wyniki[i]);
		}
	}
	fclose(f);
}

wspieram się funkcją którą napisałem wcześniej, która wygładza wyniki za pomocą średniej

void wygladzWynik(float *wyniki, int ip)
{
	int i = 0;

	FILE *f;
	int t = fopen_s(&f, "wynikiwygładzone.csv", "w");

	if (ip > 6)
	{
		for (i = 0; i < ip - 5; ++i)
		{
			wyniki[i] = wyniki[i] + (wyniki[i + 1] + wyniki[i + 2] + wyniki[i + 3] + wyniki[i + 4]) / 5.0;
			printf("%d    %f\n", i, wyniki[i]);
			fprintf(f, "%d; %f\n", i, wyniki[i]);
		}
	}
	fclose(f);
}

ale to trochę inna zasada działania

Proszę o pomoc z tą medianą

0

Ależ te funkcje są podobne - metoda średniej ruchomej i mediany ruchomej jest analogiczna. Na upartego wystarczy zmienić jedynie kawałek kodu poprzedniego wygładzania, tak aby zamiast średniej użył mediany i masz koniec.

0

Tylko jak zmienić? wiem, że muszę dopisać coś w for po if'je, aby pod "wyniki[i]" przypisywało wartość 3 elementu z uporządkowanych wartości. Nie mam jednak pomysłu jak to "ubrać w kod"

0
void wygladzWynik(float *probki, int liczbaProbek, float *wynik, float (*operacja)(const float tab[5]))
{
    int i ;
    for (i = 0; i < liczbaProbek - 5; ++i)
    {
        wyniki[i] = operacja(wynik + i);
    }
}

float sredniaZ5(const float tab[5])
{
     int i;
     float suma = 0;
     for (i = 0; i < 5; ++i) {
           suma += tab[i];
     }

     return suma/5.0f;
}

float medianaZ5(const float tab[5])
{
     float mediana;

     … … … // oblicz medianę z 5 liczb

     return mediana;
}

double dane[0x100] =  { … };
double wynikMedianaZ5[0x100-4];
double wynikSredniaZ5[0x100-4];

wygladzWynik(dane, 0x100, wynikSredniaZ5, &sredniaZ5);
wygladzWynik(dane, 0x100, wynikMedianaZ5, &medianaZ5);

1 użytkowników online, w tym zalogowanych: 0, gości: 1