Я думаю, что все эти ответы пока довольно плохие (включая мой предыдущий ...)
немного подумав над проблемой, я бы предложил следующее:
1) взять 1-секундную выборку входного сигнала (он не должен быть таким большим, но несколько упрощает)
2) в течение всей секунды считайте пересечения нуля. в этот момент у вас есть cps (циклов в секунду) и вы знаете частоту осциллятора. (на случай, если это то, что вы хотели знать)
3) теперь возьмите меньший сегмент выборки для работы: возьмите ровно 7 пересечений нуля. (поэтому ваш рабочий буфер должен теперь, если он визуализирован, выглядеть как одно из графических представлений, которые вы разместили с исходным вопросом.) Используйте этот небольшой рабочий буфер для выполнения следующих тестов. (нормализация рабочего буфера в этот момент может облегчить жизнь)
4) тест для прямоугольной волны: пересечения нуля для прямоугольной волны всегда очень большие различия, ищите большую дельту сигнала с последующим небольшим или нулевым движением до следующего пересечения нуля.
5) проверка на пилообразную волну: аналогично прямоугольной, но за большой дельтой сигнала последует линейная постоянная дельта сигнала.
6) тест для треугольной волны: линейная постоянная (малая) дельта сигнала. найдите пики, разделите на расстояние между ними и вычислите, как должна выглядеть треугольная волна (в идеале), чтобы проверить реальный сигнал на отклонение. установите порог отклонения отклонения, и вы сможете определить, смотрите ли вы на треугольник или синус (или что-то параболическое).