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

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




 подсчет числа пиков сигнала в Matlab
Дан синусоидальный высокочастотный сигнал промодулированный сигналом маятника.(то есть сгустки,небольшое разрежение в точке остановки и снова сгустки)
Задача - посчитать количество максимумов в "сгустках".
Я хотел написал программу на 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)есть ли какая нибудь фунция поиска максимумов?

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

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


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

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

 
Аватара пользователя
linder писал(а):
Это вы откуда вычитали?

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

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


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

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

 
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

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

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

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

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

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

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

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

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

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


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