Я пытаюсь генерировать различные формы волны в 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;
Как я могу преобразовать его в пилообразную волну?
Вы не можете выполнить преобразование синусоидальной волны в пилообразную волну. Это потому, что синусоида симметрична во времени: если вы измените время, то, за исключением некоторого возможного сдвига фазы, вы получите ту же волну. Для обвальной волны обращение времени должно сочетаться с изменением знака, единственная измененная во времени версия будет выглядеть качественно иначе.
Вам нужна дополнительная информация, например, например, наклон в текущей позиции. Или вам нужен доступ к необработанному значению параметра, и в этом случае формула будет очень легко:
uint8_t sample = (amp * envelope * (phase - floor(phase));
Других решений пока нет …