2015-11-09 5 views
0

Я пытаюсь создать различные формы волны в C++. До сих пор я управлял синусом, треугольником и квадратной волной, но мне не удалось понять, как создать пилообразную волну.Преобразование волны синуса или треугольника в пилообразную волну

Это как моя синусоида выглядит следующим образом:

uint8_t sample = (amp * envelope * sin(2 * M_PI * phase)) + 128; 

И это треугольная волна:

double sinevalue = sin(2 * M_PI * phase); 
uint8_t sample = (envelope * 2 * amp)/M_PI * asin(sinevalue) + 128; 

Как я могу преобразовать его в пилообразные волны?

+1

Почему вы вычисление синуса значения, а затем принимать ArcSin этого? Это кажется расчетно экстравагантным без видимых причин. – Logicrat

+0

Я имею в виду, вы можете вычислить пилообразную волну вроде этого (прямо с википедии): y (x) = - (2 * amp)/pi * arctan (cot (x * pi/period)) – mrfred

+0

@Logicrat 'arcsin (sin (x)) 'дает' x' modulo '2Pi' находиться в' [-Pi/2, Pi/2] '. Поэтому есть причина, но вы правы, что слишком много вычислений для того, что она пытается сделать. – Teepeemm

ответ

0

Вы не можете выполнить выборочное преобразование синусоидальной волны в пилообразную волну. Это потому, что синусоидальная волна симметрична по времени: если вы меняете время, то за исключением некоторого возможного фазового сдвига вы получаете одну и ту же волну. Для волны swatooth изменение времени должно сочетаться со сдвигом знака, единственная версия с обратным временем будет выглядеть качественно иначе.

Вам нужна дополнительная информация, например, например. наклон в текущем положении. Или вам нужен доступ к необработанным значению параметра, в этом случае формула будет очень легко:

uint8_t sample = (amp * envelope * (phase - floor(phase));