Quantcast
Channel: Forum Pasja Informatyki - Najnowsze pytania
Viewing all articles
Browse latest Browse all 65225

Przetwarzanie sygnału w C. Problem z zarządzaniem pamięcią.

$
0
0

Witam.

Jako projekt zaliczeniowy na studiach musze napisać program generujący i przetwarzający sygnał(sinus). Podczas sprawdzania testem gremlina zaczęły dziać sie rzeczy, których nie potrafie wytłumaczyć. Program jednym razem zadziała pięknie, innym wysypie sie podczas otwierania pliku, innym przy czyszczeniu tablicy, a jeszcze innym przy wyjściu ze switch'a. Sugeruje mi to jakiś problem z zarządzaniem pamięcią, jednak nie potrafie go zlokalizować.Do tej pory najczęściej wysypywał mi sie przy sekwencji: (w podkreślonych miejscach) 1.Generowanie>3.Zaszumienie>5.Filtracja>6.Zapis>7.Zamknięcie>Ponowne odpalenie>2.Wczytanie>3. Zaszumianie>5.Filtracja>6.Zapis>7.Zamknięcie. Niewykluczone, że popełniam jakiś banalny błąd. Prosze o analize, wskazówki co jest nie tak i jak to naprawić. :)

Kod w C:

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<locale.h>



void wspolczynniki(float *wsp)
{
		printf("Podaj parametry funkcji.\nAmplituda sin:\n");
		scanf("%f", &wsp[0]);
		printf("Omega:\n");
		scanf("%f", &wsp[1]);
		printf("Przesunięcie fazowe:\n");
		scanf("%f", &wsp[2]);
		printf("Stała c:\n");
		scanf("%f", &wsp[3]);
		printf("Podaj początek dziedziny:\n");
		scanf("%f", &wsp[4]);
		printf("Podaj koniec dziedziny:\n");
		scanf("%f", &wsp[5]);	
		wsp[6] = 0;
			while(*(wsp + 6)==0)
			{
				printf("Podaj ilość próbek:(różną od 0)\n");
				scanf("%f", &wsp[6]);
			}
		system("cls");
}

void funkcja(float *wsp, float *wynik)
{
	 float p, x, a, w, f, c, d1, d2;
	 a = *wsp;
	 w = *(wsp + 1);
	 f = *(wsp + 2);
	 c = *(wsp + 3);
	 d1 = *(wsp + 4);
	 d2 = *(wsp + 5);
	 p = (d2 - d1) / *(wsp+6);
	 x = d1;
	 printf("Wspołczynniki: %f %f %f %f\n", a, w, f, c);
	
	 int i;
	 for (i = 0; i < *(wsp+6); i++)
	 {
		 *wynik =a*(float)sin(w*x + f) + c;
		 wynik = wynik + 1;
		 x = x + p;
	 }
	 printf("Sygnał został wygenerowany.\n\n");
	  
}

int odczyt(float **tab1, float *wsp)
{
	float x, y, a;
	int i=2;
	int *temp;
	FILE *plik;
	
	plik = fopen("C:\\tablica1.csv", "r");
		if (plik == NULL)
			{
			printf("Nie można otworzyć pliku. Plik może być otwarty w innym programie.\n\n;");
			return 0;
			}
		
		if (!feof(plik))
		{
			fscanf(plik, "%f;%f\n", &x, &y);
			temp = realloc(*tab1, 1 * sizeof(float));
			if (temp != NULL)
				*tab1 = temp;
			else {
				printf("Błąd realokacji tablicy\n");
				return 0;
			}

			(*tab1)[0] = y;
			a = x;
			printf("%d\n", i);

		}
		
		if (!feof(plik))
		{
			fscanf(plik, "%f;%f\n", &x, &y);
			temp = realloc(*tab1, 2 * sizeof(float));
			if (temp != NULL)
				*tab1 = temp;
			else {
				printf("Błąd realokacji tablicy\n");
				return 0;
			}

			(*tab1)[1] = y;

			printf("%d\n", i);

		}
		wsp[4] = a;
		float k;
		k = x - a;
		
		while(!feof(plik))
		{
			i++;
			temp = realloc(*tab1, i * sizeof(float));
			if (temp != NULL)
				*tab1 = temp;
			else {
				printf("Błąd realokacji tablicy\n");
				return 0;
			}
			
			fscanf(plik, "%f;%f\n", &x, &y);
			(*tab1)[i - 1] = y;
			printf("%d\n", i);
		
		}

		wsp[5] = a + (i - 1)*k;
		wsp[6] = i;
	fclose(plik);
	
	

}

void szum(float tab[], float wsp[])
{
	srand(time(NULL));
	int p = (rand() % 21); //Procent zaszumionych próbek
	int zp = (p*wsp[6] / 100); //Ilość zaszumionych próbek
	int* np;
	np = calloc(zp, sizeof(int));//Tablica z numerami zaszumionych próbek
	int i;
	
	for (i = 0; i < zp; i++)
	{
		np[i] = rand() % ((int)wsp[6] + 1);
		printf("NUMER%d\n", np[i]);
	}
	
	for (i = 0; i < zp; i++)
	{
		tab[np[i]] = (((float)(rand() % 201) - 100)/100);
			printf("LICZBA%f\n", tab[np[i]]);
	}
	free(np);
	printf("Szum został dodany.\n\n");

}

void filtrs(float tab1[], float tab2[], float wsp[])
{
	float okno[5];
	int i;
	float s;
	tab2[0] = tab1[0];
	tab2[1] = tab1[1];

	for (i = 0; i < (wsp[6]-2); i++)
	{
		okno[0] = tab2[i];
		okno[1] = tab2[i + 1];
		okno[2] = tab1[i + 2];
		okno[3] = tab1[i + 3];
		okno[4] = tab1[i + 4];
		s = (okno[0] + okno[1] + okno[2] + okno[3] + okno[4]) / 5;
		tab2[i + 2] = s;
	}

	tab2[(int)wsp[6] - 2] = tab1[(int)wsp[6] - 2];
	tab2[(int)wsp[6] - 1] = tab1[(int)wsp[6] - 1];


}

void filtrm(float tab1[], float tab2[], float wsp[])
{
	float okno[5];
	int i;
	tab2[0] = tab1[0];
	tab2[1] = tab1[1];

	for (i = 0; i < (wsp[6] - 2); i++)
	{
		okno[0] = tab2[i];
		okno[1] = tab2[i + 1];
		okno[2] = tab1[i + 2];
		okno[3] = tab1[i + 3];
		okno[4] = tab1[i + 4];

		
		int m, n;
		float temp;
			for (m = 0; m<4; m++)
			{
				for (n = 0; n<4 - m; n++)
				{
					if (okno[n] > okno[n + 1])
					{
						temp = okno[n + 1];
						okno[n + 1] = okno[n];
						okno[n] = temp;
					}
				}
				
			}
			tab2[i + 2] = okno[2];
			
	}

	tab2[(int)wsp[6] - 2] = tab1[(int)wsp[6] - 2];
	tab2[(int)wsp[6] - 1] = tab1[(int)wsp[6] - 1];

}

int zapis(float tab1[], float tab2[], float tab3[], float wsp[])
{
	int i;
	float k;
	FILE *tablica1;
	FILE *tablica2;
	FILE *tablica3;
	
		tablica1 = fopen("C:\\tablica1.csv", "w");
			if (tablica1 == NULL)
				{
					printf("Nie można otworzyć pliku 'tablica1.csv'. Plik może być otwarty w innym programie.\n\n;");
					return 0;
				}
			else {
					for (i = 0; i < wsp[6]; i++)
					{
						k = *(wsp + 4) + i*((*(wsp + 5) - *(wsp + 4)) / *(wsp + 6)); //Przyrost argumentu
						fprintf(tablica1, "%f;%f\n", k, tab1[i]);
					}
					fclose(tablica1);
				}
	
		tablica2 = fopen("C:\\tablica2.csv", "w");
			if (tablica2 == NULL)
				{
					printf("Nie można otworzyć pliku 'tablica2.csv'. Plik może być otwarty w innym programie.\n\n;");
					return 0;
				}
			else {
					for (i = 0; i < wsp[6]; i++)
					{	
						k = *(wsp + 4) + i*((*(wsp + 5) - *(wsp + 4)) / *(wsp + 6));
						fprintf(tablica2, "%f;%f\n", k, tab2[i]);
					}
					fclose(tablica2);
				}
		
		tablica3 = fopen("C:\\tablica3.csv", "w");
			if (tablica3 == NULL)
				{
					printf("Nie można otworzyć pliku'tablica3.csv'. Plik może być otwarty w innym programie.\n\n;");
					return 0;
				}
			else {
					for (i = 0; i < wsp[6]; i++)
					{
						k = *(wsp + 4) + i*((*(wsp + 5) - *(wsp + 4)) / *(wsp + 6));
						fprintf(tablica3, "%f;%f\n", k, tab3[i]);
					}
					fclose(tablica3);
				}
}

void drukuj(float tab[], float wsp[])
{
	int i;
	for(i=0; i<wsp[6]; i++)
	{
		printf("%f\n", tab[i]);
	}
}

int main()
{
	setlocale(LC_ALL, "polish_poland");
	int n=0;
	float twsp[7];
	int *twynik;
	int *zwynik;
	int *owynik;
	int r = 0;
	twynik = calloc(1, sizeof(float));
	zwynik = calloc(1, sizeof(float));
	owynik = calloc(1, sizeof(float));
	

	do
	{
		printf("1.Generuj sygnał\n2.Wczytaj sygnał\n3.Zaszum sygnał\n4.Filtruj(średnia ruchoma)\n5.Filtruj(mediana)\n6.Zapisz sygnał\n7.Zakończ program\n");
		scanf("%d", &n);

		switch (n)
		{
		case 1:
			system("cls");
			wspolczynniki(twsp);


			int *temp;
			temp = realloc(twynik, twsp[6] * sizeof(float));
			if (temp != NULL)
				twynik = temp;
			else
				printf("Błąd realokacji tablicy\n");


			temp = realloc(zwynik, twsp[6] * sizeof(float));
			if (temp != NULL)
				zwynik = temp;
			else
				printf("Błąd realokacji tablicy\n");


			funkcja(twsp, twynik);
			r = 1;
			break;

		case 2:
			odczyt(&twynik, twsp);
			r = 1;
			printf("%f,%f,%f", *(twsp + 4), *(twsp + 5), *(twsp + 6));
			break;

		case 3:
			if (!r)
				{
					system("cls");
					printf("Brak danych do zaszumienia\n\n");
				}
			
			else
				{
					system("cls");
					int i;
					realloc(zwynik, twsp[6] * sizeof(float));
					for (i = 0; i < twsp[6]; i++)
						zwynik[i] = twynik[i];
					
					szum(zwynik, twsp);
				}
			break;
				
			
			case 4:
				if (!r)
				{
					system("cls");
					printf("Brak danych do filtracji\n\n");
				}

				else
				{
					system("cls");
					owynik = realloc(owynik, twsp[6] * sizeof(float));
					filtrs(zwynik, owynik, twsp);
					break;
				}
			
			case 5:
				if (!r)
				{
					system("cls");
					printf("Brak danych do filtracji\n\n");
				}

				else
				{
					system("cls");
					owynik = realloc(owynik, twsp[6] * sizeof(float));
					filtrm(zwynik, owynik, twsp);
				}
				break;
			
			case 6:
				if (!r)
				{
					system("cls");
					printf("Brak danych do zapisu\n\n");
				}

				else
				{
					system("cls");
					zapis(twynik, zwynik, owynik, twsp);
				}
				break;
				
			case 7:
				n = 7;
				break;
			
			case 8:
				drukuj(twynik, twsp);
				break;

			default:
				system("cls");
				printf("Nie ma takiej opcji\n\n");
				break;
			}

	} while (n != 7);
	
	free(owynik);
	free(twynik);
	free(zwynik);
	return 0;
}

 


Viewing all articles
Browse latest Browse all 65225

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>