Przetwarzanie sygnałów.

0

Nie wiem w ogóle jak wytworzyć sygnał w języku C. A mam zrobić program generujący sygnał arcsin (omegat) o podanej przez użytkownika częstotliwości, amplitudzie. Ma on trwać przez odcinek czasu równy liczbie okresów podanych przez użytkownika. Na tym sygnale powinien wygenerować się sygnał losowy zakłócenia ( szpilka o podanym przez użytkownika prawdopodobieństwie występowania oraz amplitudzie). I te dwa sygnały mają się do siebie dodać. I trzeba zapisać te sygnały(niezaszumiony, szum, zaszumiony) do plików csv. I format ma wyglądać ( # - komentarz, t - czas, a - wartość sygnału)

Na razie napisałam tylko tyle:

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

int Amplituda;
int Okres;
int Czestotliwosc;
int Liczba;
int Prawdopodobienstwo;



int main()

{
	while (Liczba <= 8)
	{
		printf("Podaj Liczbe: ");
		scanf("%d", &Liczba);

		switch (Liczba = 0)
		{
			case 1:
			printf("Podaj inna Liczbe: ");
			scanf("%d", &Liczba);
			break;

			case 2:
			printf("Podaj Amplitude: ");
			scanf("%d", &Amplituda);
			break;

			case 3:
			printf("Podaj Okres: ");
			scanf("%d", &Okres);
			break;
			
			case 4:
			printf("Podaj Czestotliwosc: ");
			scanf("%d", &Czestotliwosc);
			break;

			case 5:
			printf("Podaj Prawdopodobienstwo: ");
			scanf("%d", &Prawdopodobienstwo);
			break;


		}



	}
	return 0;
} 

I jeszcze jedno jak w Microsoft Visual Studio zrobić, żeby nie wyrzucał błędu użycia polecenia scanf. Dziękuję za pomoc

1

Co ten Twój kod ma robić?

I jeszcze jedno jak w Microsoft Visual Studio zrobić, żeby nie wyrzucał błędu użycia polecenia scanf.

To zdanie ma sens podobny do co zrobić, aby auto kluczyki szyba do mycia.

0

Widzę, że ktoś z Pwr zadanie robi ;)
jeśli chodzi i treść zadania to wydaje mi się, że "Generować sygnał" znaczy tyle co "utworzenie tablicy z wartościami funkcji arcsin (omega*t), gdzie omega i t jest wyliczane na podstawie danych wpisanych przez użytkownika. Sygnał ma być wyliczany od zera co odstęp czasu równy rozdzielczości do osiągnięcia wartości równej t". Niestety też się głowię nad prawdopodobieństwem występowania zakłócenia :/

1

Rozkład normalny o zdanym σ (μ = 0)? Jeśli koniecznie C to masz transformację Boxa-Mullera, którą możesz zaaplikować do dowolnego generatora o rozkładzie jednorodnym (przykładowo rand() z stdlib.h).

0

Trochę zmieniałam, żeby od razu zapisywało do pliku, ale chyba robię to niedobrze.

#define _USE_MATH_DEFINES

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

int Amplituda;
int Okres;
int Czestotliwosc;
int Liczba=0;
int Czas=0;



int main()

{
	while (Liczba <= 8)
	{
		printf("Podaj Liczbe: ");
		scanf("%d", &Liczba);

		switch (Liczba = 0)
		{
		case 1:
			printf("Podaj inna Liczbe: ");
			scanf("%d", &Liczba);
			break;

		case 2:
			printf("Podaj Amplitude: ");
			scanf("%d", &Amplituda);
			break;

		case 3:
			printf("Podaj Okres: ");
			scanf("%d", &Okres);
			break;

		case 4:
			printf("Podaj Czestotliwosc: ");
			scanf("%d", &Czestotliwosc);
			break;

		

		}

			

		while (Okres<=Czas)
		{
			asin(Czas / (2 * M_PI*Czestotliwosc));
		}

		{
			FILE *fp; 
			char tekst[] = "Hello world";
			if ((fp = fopen("sygnal", "w")) == NULL) {
				printf("Nie mogę otworzyć pliku test.txt do zapisu!\n");
				exit(1);
			}
			fprintf(fp, "%s", tekst); 
			fclose(fp); 
			return 0;
		}



	
	
	
	
	
	}
	return 0;
}
2
        while (Okres<=Czas)
        {
            asin(Czas / (2 * M_PI*Czestotliwosc));
        }

Co to Twoim zdaniem ma robić?

switch (Liczba = 0)

To samo pytanie odnośnie tego.

Wydaje się, że zabierasz się za implementację czegoś nie mając nawet pojęcia o języku, w którym piszesz.

0

Staram się wszystko pozmieniać, ale nadal mam jakieś drobne błędy w rozumowaniu.

Czy ktoś mógłby mi powiedzieć gdzie mam błąd? I teraz chciałam napisać jeszcze tylko, żeby liczyło wartości funkcji i potem zapisywało je do pliku, ale nie wiem jak to zrobić. Bo program ma liczyć wartości na przedziale podanym przez użytkownika co konkretną daną do zmieniania. Zastanawiałam się tylko czy nie muszę robić zabezpieczenia przed tym, aby początek przedziału nie był większy od końca. Do liczenia wartości chcę użyć funkcji z biblioteki asin.

‪#‎define‬ _USE_MATH_DEFINES

‪#‎include‬ <stdlib.h>
#include <stdio.h>
#include <math.h>

int main ()

{

int i=0;
int Poczatek;
int Koniec;
int Zmiennosc;
int Sygnal;
int Zadanie;

do
{
printf ("Podaj zadanie do wykonania\n");
scanf("%d",&Zadanie);

switch(Zadanie)
{
case 1:
{
printf("1. Wprowadz Poczatek przedzialu\n");
scanf("%d",Poczatek);

if(Poczatek<=-1 && Poczatek>1)
{
printf("Podales zly poczatek przedzialu,podaj liczbe z zakresu <-1,1>\n");
scanf("%d",Poczatek);
}
}

case 2:
{
printf("2.Wprowadz Koniec przedzialu\n");
scanf("%d",Koniec);

if(Koniec<=-1 && Koniec>1 )
{
printf("Podales zly poczatek przedzialu,podaj liczbe z zakresu <-1,1>\n");
scanf("%d",Koniec);
}
}

case 3:
{
printf("Wprowadz co ile mam wyliczac wartosc\n");
scanf("%d",Zmiennosc);
}

case 4:
{
printf("Wygeneruj sygnal arcussinus");
scanf("%d",Sygnal);
}
}break;
while(Zadanie=0);
return 0;

}

Program kompiluje się, ale po uruchomieniu nie działają konkretne polecenia wyświetla się tylko prośba o podanie początku przedziału i po podaniu nawet 9 program nie wyrzuca błędu i prośby o podanie innej liczby tylko się wyłącza i wyskakuje: "Error 1 error MSB8020: The build tools for v140 (Platform Toolset = 'v140') cannot be found. To build using the v140 build tools, please install v140 build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Upgrade Solution...". C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets 64 5 ConsoleApplication1"

Dziękuję za kolejne porady.

0
#define CRT_SECURE_NO_WARNINGS


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

double Amplituda;
double Okres;
double Czestotliwosc;
int Liczba;
double Prawdopodobienstwo;
double sygnal;


int main()

{
	while (Liczba <= 8)
	{
		printf("Podaj Liczbe: ");
		scanf("%d", &Liczba);

		switch (Liczba = 1)
		{
		case 1:
			printf("Podaj inna Liczbe: ");
			scanf("%d", &Liczba);
			break;

		case 2:
			printf("Podaj Amplitude: ");
			scanf("%d", &Amplituda);
			break;

		case 3:
			printf("Podaj Okres: ");
			scanf("%d", &Okres);
			break;

		case 4:
			printf("Podaj Czestotliwosc: ");
			scanf("%d", &Czestotliwosc);
			break;

		case 5:
			printf("Podaj Prawdopodobienstwo: ");
			scanf("%d", &Prawdopodobienstwo);
			break;


		}

		int sygnal;
		const double pi = 3.141592;
		sygnal = Amplituda*(sin(Czestotliwosc * 2 * pi*Okres));
		return abs(sygnal);

	}
	return 0;
} 

Spróbowałam napisać taki kod, bo to ma być funkcja Asin(omegat) i teraz mam problem, bo nie wiem jak dołożyć do tego szum i potem zapisać w pliku, żeby to jakoś wyglądało i działało. Za każdą wskazówkę bardzo dziękuję.

0

return abs(sygnal); to nie robi tego, co ty myślisz że robi.
W sumie nie wiem co myślisz, ale to na pewno tego nie robi : P
Pętla while wykonuje się tylko raz, wyniki zapisuj sobie w tablicy.
do tego zmienna liczba jest niezainicjalizowana, i masz UB.

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