Генерация волн значительно проще, чем их идентификация. У меня есть небольшой проект, который делает некоторые волны. Вот пример из моего проекта :
float amplitude;
switch (sound->wavetype)
{
case LA_SQUARE:
amplitude = sound->theta > .5 ? 1.0 : -1.0;
break;
case LA_SINE:
amplitude = sin(2 * PI * sound->theta);
break;
case LA_TRIANGLE:
amplitude = sound->theta > .5 ? 4 * sound->theta - 3 : -4 * sound->theta + 1;
break;
case LA_SAWTOOTH:
amplitude = 2 * sound->theta - 1.0;
break;
case LA_NOISE:
amplitude = ((float)rand() / RAND_MAX);
break;
default:
;
}
theta
здесь обновляется в каждом кадре вдоль формы волны и зависит от частоты волны, которую вы создаете.
Что касается идентификации волн, если вы знаете, что будете получать простые, несмешанные квадратные, треугольные или синусоидальные волны, вы, вероятно, можете просто провести несколько простых тестов. Посмотрите на изменение амплитуды в любых двух точках вдоль волны. Если они одинаковые, прямоугольная волна. Если они изменяются линейно (то есть, если изменение амплитуды постоянно), у вас есть треугольная волна (или пилообразная, если вы делаете это различие). В противном случае, это синусоида. Имейте в виду, что эта проверка работает, только если вы ожидаете только эти типы волн, и они не смешиваются или что-то еще. Я могу подумать о некоторых других крайних случаях, но я позволю вам беспокоиться об этом.
Если вы делаете что-то более необычное, вам, вероятно, нужно поискать книгу, которая специализируется на подобных вещах, например, предложенную в разделе комментариев.