Sygnał sinusoidalny, trójkątny i prostokątny

0

Witam,
Na lekcji programowania robiliśmy program, którego zadaniem było wyświeltenie w konsoli kolejnych wartości sinusa by potem wkleić je do excela i zobaczyć że wygeneraowane wartości tworzą przebieg sinusoidalny.
Kod programu:

#include <iostream>
#include <math.h>

#define Rozdz 8192			//definiujemy rozdzielczosc
#define Pi 3.1415953		//definiujemy liczbe pi
#define RozmSyg 1024		//definiujemy rozmiar sygnalu

using namespace std;

float sinus[Rozdz];

int main() {
	for (int i=0;i<Rozdz;i++)			//petla liczy wartosci sinusa
	{
		sinus[i]=(sin(2*Pi/Rozdz*i);
		cout<<sinus[i]<<endl;
	}
}

W domu mam zrobić z tego sygnał trójkątny, prostokątny i piłokształtny. Pytanie tylko jak to zrobić z zastosowaniem sinusa. Nie proszę o rozwiązanie, lecz o wytłumaczenie w jaki sposób mogę "wyprostować sinusa" żeby powstał trójkąt?

2

Nie ma sensu "prostowanie sinus'a" (to brzmi jak "skocz po fazę") :-)
Wygeneruj dla połowy okresu wartość maksymalną a dla 2 części okresu minimalną i będziesz miał prostokąt.
Dla od początku do końca okresu wartości od max do min (przelicz sobie z jakim krokiem) i będziesz miał piłę.
Dla trójkąta, podziel okres na 4 części. W 1 części wartości od połowy zakresu do max, W 2 i 3 części od max do min i 4 części od min do połowy okresu. To będzie trójkąt :-)
To stosunkowo prosty program więc nie chce psuć zabawy przykładem. Chyba że się ... "zakałapućkasz" :-)

1

Nie możesz. No, znaczy możesz, ale efekt będzie taki sam, jakbyś olał tego sinusa i zrobił to normalnie — czyli od 0⁰ do 90⁰ robisz funkcję liniową rosnącą (f(x) = 2/π x), potem od 90⁰ do 270⁰ malejącą itd.

Swoją drogą, C++ to nie C, nie ma sensu używać preprocesora do robienia stałych — teraz istnieją constexpr, dużo wygodniejsze (bo pozwalają na sprawdzanie typów).

0

Co do trójkąta to zrobiłem to tak:

#include <iostream>
#include <math.h>

#define amplituda 10
#define Rozdz 8191
#define Pi 10.0

float trojkat[Rozdz];
using namespace std;
int main()
{

for(int i=0;i<Rozdz; i++)
{
	
	if (i<Rozdz/4)
	{
		trojkat[i]=(4*Pi/Rozdz*i);
	//	cout << trojkat[i]<<endl;
	}
	else if(i>=Rozdz/4 && i<3*Rozdz/4)
	{
		trojkat[i]=(-4*Pi/Rozdz*i+(2*Pi));
	//	cout << trojkat[i]<<endl;
	}
	else
	{
		trojkat[i]=(4*Pi/Rozdz*i-(4*Pi));
	//	cout << trojkat[i]<<endl;
	}
}

Niby dobrze, ale jednak jeśli później ten program zmienie i będę chciał żeby wyświetlał określoną liczbę okresów i z każdym okresem częstotliwość była większa czyli okres mniejszy to wykres jest trochę nietrójkątny w pierwszym okresie, a dalej ok + nie osiąga za każdym razem amplitudy

To Pi to jest amplituda :P

0

Użyj Pi z biblioteki standardowej:

M_PI
https://msdn.microsoft.com/en-us/library/4hwaceh6.aspx

0

Można to też zrobić w oparciu o harmoniczne:

prostokąt

y = sin(t) + (1/3) * sin (3t) + (1/5) * sin(5t) + (1/9) * sin(9*t) + ...

trójkąt:

y = sin(t) - (1/9)sin(3t) + (1/25)sin(5t) - (1/81)sin(9t) + ...

piła:

y = sin(t) - (1/2)sin(2t) + (1/3)sin(3t) - (1/4)sin(4t) + (1/5)sin(5t) - (1/6)sin(6t) + (1/7)sin(7t) - (1/8)sin(8t) + (1/9)sin(9t)

Oczywiście z określoną dokładnością, pytanie do której harmonicznej liczyć...

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