![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как найти пики в массиве? [D6, D7]
Lem © (2006-09-08 11:45:00)Добрый день! Помогите пожалуйста с поиском максимумов в массиве:
time[i]:array of doble;
ch1[i]: array of doble;
Мне надо находить пики значений в ch1[i] и запоминать значения time[i] при этих пиках. Но прикол в том,что пики ch1[i] разные по величине, но выше 3 (Диапазон значений 0-5,12), и максимальное значение может быть при мноргих i. С виду всё просто, но уменя не складываються вложенные циклы. Пример значений ch1[i]:1.1;1.5;1.3;2.5;2.4;3;2.9;3.8;
4.2;4.5;4.5;4.5;4.5;3.2;2.5;1.1;1.5;3.3;4.8;5.1;5.1;4.8;4.7;5;4.6;4.5;4.1;3.5;2. 8;1.2... Helpnullnull
Сергей М. (2006-09-14 11:55:00) [1]
> Анализировать спектр не совсем правильно
Это почему же ?
Как раз и правильно, коль скоро у тебя куча гармоник, судя по рисунку ..
> Максимаьлные обороты до 400 об/мин.
Не всякая аудиокарта (тем более из разряда ширпотреба) сможет обеспечить 48-килогерцовую оцифровку. А тебе нужно как раз не менее 48кгц, а еще лучше 96кгц
Lem (2006-09-14 10:22:00) [2]Анализировать спектр не совсем правильно, измеряется частота как на входе, так и на выходе и сравниваютяся между собой. Максимаьлные обороты до 400 об/мин.
Сергей М. (2006-09-13 11:00:00) [3]
> Всё сводиться к измерению частоты вращения
Тогда ты не в ту сторону движешься.
Тебе не пики нужно искать, а спектр анализировать ..
> так как для данной задачи хватает частота дискретизации
> времени 50 кГц, то в результате было принято решение в качестве
> АЦП попробывать использовать самое простое и дешёвое - звуковая
> карта
А какова макс.возможная скорость вращения ?
Lem (2006-09-13 10:46:00) [4]Проблема измерения пиков возникла поскольку ch1 - сигнал от датчиков, a time и в Африке time. Всё сводиться к измерению частоты вращения. А что кассается риэлтайм-обработки - было бы очени круто, но не хватило таланта программирования (по образованию я автомобилист), так как для данной задачи хватает частота дискретизации времени 50 кГц, то в результате было принято решение в качестве АЦП попробывать использовать самое простое и дешёвое - звуковая карта (а главное везде есть). Что окончательно выйдет не совсем понятно, но то что сигнал от датчиков регистрируется чётко это факт.
Огромное всем спасибо !!! null
Сергей М. (2006-09-12 14:03:00) [5]И, кстати, в связи с чем возникла задача определения значений "пиков" в потоке оцифрованных данных ?
Сергей М. (2006-09-12 13:47:00) [6]
> проблема в том,что эти массивы могут быть огромной длинны
> (данные с АЦП)
Зачем же поток оцифрованных данных писать в бешеного размера массив ?
Или тебя не интересует их риэлтайм-обработка ?
Сергей М. (2006-09-12 13:36:00) [7]
> Lem (12.09.06 12:56) [24]
Перед поиском "пиков" удали повторяющиеся значения, тогда алгоритм в [7] будет применим.
Думкин (2006-09-12 13:31:00) [8]
> for i:=1 to Pred(length(a)) do begin
> if (a[i+1]>Max) and (a[i+1]>3) then begin
так верно:
for i:=1 to Pred(length(a)) do begin
if (a[i]>Max) and (a[i]>3) then begin
MaxI := i;
Max := a[i];
Думкин (2006-09-12 13:29:00) [9]Использованы строггие неравенства - что не верно. Надо чтобы одно из них было нестрогим - какое - решать вам.
Думкин (2006-09-12 13:27:00) [10]> Lem (12.09.06 12:56) [24]
Про производную не надо начинать. Это увод в сторону. Нет тут производных. Из всех сплайнов выбран линейный и на нем нечто строится.
Ищем максимум в массиве, но запоминаем его только в том случае, если мах значение еще и больше порога.
Max := a[0];
MaxI := 0;
for i:=1 to Pred(length(a)) do begin
if (a[i+1]>Max) and (a[i+1]>3) then begin
MaxI := i+1;
Max := a[i+1];
end;
end;
if Max < 3 then ShowMessage('фигвам')
else ShowMessage(Format('Пик %f достигнут например в точке %d',[Max,MaxI]));
Lem (2006-09-12 12:56:00) [11]Уважвемые мастера, проблема в том,что эти массивы могут быть огромной длинны (данные с АЦП) ,пик - это максимальное значение дискретной кривой, которая получается при обрезании значений меньше 3, лучше покажу:
**** -пик *** *
... . . ****** . . . .
. . . . . .. .. .. . . . .
.. .. .. . .. . ** . . . . .
3___________________.___._______________.__._.__.________.__._ .___
. . . . . . ...
Производная в данной задаче будет равна нулю и в пиках и в локальных экстремумах. Пик может иметь и одно значение (последнее значение) - как тут можно найти производную? Я сам технарь, в программировании не силён, но пришлось елемент моего маразма привожу, может хоть идею поймёте,или подскажите что-то лучше.
i,k,j :integer;
a,Ch1,t :array of double;
for i:=0 to n-1 do begin
if Ch1[i]>3 then begin
inc(j);
a[i]:=Ch1[i];
end else
begin
if j<>0 then begin
for k:=i-j to i do begin
if a[k-1]<a[k] then t[k]:=a[k] else t[k]:=0;
end;
end;
a[i]:=0;
j:=0;
end;
Думкин (2006-09-08 13:08:00) [12]> Сергей М. © (08.09.06 12:58) [21]
Не будем. Но это все-таки иное, - не производная.
закончил.
StriderMan (2006-09-08 12:59:00) [13]
> Думкин © (08.09.06 12:55) [20]
> А у автора скорее всего проще - лаба или зачет. С прошлого
> года.
наверняка. тока наше решение врят-ли поможет, решать наверное полагается так, как рассказывали на занятиях. с использованием штатных средств из Численных Методов.
Сергей М. (2006-09-08 12:58:00) [14]
> Надо просто исходить из понятия возрастает/убывает
Из него и исходим)
Давай уже дурака валять не будем, ок ?)
В массиве - ломаная линия, пользуем геометр.смысл производной в безусловном утверждении, что приращение аргумента постоянно и равно 1, в дискретизации, как понимаем, - бесконечно малое значение, "стремящееся к нулю".
Продолжать ? Или закончим дурацкую дискуссию ?)
Предлагаю закончить)
Думкин (2006-09-08 12:55:00) [15]> StriderMan © (08.09.06 12:49) [19]
С этого и надо начинать. :)
А у автора скорее всего проще - лаба или зачет. С прошлого года.
StriderMan (2006-09-08 12:49:00) [16]
> Думкин © (08.09.06 12:46) [18]
.дискретные данные, функция непрерывна. а погрешность накопилась из ошибок измерения и ошибки дискретизации
Думкин (2006-09-08 12:46:00) [17]> StriderMan © (08.09.06 12:43) [17]
Метод или шметод - я не спорю. Безусловно работает - а иначе как?
Или вы о том что находили пики в непрерывном имея дискретные данные? И поэтому ошибка?
Ведь если под пиками понимать ваши пики - то в приведенной задаче с ошибкой 0% они находятся.
StriderMan (2006-09-08 12:43:00) [18]
> Думкин © (08.09.06 12:39) [15]
> Засчитано. :) Но это же смешно. :)
а мы, технари, вообще веселый народ :)
на практике как ни странно работает.
таким методом я находил максимумы в интерференционной картины по данным, полученным при проходе датчика вдоль оси симметрии этой самой картины. максимальная ошибка получилась около 3%
Думкин (2006-09-08 12:43:00) [19]А считать не надо, потому что и нельзя. Надо просто исходить из понятия возрастает/убывает - это уже для любых функций на множествах с линейным порядком определено, что и видим.
Но понятия пика так и не увидел. В чем проблемы автора - так и не понял.
Думкин (2006-09-08 12:39:00) [20]> StriderMan © (08.09.06 12:37) [14]
Засчитано. :) Но это же смешно. :)