Существует ли короткая функция, которая генерирует треугольную волну?

4 ответа

x = m - abs(i % (2*m) - m)
22
ответ дан 24 November 2019 в 17:06
поделиться

Попробуйте следующее:

x = m - abs(m - 2*(i++ % m))
0
ответ дан 24 November 2019 в 17:06
поделиться

Треугольная волна

y = abs((x++ % 6) - 3);

Это дает треугольную волну с периодом 6, колеблющуюся между 3 и 0.

Прямоугольная волна

y = (x++ % 6) < 3 ? 3 : 0;

Это дает правильную прямоугольную волну с периодом 6, колеблющуюся между 3 и 0.

Синусоидальная волна

y = 3 * sin((float)x / 10);

Это дает синусоидальную волну с периодом 20 пи , колеблющуюся между 3 и -3.


Обновление:

Curvy Triangular Wave

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

Вогнутые кривые (т.е. форма x ^ 2 ):

y = pow(abs((x++ % 6) - 3), 2.0);

Вогнутые кривые (например, sqrt (x) shape):

y = pow(abs((x++ % 6) - 3), 0.5);

В качестве альтернативы использованию функции pow вы можете просто определить функцию квадрат и использовать функция sqrt в math.h ,что, вероятно, немного улучшит производительность.

Кроме того, если вы хотите сделать кривые более крутыми / более мелкими, просто попробуйте изменить индексы.


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

90
ответ дан 24 November 2019 в 17:06
поделиться
y = abs( amplitude - x % (2*amplitude) )

Для изменения длины волны нужен коэффициент x .

Редактировать: То, что я называю амплитудой, на самом деле не амплитуда, а максимальное значение (например, 5, если кривая колеблется между 0 и 5). Амплитуда в математическом смысле вдвое меньше. Но вы поняли.

5
ответ дан 24 November 2019 в 17:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: