2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 подсчет числа пиков сигнала в Matlab
Сообщение11.12.2007, 14:48 


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


23/12/05
12046
Могу предложить оригинальный алгоритм без циклов:

Считаю, что в массиве 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 


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

 Профиль  
                  
 
 
Сообщение12.12.2007, 01:26 
Экс-модератор
Аватара пользователя


23/12/05
12046
linder писал(а):
Это вы откуда вычитали?

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

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


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

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

 Профиль  
                  
 
 
Сообщение12.12.2007, 04:00 
Заслуженный участник


15/05/05
3445
USA
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 


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

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

 Профиль  
                  
 
 
Сообщение15.12.2007, 00:01 
Экс-модератор
Аватара пользователя


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

 Профиль  
                  
 
 
Сообщение17.12.2007, 16:13 


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

 Профиль  
                  
 
 
Сообщение17.12.2007, 16:31 
Экс-модератор
Аватара пользователя


23/12/05
12046
linder писал(а):
1)а можно поподробнее по поводу апроксимаций

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

 Профиль  
                  
 
 Re: подсчет числа пиков сигнала в Matlab
Сообщение19.12.2007, 09:12 


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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group