Открытие бинарного файла OSC (USB осциллограф Instrustar)

Работа с файлами и базами данных
Ответить
phill
interested
interested
Сообщения: 5
Зарегистрирован: 03 июл 2016, 14:29
Версия LabVIEW: 2015
Контактная информация:

Открытие бинарного файла OSC (USB осциллограф Instrustar)

Сообщение phill »

Добрый день!
Есть китайский USB осциллограф Instrustar isds220b, данные сохраняются в формат OSC (могут в дальнейшем конветиться в CSV, но становятся после этого в 20 раз тяжелее (8Гб в csv из 400Мб в osc). csv файл такого размера считать не удается, даже если формировать массив частями, через Set File Position.
Про обработку молчу (предпологается возведение в квадрат, построение огибающих, частотная фильтрация.)

Вопрос: как открывать osc файлы в LabView, получив данные двух каналов и времени?

Конвертированный в csv файл начинается вот так:

Код: Выделить всё

sample,2000000,length,5242880                                                                     
Time(ns),Vol(V),Vol(V)
00000000.000000,0.034495,0.016330
00000500.000000,0.032261,0.016330
00001000.000000,0.034495,0.016330
00001500.000000,0.034495,0.016330
Просто в лоб read binary file не получается, естественно.

Пример файла на Яндекс Диске (10Мб) https://yadi.sk/d/6ljSgTTusxcbG

От производителя удалось получить вот такое описание формата файла, но как его применить в рамках LabView сообразить не могу (возможно тему следовало разместить в раздел "для чайников"):

Код: Выделить всё


// ---------------------- Osc Format ----------------------- / /
OscFormat
{
char type [6]; / * Type "OSC" * /
unsigned short Version; / * version * /
unsigned int nSamplesPerSec; / * sampling rate * /
unsigned char nChannels; / * number of channels * /
unsigned char nBits; / * bits * /
/ * Block bytes * /; unsigned short nBlockAlign
unsigned int nFormat; / * data format
unsigned int Trigger_point; / * 2.0 * Trigger Point /
}
// ---------------------- Osc Zoom Bias ----------------------- //
OscZoomBias
{
char type [8]; / * Type "ZOOMBIAS" * /
unsigned int nBoxing; // time-domain waveform Channel 1 0x00000001, channel 2 0x00000002
double nZoom; / * magnification * /
double nBias; / * Offset * /
}
Description: Osc Format in nChannels, decided, a few Osc Zoom Bias, one for each channel Osc
Zoom Bias structure
// ---------------------- Osc Data ----------------------- / /
OscData
{
char type [4]; / ​​* type "DATA" * /
unsigned int nDatasSize; / * number of data bytes * /
The length of the data portion nDatasSize
}
Description: The final acquisition value is (OscData the data portion of the value V) * (OscZoomBias in nZoom) +
(OscZoomBias in nBias)
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Открытие бинарного файла OSC (USB осциллограф Instrustar

Сообщение Borjomy_1 »

Странно.. строка csv занимает 34 байта. В исходных данных будет 4 байта (на 2 канала). Отношение ~8 раз, а не 20
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Открытие бинарного файла OSC (USB осциллограф Instrustar

Сообщение dadreamer »

phill писал(а):От производителя удалось получить вот такое описание формата файла, но как его применить в рамках LabView сообразить не могу
Ниже показано, как прочитать заголовок. После этого аналогично читаются сами данные. Надеюсь, разберётесь в этом.
Вложения
OSC_Read.vi
lv2015
(20.67 КБ) 375 скачиваний
phill
interested
interested
Сообщения: 5
Зарегистрирован: 03 июл 2016, 14:29
Версия LabVIEW: 2015
Контактная информация:

Re: Открытие бинарного файла OSC (USB осциллограф Instrustar

Сообщение phill »

Странно.. строка csv занимает 34 байта. В исходных данных будет 4 байта (на 2 канала). Отношение ~8 раз, а не 20
Ну при этом все равно так получается... (см скриншот)
Ниже показано, как прочитать заголовок.
Спасибо!
Ниже показано, как прочитать заголовок. После этого аналогично читаются сами данные. Надеюсь, разберётесь в этом.
Честно признаюсь - не разобрался.
И пока слабо понимаю как получить конечные значения. :think:
Вложения
size.png
size.png (3.75 КБ) 14018 просмотров
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Открытие бинарного файла OSC (USB осциллограф Instrustar

Сообщение dadreamer »

phill писал(а):И пока слабо понимаю как получить конечные значения. :think:
Ну, вот вам тогда более продвинутый пример.
OSC_Read_2.vi
lv2015
(24.59 КБ) 288 скачиваний
После чтения заголовка читаем первые 10 байт, т.е. 10 показаний с осциллографа, преобразуем их по приведённой разработчиком формуле и выводим на панель. Так как у вас записано 2 канала, то элементы массива 0, n, 2n, ... — это первый канал, а элементы 1, n+1, 2n+1, ... — второй. Можете, в принципе, оставить только ветку преобразований для двух каналов, если других вариантов не предвидится. И Build Array убрать, чтобы не выполнять лишних операций по разделению массива.
2016-07-05_13-20-31.jpg
Единственное, что не совсем понятно: почему у вас значения начинаются с таких цифр
phill писал(а):0.034495, 0.016330
0.032261, 0.016330
0.034495, 0.016330
0.034495, 0.016330
А у меня в процессе чтения *.osc файла получается так:
2016-07-05_13-14-14.jpg
phill писал(а):Вопрос: как открывать osc файлы в LabView, получив данные двух каналов и времени?
Допустим, сами данные мы уже получили. А время вы сможете узнать благодаря параметру nSamplesPerSec в кластере OscFormat.
phill
interested
interested
Сообщения: 5
Зарегистрирован: 03 июл 2016, 14:29
Версия LabVIEW: 2015
Контактная информация:

Re: Открытие бинарного файла OSC (USB осциллограф Instrustar

Сообщение phill »

Единственное, что не совсем понятно: почему у вас значения начинаются с таких цифр
Я привел данные из другого файла (меньше размером, чтоб без проблем открыть в текстовом редакторе)
Ну, вот вам тогда более продвинутый пример.
Спасибо! Теперь понятно.

Возникла новая проблема. Тестовые файлы 10-40Мб прекрасно читаются (как порциями в цикле так и полностью)
А вот "рабочие" файлы по 400Мб наглухо вешают компьютер.
Файл в атаче.

Или формировать циклом массив такого размера бесполезно и обработку нужно делать то же порциями? Тогда встает вопрос отображения.
Вложения
OSC_Read_2-AE-цикл.vi
(32.47 КБ) 273 скачивания
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Открытие бинарного файла OSC (USB осциллограф Instrustar

Сообщение dadreamer »

phill писал(а):Возникла новая проблема. Тестовые файлы 10-40Мб прекрасно читаются (как порциями в цикле так и полностью)
А вот "рабочие" файлы по 400Мб наглухо вешают компьютер.
Файл в атаче.

Или формировать циклом массив такого размера бесполезно и обработку нужно делать то же порциями? Тогда встает вопрос отображения.
Много раз уже этот вопрос поднимался на форуме. Когда данных в файле очень много (100 МБ и более), то файл нужно читать порциями (по каким-то заранее известным условиям, например, по нажатию кнопки, но никак не за раз), а данные отображать после прореживания (например, брать каждый 10-й, каждый 20-й и т.д. отсчёт). Всё равно визуально нельзя увидеть на графике такое большое число точек. Интересует какой-то конкретный отрезок - читаем заданный интервал - отображаем. Заинтересовал другой - очищаем график, читаем другой интервал, отображаем. Это что касается визуализации. Для мат. обработки могут быть взяты какие-то другие выборки данных согласно вашему ТЗ.

З.Ы.: На диаграмме у вас есть некоторые некорректности.

В начале вы берёте размер файла (Get File Size) и далее в цикле его используете. Но этот размер файла включает в себя и заголовок. Размер собственно данных после заголовка доступен в виде выхода nDatasSize в кластере OscData. Его и нужно использовать в дальнейшем как маркер окончания данных.

Принудительно устанавливать курсор позиции в файле не нужно (Get/Set File Position). При чтении данных из файла курсор переводится вперёд на заданное число байт.
rbl
assistant
assistant
Сообщения: 122
Зарегистрирован: 09 дек 2014, 10:14
Версия LabVIEW: 7-2015
Откуда: Санкт-Петербург
Контактная информация:

Re: Открытие бинарного файла OSC (USB осциллограф Instrustar

Сообщение rbl »

phill писал(а):
Возникла новая проблема. Тестовые файлы 10-40Мб прекрасно читаются (как порциями в цикле так и полностью)
А вот "рабочие" файлы по 400Мб наглухо вешают компьютер.
LabView "виснет" или вылетает с ошибкой о нехватке памяти?
Если первое, то Ваш код не оптимален и его нужно оптимизировать, либо дюже древний компьютер. Какая конфигурация? Sata контроллер в AHCI режиме?
Если второе, то можно попробовать выделить LabView побольше памяти (bcedit /enum, bcedit /set increaseuserva 3072), либо переходить на 64-bit версию.

Чтение 400Мб бинарных файлов, с последующей обработкой и множеством графиков это не проблема. Правда, все зависит от железа.

upd. Посмотрел Вашу программу.
В чтении бинарного файла полностью, но частями нет никакого профита. Если у Вас хватает оперативки, то он прекрасно прочитается и целиком.
Операции над массивом при сохранении его длинны лучше производить в In Place. Память не резиновая.
Читать программу не удобно... Блюм был бы не доволен. ;)
upd#2.Чтение файла это у Вас что-то с чем-то. Зачем shift register + insert into array(абсолютно уродский инструмент, не удивительно, что у Вас вешается компьютер) совмещенный с конкатенацией? Для того, чтобы склеить части достаточно одной конкатенации...
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Открытие бинарного файла OSC (USB осциллограф Instrustar

Сообщение dadreamer »

rbl писал(а):Зачем shift register + insert into array(абсолютно уродский инструмент, не удивительно, что у Вас вешается компьютер) совмещенный с конкатенацией? Для того, чтобы склеить части достаточно одной конкатенации...
Так-то да, чем хороши новые версии :labview: , так это вот такими "плюшками", упрощающими жизнь, да и работающими быстрее прочих решений.

Что касается Insert Into Array... У него есть своя ниша, в которой он может пригодиться. Например, когда нужно вставить данные в середину массива (или около того). Build вставляет либо в начало, либо в конец. Ну, или можно разделить массив по нужному индексу и сделать Build с тремя элементами. Замеры времени я не проводил, но думаю, что Build будет быстрее в большинстве случаев. В продолжение этого поста... Ради интереса сейчас взял уже упомянутый бенчмарк и прогнал его на разных версиях :labview: и на двух ОС: 7 и XP (вторая — виртуалка). Везде поставил число повторов (Repeat) = 10, размер массива (Array Size) = 100000. Получил вот такие результаты.

W7 + :labview: 2011 32-bit:
Insert Into Array:
IIA_LV2011_x32.jpg
Build Array:
BA_LV2011_x32.jpg
Init Array First:
IAF_LV2011_x32.jpg
W7 + :labview: 2015 32-bit:
Insert Into Array:
IIA_LV2015_x32.jpg
Build Array:
BA_LV2015_x32.jpg
Init Array First:
IAF_LV2015_x32.jpg
W7 + :labview: 2015 64-bit:
Insert Into Array:
IIA_LV2015_x64.jpg
Build Array:
BA_LV2015_x64.jpg
Init Array First:
IAF_LV2015_x64.jpg
XP + :labview: 8.0 32-bit:
Insert Into Array:
IIA_LV8.0_x32_XP.jpg
Build Array:
BA_LV8.0_x32_XP.jpg
Init Array First:
IAF_LV8.0_x32_XP.jpg
XP + :labview: 2014 32-bit:
Insert Into Array:
IIA_LV2014_x32_XP.jpg
Build Array:
BA_LV2014_x32_XP.jpg
Init Array First:
IAF_LV2014_x32_XP.jpg
Как видно на картинках, Insert Into Array проигрывает Build Array по всем фронтам независимо от версии :labview: и ОС. Причём в новых версиях :labview: Insert стал работать ещё хуже, чем Build (в 8 с лишним раз!). Это тоже в принципе видно на картинках. Чтобы быть точным, такое резкое ухудшение в работе IIA произошло в :labview: 2013, а в 2012-й и более ранних версиях он работал ещё более менее терпимо. Видимо, что-то поменялось в логике работы :vi: , можно было бы посмотреть по asm-листингу, но не в этот раз.

Однако, XP у меня под руками — виртуалка, так что опыт не совсем чистый. Как появится доступ к нормальной XP, проверю заново. Дело в том, что был на моей практике случай, когда IIA был реально быстрее BA, скажем, на 200-300 мс (это было важно). ОСь была XP, а :labview: — 2011 32-bit. Когда я заменил в программе IIA на BA, время работы логической части увеличилось и это стало сказываться на работоспособности системы. Я поменял BA на IIA обратно и всё стало как прежде. Хотелось бы ещё тот момент прояснить.
rbl
assistant
assistant
Сообщения: 122
Зарегистрирован: 09 дек 2014, 10:14
Версия LabVIEW: 7-2015
Откуда: Санкт-Петербург
Контактная информация:

Re: Открытие бинарного файла OSC (USB осциллограф Instrustar

Сообщение rbl »

Insert Into Array всегда был уродством, даже больше чем локалки и глобалки. Лет 13 назад еще в 7й версии я потратил несколько дней на то, чтобы разобраться, почему на больших массивах информации программа работает дико медленно и с каждой итерацией все медленней и медленней. Виновен оказался, естественно, IIA, который без сожаления был заменен на комбинацию Init array + Replace array. И до выхода 2015 я так и пользовался этой связкой, либо автоиндексацией в цикле, пока в 2015 NI наконец не поправили работу Build Array и он стал оптимальным инструментом. 2015 в целом очень удачная версия, в последнем фиксе они пофиксили даже локалки. ;)
В 2011 не IIA был хорош, а BA зачастую тупил. Лучше реплейс, особенно в ин плейс. ;)
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Открытие бинарного файла OSC (USB осциллограф Instrustar

Сообщение dadreamer »

rbl писал(а):В 2011 не IIA был хорош, а BA зачастую тупил.
Ну, по крайней мере BA быстрее, нежели IIA. На W7, 8, 10 я практически всегда использую Build Array или In Place. С XP остались непонятки, постараюсь разобраться.
rbl писал(а):Лучше реплейс, особенно в ин плейс. ;)
Согласен, всё больше нравится эта структура. Конечно, она менее компактна визуально на БД. Но её функционал с лихвой перекрывает эти мелочи.
phill
interested
interested
Сообщения: 5
Зарегистрирован: 03 июл 2016, 14:29
Версия LabVIEW: 2015
Контактная информация:

Re: Открытие бинарного файла OSC (USB осциллограф Instrustar

Сообщение phill »

for цикл чтения файла переделал.
Теперь просто беру 10 значений из файла, делю на 2 по 5 (на каждый канал), из 5 беру средние и их индексирую в массив.
далее у меня идет медианная фильтрация и частотный фильтр, потом вычисляется мощность и энергия (кстати опять таки через шифт регистр) и строится зависимость энергии от данных из другого файла.
Разбил построение графиков flat sequence структурой (4 фрейма по 3 графика)

Обработка занимает минут 40, но тем не менее результат получен (сейчас это было главное)

Про структуру In Place не знал, спасибо!

Файл стал совсем не читаем, буду причесывать. Но вдруг кому-то будет интересно, прикладываю.

Ну и в свое оправдание: не садился за LabView 10 лет с дипломной работы. :)

Всем спасибо за советы, очень помогли!
Вложения
простой frame OSC_Read_2-AE-цикл-медиана E P вне цикла.vi
(235.1 КБ) 262 скачивания
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Открытие бинарного файла OSC (USB осциллограф Instrustar

Сообщение dadreamer »

dadreamer писал(а):
rbl писал(а):В 2011 не IIA был хорош, а BA зачастую тупил.
Ну, по крайней мере BA быстрее, нежели IIA. На W7, 8, 10 я практически всегда использую Build Array или In Place. С XP остались непонятки, постараюсь разобраться.
Проверил и на XP тоже. Кроме того, провёл ещё ряд тестов на своих бенчмарках. До меня вдруг дошла простая истина, которая почему-то ускользала от понимания на протяжении нескольких лет. :crazy:

При работе с одномерными (1D) массивами Build Array быстрее, чем Insert Into Array.
При работе с двумерными (2D), трёхмерными (3D), ... , n-мерными массивами Insert Into Array быстрее, чем Build Array.


Последнее также относится и к случаю, когда к 2, 3, ... , n-мерному массиву добавляется 1, 2, ... , n-1-мерный массив. Это утверждение справедливо на любой ОСи, на любом :labview: любой разрядности. Больше не буду ничего комментировать, кому надо, можете посмотреть пример. :rtfm:
IIA_vs_BA_on_2D.vi
lv8.0
(22.8 КБ) 248 скачиваний
rbl писал(а):Лет 13 назад еще в 7й версии я потратил несколько дней на то, чтобы разобраться, почему на больших массивах информации программа работает дико медленно и с каждой итерацией все медленней и медленней. Виновен оказался, естественно, IIA, который без сожаления был заменен на комбинацию Init array + Replace array.
Они оба с каждой итерацией работают всё медленнее. В зависимости от размерности массива виноват будет либо IIA, либо BA. Очевидно, что чем больше исходный массив (к которому добавляем), тем больше времени требуется на его копирование в новую область памяти. Точно не могу сказать, почему в одном случае так, а в другом иначе. Надо лезть в дебри asm'а, что не слишком-то приятное занятие.
rbl писал(а):И до выхода 2015 я так и пользовался этой связкой, либо автоиндексацией в цикле, пока в 2015 NI наконец не поправили работу Build Array и он стал оптимальным инструментом.
А как именно поправили? Я прогнал свой пример и на 2015, и на 2016 - ситуация та же самая: на 1D рулит BA, на 2-D и более - IIA. Считаю, что на этом можно поставить точку. В идеальных случаях (когда заранее известен размер финального массива) всегда лучше будет
rbl писал(а):реплейс, особенно в ин плейс
Если таких сведений нет, то выбираем BA или IIA в зависимости от размерности финального массива.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Сохранение данных»