Мне трудно понять, как сформировать треугольную (не пилообразную) волну из синусоиды.
Я понимаю, как создать его для прямоугольной волны:
if( sineValue >= 0 )
value = amp;
else
value = -amp;
Но я не уверен, как изменить это, чтобы приспособиться к треугольной волне.
Ответ 1 · рейтинг 5 · Oliver Charlesworth
Треугольная волна является интегралом прямоугольной волны. Итак, вам нужно интегрировать (суммировать) вашу прямоугольную волну с течением времени:
if (sineValue >= 0)
{
value += delta;
}
else
{
value -= delta;
}
Обратите внимание, что это можно записать более кратко как:
value += (sineValue >= 0) ? delta : -delta;
Ответ 2 · рейтинг 3 · DeltaEnfieldWaid
Я пропустил этот вопрос, вот очень крутой математический трюк:
ASIN (соз (х)) / 1,5708
то же самое с синусом:
Acos(Sin(x))/1.5708 // is a square version of sin(x)
точное значение делителя примерно такое же, 1,5708....
Ответ 3 · рейтинг 1 · Paul R
Вы можете использовать знак производной вашей синусоиды для создания треугольной волны следующим образом:
if (sineValue - oldSineValue >= 0)
{
value += delta;
}
else
{
value -= delta;
}
oldSineValue = sineValue;
Вам нужно будет выбрать дельту, чтобы получить требуемую амплитуду для вашей треугольной волны, и это, конечно, будет зависеть от частоты синусоиды и частоты дискретизации.
Преимущество этого метода в том, что треугольная волна и синусоида имеют одинаковую фазу, т.е. пики и пересечения нуля совпадают.