Перейти к содержанию

Программа-анализатор данных с осциллографа


Рекомендуемые сообщения

В моём распоряжении имеется осциллограф DSO Nano V3, который умеет подключаться к компьютеру лишь в режиме флешки, но умеет скидывать содержимое памяти в csv. Я снял осциллограмму, однако анализировать её на экране осциллографа довольно неудобно. Мой вопрос: существуют ли программы, повторяющие интерфейс осциллографа со всеми возможностями он предоставляет по анализу данных?

Требования:

  • свободное ПО, преимущественно под Linux;
  • умеет открывать csv с слепком данных;
  • умеет визауализировать данные;
  • умеет вырезать часть данных и сохранять их отдельно как csv или в графическом виде;
  • (желательно) уметь работать логическим анализатором, пусть и ограниченно.

Изначальная проблема: у меня есть осциллограмма как на пике. Это - визуализация csv, которую я снял с осциллографа.

sample.thumb.png.aefba18e2bedd2bf40f8ec15cfa6d570.png

Из этого csv я хотел бы получить строку из "0" и "1", где "1" отображает короткий импульс, "0" - длинный. Более длинные промежутки предлагается любезно не замечать.

Сейчас я делаю всё это набором скриптов, однако вручную ковырять всё это довольно неудобно.

Скрипт визаулизации:

Spoiler

import sys
from PIL import Image, ImageDraw

with open(sys.argv[1], 'r') as source:
    lines = []
    vmin = 65535
    vmax = 0
    vtotal = 0
    for line in source:
        if not line or line.startswith('TRACK'):
            continue
        value = line.strip().replace(",","")
        if value and not value.startswith('\x00'):
            value = int(value)
            vtotal += value
            lines.append(value)
            if value < vmin:
                vmin = value
            if value > vmax:
                vmax = value

print 'Min: %d; Max: %d; Average: %d, num lines: %d' % (vmin, vmax, vtotal / len(lines), len(lines))

PADDING = 10

img_width = (2 * PADDING) + len(lines)
img_height = (2 * PADDING) + (vmax - vmin)

img = Image.new("RGB", (img_width, img_height), "black")
canvas = ImageDraw.Draw(img)

x = PADDING
ystart = PADDING + vmax

for i in xrange(1, len(lines)):
    line = lines[i]
    canvas.line((x, ystart - lines[i - 1] + PADDING, x, ystart - line + PADDING), fill=0x00FF00)
    x += 1

img.show()

if len(sys.argv) == 3:
    img.save(sys.argv[2])

 

Скрипт анализа данных:

Spoiler

import sys
from PIL import Image, ImageDraw

with open(sys.argv[1], 'r') as source:
    lines = []
    vmin = 65535
    vmax = 0
    vtotal = 0
    for line in source:
        if not line or line.startswith('TRACK'):
            continue
        value = line.strip().replace(",","")
        if value and not value.startswith('\x00'):
            value = int(value)
            vtotal += value
            lines.append(value)
            if value < vmin:
                vmin = value
            if value > vmax:
                vmax = value

average = vtotal / len(lines)

#print 'Min: %d; Max: %d; Average: %d, num lines: %d' % (vmin, vmax, average, len(lines))

LOGIC_ONE = 3
LOGIC_ZERO = 10
prev = 2
lo = 0
lz = 0
for line in lines:
    v = 1 if line > average else 0
    if prev != v:
        prev = v
        lo = 0
        lz = 0
        #sys.stdout.write(str(v))
    else:
        if v:
            if lo == LOGIC_ONE:
                sys.stdout.write('1')
                lo = 0
            else:
                lo += 1
        else:
            if lz == LOGIC_ZERO:
                sys.stdout.write('0')
                lz = 0
            else:
                lz += 1
sys.stdout.write('\n')
sys.stdout.flush()

 

На выходе:

1111101111111101010111011111111111111111111111111111110101111110000000000000111111111110011011111111111101111111101010111011111111111111011110101111111101111111111010111101011111111111111111111010111111111110101111111111111111111111111011111111110101111111101101010101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

 

16c.png

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Написал самостоятельно. Делает, что мне надо, я доволен.

598a2cdb35a76_Screenshotfrom2017-08-0900-25-11.png.dfbd052fe4b4b6fca3ffc4768e380e5b.pngБинарник: dsonanov3analyzer-1.0-SNAPSHOT.jar

Сорцы: dsonanov3logicanalyzer.tar.gz

Пример данных: DATA16.CSV

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...