Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Создание волны треугольника из волны синусоиды в C++

Автор вопроса: Moonlight293Ответов: 3

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

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

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

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

  • Нам может понадобиться дополнительная информация о том, как вы генерируете эту волну. Как это представлено? Как вы его строите? И, в конце концов, это больше математический вопрос, чем вопрос C++. Вот его математическое описание. Lightness Races in Orbit 13.09.2011
  • Кажется, он хочет иметь возможность преобразовывать значения синусоидальной волны Y в значения треугольной волны Y. Хотя это скорее математический вопрос, чем программирование. tenfour 13.09.2011
  • Я не думал о том, что это был скорее математический вопрос. Причина, по которой я спросил здесь, заключалась в том, что я манипулирую буферами звуковой волны, чтобы она создавала треугольную волну. Спасибо за вашу помощь! Moonlight293 13.09.2011

c++trigonometrygeometrywave

Ответы

Ответ 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;

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы