• Объявления

    • admin

      Внимание! Постить только по теме "электроника"   02.09.2016

      Внимание! В данном разделе разрешено создавать только темы связанные с электроникой. Для проблем с ПО не связанных с электроникой существует специальный раздел.
      Нарушители будут забанены на 5 суток!
1YHAIhwx

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

2 сообщения в этой теме

1YHAIhwx    3

В моём распоряжении имеется осциллограф 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

Поделиться сообщением


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас