Анализ данных с термодатчиков и трубки Флейша?
С температурами всё достаточно просто, графики без шумов. Можно брать локальные минимумы/максимумы, просто перебираете весь массив считая разницу между значениями в текущей и в следующей точках меняет знак, то записываете точку как локальный экстремум.d = V[1]-V[0];
for (i = 1; i < N-1, i++) {
    d1 = V[i+1]-V[i];
    if (d < 0 && d1 > 0) {
        // Локальный минимум V[i]
    } else if (d > 0 && d1 < 0) {
        // Локальный максимум V[i]
    }
    d = d1;
}
Для объёма график с шумами, если уровень шумов заранее известен, то его можно исключить игнорируя разницу, попадающую в уровень шума. Для нахождения середины перегиба в этом случае можно анализировать два перехода - от повышения к нулю и от нуля к снижению (наоборот для нижнего перегиба)  и брать значение в середине перегиба или среднее значение между крайними точками перегиба.noise = 2; // Уровень шума, поставить нужное значение
t1 = 0; // Точка перехода к нулю
upDown = 0; // Направление движения до нуля, > 0 - вверх, < 0 - вниз, 0 - начало графика
d = V[1]-V[0];
if (abs(d) < noise)
    d = 0;
for (i = 1; i < N-1, i++) {
    d1 = V[i+1]-V[i];
    if (abs(d1) < noise)
        d1 = 0;
    if (d < 0 && d1 > 0) {
        // Локальный минимум V[i]
    } else if (d > 0 && d1 > 0) {
        // Локальный максимум V[i]
    } else if (d != 0 && d1 == 0) {
        t1 = i;
        upDown = d;
    } else if (d == 0 && d1 > 0 && upDown < 0) {
        // Локальный минимум V[(t1+i)/2] или (V[t1]+V[i])/2
    } else if (d == 0 && d1 < 0 && upDown > 0) {
        // Локальный максимум V[(t1+i)/2] или (V[t1]+V[i])/2
    }
    d = d1;
}
Для отсеивания шума можно использовать фильтр какой то, например KSmooth или фильтр Гаусса, ну а дальше по производным искать как говорил Rsa97. Не знаю как будет с точностью, но на первый взгляд для определения циклов (имею ввиду их периоды) должны быть вполне приемлемая точность