Преобразование синусоидальной или треугольной волны в пилообразную волну

Я пытаюсь генерировать различные формы волны в 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;

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

0

Решение

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

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]