Генерировать волны значительно проще, чем их идентифицировать. У меня есть небольшой проект, который занимается генерацией волн. Вот пример из моего проекта:
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
здесь обновляется в каждом кадре формы волны и зависит от частоты волны, которую вы создаете.
Что касается идентификации волн, если вы знаете, что получите простые несмешанные квадратные, треугольные или синусоидальные волны, вы, вероятно, можете просто провести несколько простых тестов. Посмотрите на изменение амплитуды в любых двух точках вдоль волны. Если они одинаковые, прямоугольная волна. Если они изменяются линейно (то есть, если изменение амплитуды постоянно), у вас есть треугольная волна (или пилообразная, если вы делаете это различие). В противном случае это синусоида. Имейте в виду, что эта проверка работает только в том случае, если вы ожидаете только эти типы волн, и они не смешиваются или что-то в этом роде. Есть и другие пограничные случаи, о которых я могу думать, но я позволю вам побеспокоиться об этом.
Если вы делаете что-то более необычное, вам, вероятно, понадобится найти книгу, которая специализируется на такого рода вещах, например, предложенную в разделе комментариев.
person
Alex
schedule
14.09.2011