Регистрация | Войти
Lisp — программируемый язык программирования
RSS
Задача распознования сигнала
dima0905 - 28.01.2018 22:30, Сообщений - 23
Хочу подсчитать сколько потребляют различные бытовые ус-ва, и надо распознать когда какое работает. Маленькие "слоники" - это холодильник, ну и т.д.
Может кто-то сталкивался с задачей распознавания?
 






[#]
Преобразование Фурье?
andy128k - 29.01.2018 00:13
[#] Ответ на комментарий от andy128k 29.01.2018 00:13
фиаско. CLOZURE CL на Raspberry Pi не смог посчитать преобразование Фурье


CL-USER> *t-r*
#(0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0)
CL-USER> (let ((transformed (fft:fft *t-r*)))
    (fft:ifft transformed)
)

#(#C(0.25D0 1.0D0) #C(0.0625D0 0.25D0) #C(0.015625D0 0.0625D0) #C(0.00390625D0 0.015625D0) #C(9.765625D-4 0.00390625D0) #C(2.44140625D-4 9.765625D-4) #C(6.103515625D-5 2.44140625D-4) #C(1.52587890625D-5 6.103515625D-5) #C(3.814697265625D-6 1.52587890625D-5) #C(9.5367431640625D-7 3.814697265625D-6) #C(2.384185791015625D-7 9.5367431640625D-7) #C(5.960464477539063D-8 2.384185791015625D-7) #C(1.4901161193847656D-8 5.960464477539063D-8) #C(3.725290298461914D-9 1.4901161193847656D-8) #C(9.313225746154785D-10 3.725290298461914D-9) #C(2.3283064365386963D-10 9.313225746154785D-10))
CL-USER> *features*
(:BORDEAUX-THREADS :THREAD-SUPPORT :SWANK :QUICKLISP :ASDF-PACKAGE-SYSTEM :ASDF3.1 :ASDF3 :ASDF2 :ASDF :OS-UNIX :PRIMARY-CLASSES :COMMON-LISP :OPENMCL :CCL :CCL-1.2 :CCL-1.3 :CCL-1.4 :CCL-1.5 :CCL-1.6 :CCL-1.7 :CCL-1.8 :CCL-1.9 :CCL-1.10 :CCL-1.11 :CCL-1.12 :CLOZURE :CLOZURE-COMMON-LISP :ANSI-CL :UNIX :OPENMCL-UNICODE-STRINGS :IPV6 :OPENMCL-NATIVE-THREADS :OPENMCL-PARTIAL-MOP :MCL-COMMON-MOP-SUBSET :OPENMCL-MOP-2 :OPENMCL-PRIVATE-HASH-TABLES :EABI-TARGET :ARM :ARM-TARGET :LINUX-HOST :LINUX-TARGET :LINUXARM-TARGET :LINUXARM-HOST :32-BIT-TARGET :32-BIT-HOST :LINUX :LITTLE-ENDIAN-TARGET :LITTLE-ENDIAN-HOST)
CL-USER>
   


тест на SBCL:

CL-USER> (setf *t-r* (vector 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0))
#(0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0)
CL-USER> (let ((transformed (fft:fft *t-r*)))
    (fft:ifft transformed)
)

#(#C(0.0d0 0.0d0) #C(1.1102230246251565d-16 -6.819841306089779d-17)
  #C(1.1102230246251565d-16 0.0d0)
  #C(2.564280822434891d-17 -1.7560492847764886d-17) #C(0.0d0 0.0d0)
  #C(1.0d0 -1.1905259781744986d-18) #C(1.0d0 5.551115123125783d-17)
  #C(1.0d0 -3.469446951953614d-17) #C(1.0d0 0.0d0)
  #C(0.9999999999999999d0 4.282388940161787d-17) #C(0.9999999999999999d0 0.0d0)
  #C(-2.564280822434891d-17 3.682705039950431d-18) #C(0.0d0 0.0d0)
  #C(0.0d0 5.432062525308333d-17) #C(0.0d0 -5.551115123125783d-17)
  #C(-1.1102230246251565d-16 2.0816681711721685d-17)
)

CL-USER>

обновить CCL? Поковыряться в нем? Пожаловаться  авторам?
 


dima0905 - 30.01.2018 14:15
[#] Ответ на комментарий от dima0905 30.01.2018 14:15
но SBCL  становится на raspberry только в версии без thread's.
Замкнутый круг какой-то
dima0905 - 31.01.2018 00:26
[#] Ответ на комментарий от dima0905 31.01.2018 00:26
Добро пожаловать в чудесный мир лиспа! А тебе обязательны треды? 
den73 - 31.01.2018 19:22
[#] Ответ на комментарий от den73 31.01.2018 19:22
Да. У меня же hunchentoot. И постоянно считываются показания с датчиков. И не могу найти как изменить промпт репла в емаксе.
dima0905 - 31.01.2018 20:04
[#] Ответ на комментарий от dima0905 31.01.2018 20:04
Понял. 
den73 - 31.01.2018 21:45
[#] Ответ на комментарий от dima0905 30.01.2018 14:15
Что не так с результатом ccl?
andy128k - 31.01.2018 22:29
[#] Ответ на комментарий от andy128k 31.01.2018 22:29
должны быть начальные значения, типа:  x = (ifft (fft x)). Кста, на Х86 в винде CCL обсчитывает этот тест правильно. Ща буду их на Х86 и ARM пошагово сверять. Завел в емаксе оба ССL и чтобы различать их, хочу промпты CL-USER> поменять и не могу найти где, аж расстроился.
dima0905 - 31.01.2018 23:24
[#] Ответ на комментарий от dima0905 31.01.2018 23:24
Просто завести другой пакет не пойдёт? 
den73 - 01.02.2018 01:14
[#] Ответ на комментарий от den73 01.02.2018 01:14
Нет. Я и так буду вынужден установить пакет, в котором буду искать баг.
dima0905 - 01.02.2018 10:23
[#] Ответ на комментарий от dima0905 01.02.2018 10:23
Открой два емакса, поставь рядом и не двигай. Если это не подходит - копай в емаксе slime-repl-insert-prompt или slime-modeline-string 
den73 - 01.02.2018 11:35
[#] Ответ на комментарий от den73 01.02.2018 11:35
С другим пакетом была правильная идея, надо было додумать до конца просто.
dima0905 - 01.02.2018 12:30
[#] Ответ на комментарий от dima0905 01.02.2018 12:30
Можно ещё переименовать пакет в одном из образов. 
den73 - 01.02.2018 13:20
[#] Ответ на комментарий от den73 01.02.2018 13:20
Выкосил из функций все declare и баг исчез. Но осадок остался ... А еще ССL не "видит" из-под винды расшареные по сети папки. Ну или я неправильно путь указываю. Но SBCL-то видит.
dima0905 - 02.02.2018 01:18
[#] Ответ на комментарий от dima0905 02.02.2018 01:18
declare - это примерно то же, что void*, т.е. опасный cast. SBCL здесь заметно умнее - если он не может своим кривоватым тайп-чекером доказать, что declare соответствует правде, он оставляет проверку в рантайме. Это гораздо лучше. Так что твой результат неудивителен. Насчёт путей - не знаю, я обычно диск маплю. 
den73 - 06.02.2018 16:44
[#]
Привет. Можешь дать твой сигнал в каком-нибудь удобном для чтения виде (CSV, например)? Я тут балуюсь вейвлетами. Думаю, это могло бы помочь.

Вот мой небольшой эксперимент с D4 вейвлетом:


shamaz.mazum - 01.03.2018 18:54
[#] Ответ на комментарий от shamaz.mazum 01.03.2018 18:54
Привет. тут
за сутки
dima0905 - 03.03.2018 14:59
[#] Ответ на комментарий от dima0905 03.03.2018 14:59
Я хз, конечно, как ты будешь распознавать, но может такое представление сигнала поможет. Тут применил low-pass фильтр. Мелкие слоники поубавили в амплитуде, крупные остались как есть. Непонятная мотня преобразовалась непонятно, но по-идее у той, которая моталась сильнее, амплитуда тоже упала. Осталось найти экстремумы. По значению функции в них будешь знать, что за сигнал у тебя был

shamaz.mazum - 04.03.2018 08:09
[#] Ответ на комментарий от dima0905 03.03.2018 14:59
Код 

(defparameter *a* (/ 1.0 512))
(defparameter *coeff*
  (coerce (cons *a*
                (loop for i from 1 below 400 collect (/ (sin (* pi i *a*)) (* i pi)))
)

          'vector
)
)


(defun filter (array)
  (let* ((len1 (length array))
         (len2 (- (length *coeff*) 1))
         (new-array (make-array len1 :initial-element 0))
)

    (loop for i from len2 below (- len1 len2) do
         (loop for j from (- len2) to len2 do
              (incf (aref new-array i)
                    (* (aref array (+ i j))
                       (aref *coeff* (abs j))
)
)
)
)

    new-array
)
)

С d4 вейвлет преобразованием получается такая же ерунда, но у этого фильтра АЧХ получше должна быть
shamaz.mazum - 04.03.2018 08:12
[#] Ответ на комментарий от shamaz.mazum 04.03.2018 08:12
есть идея посмотреть как выглядят сигналы при свертке и автосвертке, но сначала надо как-то повыделять сами сигналы, ну что бы не "вручную" их вырезать, для этого посмотреть статистическое распределние амплитуд "фронтов"
но сначала убрать колебания (сгладить) на единицу или две в последнем знаке измеряемой величины
но в приоритете - изучение английского.
"непонятная мотня" - это насос в ПММ, который импульсно включается на несколько секунд.
А чем графики нарисованы?
dima0905 - 04.03.2018 09:12
[#] Ответ на комментарий от dima0905 04.03.2018 09:12
Рисовал гнуплотом, конечно же.
shamaz.mazum - 04.03.2018 10:59
[#]
А что тебе мешает прямо с этим сигналом найти места нарастающего и спадающего фронта и плясать от этого? Для сигналов, которые долго устанавливаются в свой уровень, примени LPF (пример кода дан выше)
shamaz.mazum - 04.03.2018 14:10
[#] Ответ на комментарий от shamaz.mazum 04.03.2018 14:10
фронты имеют отклонения по амплитуде и времени + если это индуктивная нагрузка, то еще и скачки при включении. Если сравнивать просто разницу между соседними значениями отсчетов , то какое-те кол-во будет "мимо кассы". Сравнивать как сумму векторов по модулю? Моих мат.способностей не хватает. 
dima0905 - 07.03.2018 15:16
@2009-2013 lisper.ru