Создание волны треугольника из волны синуса в C ++ - PullRequest
0 голосов
/ 13 сентября 2011

У меня проблемы с поиском, как из треугольной волны сформировать треугольную (не пилообразную) волну.

Я понимаю, как создать его для прямоугольной волны:

if( sineValue >= 0 )
        value = amp;
    else
        value = -amp;

Но я не уверен, как изменить это, чтобы приспособиться к треугольной волне.

Ответы [ 3 ]

4 голосов
/ 13 сентября 2011

Треугольная волна - это интеграл прямоугольной волны. Поэтому вам нужно интегрировать (суммировать) вашу прямоугольную волну с течением времени:

if (sineValue >= 0)
{
    value += delta;
}
else
{
    value -= delta;
}

Обратите внимание, что это можно записать более кратко, как:

value += (sineValue >= 0) ? delta : -delta;
2 голосов
/ 17 апреля 2016

Я пропустил этот вопрос, вот очень крутой математический трюк:

asin (cos (x)) / 1.5708 <- щелкните по нему, чтобы увидеть график </p>

то же самое с синусом:

   Acos(Sin(x))/1.5708 // is a square version of sin(x)

точное значение делителя - что-то из этого кидна, 1.5708 ....

1 голос
/ 13 сентября 2011

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

if (sineValue - oldSineValue >= 0)
{
    value += delta;
}
else
{
    value -= delta;
}
oldSineValue = sineValue;

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

Преимущество этого метода состоит в том, что треугольная волна и синусоида имеют одинаковую фазу, то есть пики и пересечения нуля совпадают.

...