Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Анализ сигнала произвольной формы


Автор: df_3 5.8.2009, 15:20
Добрый день! Вопрос следующий:

Как получить такие характеристики сигнала, представленного на картинке в приложении, как количество пиков и среднее расстояние между пиками.
Сигнал снимается с осцилографа в виде файла со столбцом чисел. 


Автор: GoldFinch 5.8.2009, 17:00
для начала его бы отфильтровать неплохо, и смотреть на логарифмической шкале, тогда пики будут более явными

Автор: cardinal 5.8.2009, 17:24
Цитата(GoldFinch @  5.8.2009,  15:00 Найти цитируемый пост)
для начала его бы отфильтровать неплохо

Пример здесь
http://forum.vingrad.ru/index.php?showtopic=171436&view=findpost&p=1255274

Автор: GoldFinch 5.8.2009, 19:02
ну а когда данные преобразуются к нормальному виду  - шум будет убран, 
можно будет сравнить сигнал с порогом, то что выше порога - пик - то что ниже - не-пик, посчитать число пиков и среднее расстояние

Автор: df_3 6.8.2009, 10:49
пробую в матлабе. спасибо!

Автор: df_3 6.8.2009, 11:16
cardinal, я пробую ваш код, приведеный по ссылке в результате получается тотже самый сигнал... 

Сначала пришлось сделать во входном файле 2 столбца time и value (изначально был только один). После этого файл читается матлабом правильно. Может я что-то не допонимаю в коде? или функция filter() не дает нужного результата для подобного типа данных?

Код

>> hold 'on'
filename = 'E:\data.txt'
[time, value] = textread(filename,'%s %f',10000); //точно известно количество элементов в файле - 10000
s=tf('s')
z=tf('z')
H=1/(1+3*s);
Hz = c2d(H,0.25)
[num,den] = tfdata(Hz, 'v')
value_f = filter(num', den', value);
plot(value);
plot(value_f);

filename =

E:\data.txt

 
Transfer function:
s
 
 
Transfer function:
z
 
Sampling time: unspecified
 
Transfer function:
0.07996
--------
z - 0.92
 
Sampling time: 0.25

num =

        [color=red] 0  [size=8][/size][/color]  0.0800  //меня смущает этот 0


den =

    1.0000   -0.9200



Автор: cardinal 6.8.2009, 13:55
Попробуй другое значение Sampling time (более подходящее для твоего времени измерения).

Автор: df_3 6.8.2009, 14:14
это типа 

Код

Hz = c2d(H,0.000004) 


?

Автор: cardinal 6.8.2009, 14:27
Я думаю лучше 0.0000004 и меньше...

Автор: Pavia 6.8.2009, 14:46
df_3
Цитата(df_3 @  6.8.2009,  11:16 Найти цитируемый пост)
   0    0.0800  //меня смущает этот 0

Это нормально у него s имеет положительную степень  H=1/(1+3*s);
H=1*s^-1/(1*s^-1+3)=0.33*s^-1/(1+0.33*s^-1)

Функции конечно поставили с ног на голову. Но это нечиго просто сигнал будет смещен в права на 1 пункт. А вот соотношение 0.92/0.08 даст интегратор на 10 отчетов.

А вообще на первом ресунки ничего не видно на 1 пиксель 20 отчетов приходится.

Только неясно зачем такой фильтр применять? Чтобы все данные исказить?

На рисунке насколько я могу видить помимо пиков присутствует еше некоторая переодическая состовляющая вот ее я думаю надо отфильтровать, а пики считать через порог. Я вообще предлогаю Гистерезистный  порог тогда о высоко частотном шуме ненадо будет беспокоится.

Автор: cardinal 6.8.2009, 15:20
Цитата(Pavia @  6.8.2009,  12:46 Найти цитируемый пост)
Только неясно зачем такой фильтр применять? Чтобы все данные исказить?

А для чего нужен RC-фильтр? Причем тут искажение?

Автор: df_3 6.8.2009, 15:33
Цитата(cardinal @ 6.8.2009,  14:27)
Я думаю лучше 0.0000004 и меньше...

такое число потому, что это разрешение осцилографа в данном случае, который снимал данные.


получился сигнал (см. приложение)
Какие действия с ним сделать еще, что бы посчитать его характеристики?

Автор: Pavia 6.8.2009, 15:45
df_3
Возьми еще немного меньше 0.0000004 а то остался еще шум. Тогда можно будет продифиренцировать и искать максимумы.

Автор: df_3 6.8.2009, 15:53
вот чего я заметил. тот сигнал, что я привел, был сделан для семпла в 0.25... 
если ставить много меньше, то получается почти прямая типа y=x  smile 
почему так?

Автор: cardinal 6.8.2009, 16:02
df_3, нарисуй в Matlab'e две кривые рядом, чтобы понятней было, что происходит...

Автор: df_3 6.8.2009, 16:16
нефильтрованную и фильтрованную?
как нарисовать два графика в одном окне?

Автор: cardinal 6.8.2009, 16:25
Цитата(df_3 @  6.8.2009,  14:16 Найти цитируемый пост)
как нарисовать два графика в одном окне? 

Код

hold on
plot(...)
plot(...)

Автор: df_3 6.8.2009, 16:57
 вот. сделал.

Автор: cardinal 6.8.2009, 20:49
Тут
Код

H=1/(1+3*s);

вместо тройки попробуй другие значения и увидишь разницу. Это есть значение RC и соответственно, чем больше оно, тем меньше верхних частот остается (читаем http://en.wikipedia.org/wiki/Low-pass_filter), то есть тем меньше высокочастотных помех в сигнале.

Автор: df_3 7.8.2009, 00:32
поигался с числом, почитал инфу. Подобрал семплирующий коэфициент на глаз. Но может существует способ его как-то оптимально подобрать при помощи каких-то методов? 

еще вопросик:
не понятен вот этот учаток кода 

Код

Hz = c2d(H,0.25);
[num,den] = tfdata(Hz, 'v');


и что значит num'?

вот чего я наделал. Отфильтровал, дифференцировал (получается очень шумная кривая), отфильтровал(тем же фильтром), посчитал количество пересечений с осьо абсцисс. результат 40 пересечений что приблизительно равно количеству пиков "на глаз". возможен такой вариант решения задачи?

Код

hold on
filename = 'E:\WORK\juelich\2008-06\TEK00002.txt';
[time, value] = textread(filename,'%s %f',10000); 
s=tf('s');
z=tf('z');
H=1/(1+56*s);
Hz = c2d(H,0.25);
[num,den] = tfdata(Hz, 'v');
value_f = filter(num', den', value);
plot(value,'-.g')
plot(value_f, '-b')
C=diff(value_f);
Hz = c2d(H,0.25);
[num,den] = tfdata(Hz, 'v');
A = filter(num', den', C);
A=sign(A);
B=A(1:end-1).*A(2:end);
number_of_zeros=sum(abs(sign(B-1)));
number_of_zeros



Автор: cardinal 7.8.2009, 02:02
Цитата(df_3 @  6.8.2009,  22:32 Найти цитируемый пост)
и что значит num'?

http://www.mathworks.com/access/helpdesk/help/toolbox/control/index.html?/access/helpdesk/help/toolbox/control/ref/tfdata.html&http://www.google.ru/search?hl=ru&q=matlab+tfdata&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=&aq=1s&oq=

Цитата(df_3 @  6.8.2009,  22:32 Найти цитируемый пост)
возможен такой вариант решения задачи?

Возможен (т.к. любой вариант возможен), но мне "на глаз" не нравится. smile

Еще раз чуть поподробнее:
1. что это за сигнал?
2. нельзя ли измерить с меньшими помехами?
3. какой ответ (сколько пиков, расстояние между ними) ты ожидаешь?

Автор: Pavia 7.8.2009, 09:47
df_3
Цитата(df_3 @  7.8.2009,  00:32 Найти цитируемый пост)
[num,den] = tfdata(Hz, 'v');

В  справке на мотлаб написанно числитель и знаменатель передаточной функции.


Цитата(df_3 @  7.8.2009,  00:32 Найти цитируемый пост)
поигался с числом, почитал инфу. Подобрал семплирующий коэфициент на глаз. Но может существует способ его как-то оптимально подобрать при помощи каких-то методов? 


Сущществует огромное множество
http://vissim.nm.ru/audio_eq.html
Там внизу задаешь частоту среза выбераеш Фильтер Низких Частот.

Всеравно на глозок делается да и быстрее самому подобрать. 


Цитата(df_3 @  7.8.2009,  00:32 Найти цитируемый пост)
c2d(H,0.25);

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


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

Автор: df_3 7.8.2009, 10:13
Цитата

Возможен (т.к. любой вариант возможен), но мне "на глаз" не нравится. smile

мне тоже не нравится. smile

Цитата

Еще раз чуть поподробнее:
1. что это за сигнал?
2. нельзя ли измерить с меньшими помехами?
3. какой ответ (сколько пиков, расстояние между ними) ты ожидаешь? 

Цитата

А вообще неплохо знать природу сигнала чтобы подобрать фильтер.


это сигнал с осцилографа, проще говоря, каждый пик - это событие. Это количество событий нужно посчитать (в приведенном файле их около 25). Также по возможности нужно посчитать среднее расстояние между пиками (это получается частота событий).  Измерить точнее нельзя к сожалению. 

Автор: Pavia 7.8.2009, 13:04
У меня получилось 22 пика хотя 2 из них больше на шум смахивает Так что только 20.

Взял сигнал посмотрел АЧХ припомоще FFT откуда определил частоту среза. Отфильтровал сделал обратное преобразование.  
После продиференцировал.

Код

for i:=0 to n-3 do
b[i]:=a[i+2]-A[i];


Подобрал порог. 
h=0.0008 Красная горизонтальная линия.

А после вот таким вот образом посчитал число переходов через 0 с учетом порога.

Код

for i:=0 to n-1 do
 begin
 if b[i]>h then Flag:=1;
 if (b[i]<0) and (Flag=1) then
  begin
  Piks:=Piks+1;

  canvas.Pen.Color:=ClRed;
  canvas.MoveTo(Round(30+30*2+2*255*i/N),750);
  canvas.LineTo(Round(30+30*2+2*255*i/N),50);
  canvas.Pen.Color:=ClBlack;
  end;
 if b[i]<=0 then Flag:=0
 end;




В атаче рисунок вверху исходный сигнал потом отфильтрованный и внизу продиференцированный.

Автор: cardinal 7.8.2009, 13:33
Цитата(Pavia @  7.8.2009,  07:47 Найти цитируемый пост)
Без всяких обоснований.

Читаем про выскочастотные помехи и их подавление
http://www.platan.ru/library/Murata_EMI_rus.pdf
Цитата(Pavia @  7.8.2009,  07:47 Найти цитируемый пост)
А вообще недокнца понимаю как фильтеры строятся вроде казалось все понятным. Пока не начал пробовать и встал вопрос с дискретизацией как из теоретической непрерывной перевести в дискретную. Видать кроется секрет в этой функции.

H(z)= (z-1)/z *Z(H(s)/s)  (где Z это трансформация, она происходит при помощи http://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D1%86%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_Z-%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)

А так вот на тему
http://www.mathworks.com/access/helpdesk/help/toolbox/control/index.html?/access/helpdesk/help/toolbox/control/ref/c2d.html&http://www.google.ru/search?hl=ru&newwindow=1&q=h%28s%29+h%28z%29+c2d&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=&aq=f&oq=
http://www.mathworks.com/access/helpdesk/help/toolbox/control/index.html?/access/helpdesk/help/toolbox/control/manipmod/f2-3161.html&http://www.mathworks.com/access/helpdesk/help/toolbox/control/ref/c2d.html
http://www.mathworks.de/products/control/demos.html?file=/products/demos/shipping/control/notchdemo.html

Добавлено через 14 минут и 52 секунды
df_3, пользуйся кнопкой "быстрая цитата", тогда понятно будет кого ты цитируешь...
Цитата(df_3 @  7.8.2009,  08:13 Найти цитируемый пост)
это сигнал с осцилографа, проще говоря, каждый пик - это событие.

Еще раз: ЧТО конкретно измеряется?
Цитата(df_3 @  7.8.2009,  08:13 Найти цитируемый пост)
Измерить точнее нельзя к сожалению. 

тогда может станет понятно почему нельзя точнее. Есть предположение, что мы с последствиями разбираемся, а не с причиной...
Цитата(Pavia @  7.8.2009,  11:04 Найти цитируемый пост)
Взял сигнал посмотрел АЧХ припомоще FFT откуда определил частоту среза.

Покажи пожалуйста картинку, если такая есть. Интересно, что FFT показывает.

А насчет дифференциации - это неплохая мысль.

Автор: Pavia 7.8.2009, 14:01
Цитата(cardinal @  7.8.2009,  13:33 Найти цитируемый пост)
Читаем про выскочастотные помехи и их подавление

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


Цитата(cardinal @  7.8.2009,  13:33 Найти цитируемый пост)
H(z)= (z-1)/z *Z(H(s)/s)  (где Z это трансформация, она происходит при помощи таблицы основных преобразований)

Я не про ето. Я в рекурсивных фильтерах застрял. Эти преобразования я знаю. Я беру строю фильтр согласно теории и он не работает так как надо. Я вижу не соответствие, но пока доконца не разобрался. Где подвох не ясно так как никаких хитрых ухищерений нет а преобразование табличное. 

Автор: cardinal 7.8.2009, 14:24
Цитата(Pavia @  7.8.2009,  12:01 Найти цитируемый пост)
Помимо высоких частот RC портит и другии частоты откуда координаты пиков у тебя съезжают.

А какой же фильтр не портит другие частоты? Смотрим на http://ru.wikipedia.org/wiki/%D0%9B%D0%90%D0%A4%D0%A7%D0%A5. Апериодическое и колебательное звено - оба влияют не только на сигнал с частотой большей частоты среза. А все фильтры можно разбить на эти звенья. Другое дело, что их можно скомбинировать и добиться результата получше. Но опять же таки - помоему сейчас в сигнале проблема, а не в фильтре...
Цитата(Pavia @  7.8.2009,  12:01 Найти цитируемый пост)
Я в рекурсивных фильтерах застрял.

где они? smile 

Автор: Pavia 7.8.2009, 14:45
Окно Хэминга + FFT показывает что шум розовый почти белый.
Картинка семметричная так как сигнал действительный. Так что можно рассматривать правую половину.
Частоты не выводил так как нормального компонента для вывода нет.

Автор: cardinal 7.8.2009, 14:59
Ок, мерси. Ладно подождем, что скажет df_3... 

Автор: GoldFinch 7.8.2009, 15:31
при чем тут RC и прочие схемы? это все детали реализации, которые тут знать совсем не надо, вы же не паять эти фильтры собрались.

Автор: cardinal 7.8.2009, 18:42
GoldFinch, ты о чем вообще?

Автор: GoldFinch 7.8.2009, 18:59
cardinal, я о
Цитата(Pavia @  7.8.2009,  15:01 Найти цитируемый пост)
RC фильтр

Цитата(cardinal @  7.8.2009,  15:24 Найти цитируемый пост)
все фильтры можно разбить на эти звенья


тема все же о цифровой обработке сигнала,
а тут из линейных фильтров есть либо КИХ который задается произвольным массивом с коэффициентами
либо есть БИХ который задается рекуррентной формулой

Добавлено через 13 минут и 55 секунд
чтобы решить эту задачу, не мешало бы посмотреть на нее с точки зрения теории

надо из смеси сигнала с шумом выделить сигнал

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

спектр шума можно посмотреть отключив сигнал
спектр дельта функции - равномерен, 

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

Автор: cardinal 7.8.2009, 21:10
GoldFinch, возьми в руки Matlab и предложи свой вариант (а то словами то каждый горазд)... smile 

Автор: GoldFinch 7.8.2009, 23:28
матлаба под рукой небыло, был маткад
отрезал от записи сигнала 8192семпла, взял БПФ, 
увидел что примерно начиная с 45*(fдискр/8196) Гц начинается только ВЧ шум,
вырезал кусок спектра от 4 до 44 *(fдискр/8196) Гц,
сделал обратное преобразование  - получил картинку

Автор: cardinal 8.8.2009, 00:00
Ну идея понятна - ты не заглушил лишние частоты, а просто их убрал.

Теперь вопросы к df_3:
1. сколько пиков ожидалось в районе i=2000 (один, как получилось или больше)
2. тоже самое в районе i=3000 (два, как получилось или больше)
3. должен ли быть пик у значения i=8000 (в решении GoldFinch'а его нет) 

Автор: GoldFinch 8.8.2009, 11:54
cardinal, это не "убрал" и "заглушил" а тоже фильтрация, через двукратное бпф, самый тривиальный метод

Автор: cardinal 8.8.2009, 15:49
Я не говорил, что это не фильтрация smile

Автор: GoldFinch 9.8.2009, 13:38
вообще такой сигнал можно обрабатывать как угодно
синее - среднее в окне 50,
зеленое - среднеквадратическое отклонение в окне 50

Автор: cardinal 9.8.2009, 15:33
df_3 до сих пор не ответил на вопросы в этом http://forum.vingrad.ru/index.php?showtopic=268767&view=findpost&p=1937943. Я считаю, что такие измерения мало что дадут...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)