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

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

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

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

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


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


Ответы (3)


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

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

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

value += (sineValue >= 0) ? delta : -delta;
person Oliver Charlesworth    schedule 13.09.2011
comment
@ Томалак: Да. Но это другой вопрос (это зависит от частоты синусоиды. И если вы знаете частоту синусоиды, то вы можете сгенерировать треугольную волну априори!) - person Oliver Charlesworth; 13.09.2011
comment
Зачем вообще возиться с данными о синусоиде в этом случае? Легче просто построить треугольную волну с нуля. Но это только подчеркивает вопросы @Tomalak Geret'kal к ОП... - person tenfour; 13.09.2011
comment
Ну, вы можете преобразовать синусоидальные значения обратно в фазовые сдвиги и построить из них треугольную форму волны... - person tdammers; 13.09.2011
comment
@tdammers: это довольно сложно; учитывая произвольный образец синусоиды, как вы определяете ее фазу? В любом случае, все, что вам нужно знать, это то, что на половине единичного круга мы увеличиваем выходную мощность треугольной волны; для другой половины мы уменьшаем. - person Oliver Charlesworth; 13.09.2011
comment
Всем спасибо! Это именно то, что мне было нужно :) К сожалению, моя программа требует, чтобы она выводила ее из синусоиды по другим причинам. Я смогу сам рассчитать дельту, так что этот ответ работает. - person Moonlight293; 13.09.2011

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

ASIN (соз (х)) / 1,5708 <- нажмите для просмотра графика

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

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

точное значение делителя примерно такое же, 1,5708....

person DeltaEnfieldWaid    schedule 17.04.2016
comment
Точное значение M_PI_2. - person Ruslan; 17.03.2019

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

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

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

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

person Paul R    schedule 13.09.2011
comment
Почему производная синусоиды? - person Oliver Charlesworth; 13.09.2011
comment
@Oli: нелегко объяснить без диаграммы, но если вы хотите, чтобы пересечения нуля и пики совпадали, то использование производной - один из способов добиться этого. Везде, где производная синусоиды положительна, вы хотите, чтобы производная треугольной волны была положительной и постоянной, и наоборот для отрицательного случая. - person Paul R; 13.09.2011
comment
О, я понимаю, что это приведет к сдвигу фазы на 90 градусов по сравнению с использованием sineValue напрямую. Конечно. - person Oliver Charlesworth; 13.09.2011
comment
Другой способ взглянуть на это состоит в том, что взятие производной (или даже интегрирование) синусоиды дает сдвиг фазы на 90 градусов. - person Paul R; 13.09.2011