2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 подсчет числа пиков сигнала в Matlab
Сообщение11.12.2007, 14:48 
Дан синусоидальный высокочастотный сигнал промодулированный сигналом маятника.(то есть сгустки,небольшое разрежение в точке остановки и снова сгустки)
Задача - посчитать количество максимумов в "сгустках".
Я хотел написал программу на Matlab, которая бы увеличивала K, как только появлялся новый максимум и при этом добавляла к переменной итерации 10, поскольку под мои условия (я брал окрестность точки максимума) попадали сразу 2-3 точки, но этого не получилось так как matlab в цикле использует массив i, если вводить меньшую окрестность, то программа пропускала некоторые точки с погрешностью 50%.
Код:

for (i=1:1:100000)
   if  abs(y(i))<0.15 % окрестность нуля, в которую попадает значение сигнала
                       %тут все равно считать максимумы или переходы через ноль
                       %так как максимумы=(число переходов через ноль)/2
         k=k+1
         i=i+10
   end 
end


1) как можно реализовать такой алгоритм?

2) как в цикле FOR организовать запись в массив всех i-координат максимумов?(matlab же работает с фиксированными массивами - а я не знаю сколько максимумов у меня будет )


3)есть ли какая нибудь фунция поиска максимумов?

 
 
 
 
Сообщение11.12.2007, 17:11 
Аватара пользователя
Могу предложить оригинальный алгоритм без циклов:

Считаю, что в массиве A уже содержатся значения вашей функции. Тогда посчитаем число пересечений оси абсцисс так:
Код:
A=sign(A);
B=A(1:end-1).*A(2:end);
number_of_zeros=sum(abs(sign(B-1)));


Красивое решение, правда? :oops:

 
 
 
 
Сообщение12.12.2007, 01:16 
я просто в диком восторге от этого алгоритма!!!
Это вы откуда вычитали?
но все же вопрос по поводу функции перепрыгивания итераций в цикле, как это можно сделать в любом языке программирования
Код:
for (i=1:100)
if бла бла бла i=i+10
end

 
 
 
 
Сообщение12.12.2007, 01:26 
Аватара пользователя
linder писал(а):
Это вы откуда вычитали?

сразу вычитал :(... - Я его придумал, когда увидел Вашу задачу

linder писал(а):
но все же вопрос по поводу функции перепрыгивания итераций в цикле,


В Матлабе "неумно" прыгать в цикле - надо Вам брать каждое десятое значение, так и напишите A(1:10:end)

Да и вообще Матлаб - такой язык, что циклы можно использовать редко и работать при этом будет быстрее, чем с ними, порой в разы

 
 
 
 
Сообщение12.12.2007, 04:00 
linder писал(а):
...вопрос по поводу функции перепрыгивания итераций в цикле, как это можно сделать в любом языке программирования
Код:
for (i=1:100)
if бла бла бла i=i+10
end

Стандартной заменой for на while:
Код:
i=1
while i<=100
  if бла бла бла i=i+10
  i=i+1
end

 
 
 
 
Сообщение13.12.2007, 07:46 
проблема в том, что все равно приходится ,кое-что считать в ручную - на краях сгустков, поскольку там синусоида начинает шуметь и бывает так, что как раз в точки разрежения - алгоритм с SIGN насчитывает кучу переходов, но они все от шумов!

порекомендуйте мне что-нибудь в этом случае
я смотрел Singal Processing Toolbox, Filter Design Toolbox, но почему-то у меня нет HELPa по ним

 
 
 
 
Сообщение15.12.2007, 00:01 
Аватара пользователя
если Вы знаете примерно закон, по которому должен изменяться Ваш сигнал. то можете попробовать аппроксимировать сначала свои зашумленные данные функцией, удовлетворяющей этому известному закону, а потом уже для этой функции считать число пиков

 
 
 
 
Сообщение17.12.2007, 16:13 
1)а можно поподробнее по поводу апроксимаций и
еще я понял :
2)что возможно мне нужно wavelet преобразования - пытаюсь найти в HELP,но там ничего нет
3) может у меня просто не стоит этот тулбокс? как проверить?

 
 
 
 
Сообщение17.12.2007, 16:31 
Аватара пользователя
linder писал(а):
1)а можно поподробнее по поводу апроксимаций

Есть там такой тулбокс curve fitting

 
 
 
 Re: подсчет числа пиков сигнала в Matlab
Сообщение19.12.2007, 09:12 
linder писал(а):
Дан синусоидальный высокочастотный сигнал промодулированный сигналом маятника.(то есть сгустки,небольшое разрежение в точке остановки и снова сгустки)
Задача - посчитать количество максимумов в "сгустках".

Еще вариант:
Как я понял модуляция амплитудная? Тогда можно сделать Фурье преобразование сигнала. По модулю спектра найти положение высокочастотной составляющей, по разнице с верхней/нижней боковой частотой - значение частоты колебания маятника. Отношение этих частот и даст Вам число максимумов в "сгустках" (даже если это число не целое) . :)

 
 
 [ Сообщений: 10 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group