Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как найти пики в массиве? [D6, D7]


Страницы:   1 2

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... Help null null


Сергей М.   (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]

Засчитано. :) Но это же смешно. :)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо