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

Работа с файлами и базами данных

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

Postby phill on 04 Jul 2016, 00:33

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

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

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

Code: Select all
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 сообразить не могу (возможно тему следовало разместить в раздел "для чайников"):

Code: Select all

// ---------------------- 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)
phill
interested
interested
 
Posts: 5
Joined: 03 Jul 2016, 14:29
LabVIEW Version: 2015
Karma: 0

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

Postby Borjomy_1 on 04 Jul 2016, 10:58

Странно.. строка csv занимает 34 байта. В исходных данных будет 4 байта (на 2 канала). Отношение ~8 раз, а не 20
Borjomy_1
expert
expert
 
Posts: 1786
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 310
VIP

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

Postby dadreamer on 04 Jul 2016, 11:31

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

Ниже показано, как прочитать заголовок. После этого аналогично читаются сами данные. Надеюсь, разберётесь в этом.
Attachments
OSC_Read.vi
lv2015
(20.67 KiB) Downloaded 143 times
User avatar
dadreamer
professor
professor
 
Posts: 3062
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 765
I/O VIP vision internet

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

Postby phill on 04 Jul 2016, 21:44

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

Ну при этом все равно так получается... (см скриншот)

Ниже показано, как прочитать заголовок.

Спасибо!

Ниже показано, как прочитать заголовок. После этого аналогично читаются сами данные. Надеюсь, разберётесь в этом.

Честно признаюсь - не разобрался.
И пока слабо понимаю как получить конечные значения. :think:
Attachments
size.png
size.png (3.75 KiB) Viewed 6801 times
phill
interested
interested
 
Posts: 5
Joined: 03 Jul 2016, 14:29
LabVIEW Version: 2015
Karma: 0

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

Postby dadreamer on 05 Jul 2016, 11:30

phill wrote:И пока слабо понимаю как получить конечные значения. :think:

Ну, вот вам тогда более продвинутый пример.
OSC_Read_2.vi
lv2015
(24.59 KiB) Downloaded 118 times

После чтения заголовка читаем первые 10 байт, т.е. 10 показаний с осциллографа, преобразуем их по приведённой разработчиком формуле и выводим на панель. Так как у вас записано 2 канала, то элементы массива 0, n, 2n, ... — это первый канал, а элементы 1, n+1, 2n+1, ... — второй. Можете, в принципе, оставить только ветку преобразований для двух каналов, если других вариантов не предвидится. И Build Array убрать, чтобы не выполнять лишних операций по разделению массива.
2016-07-05_13-20-31.jpg

Единственное, что не совсем понятно: почему у вас значения начинаются с таких цифр
phill wrote: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 wrote:Вопрос: как открывать osc файлы в LabView, получив данные двух каналов и времени?

Допустим, сами данные мы уже получили. А время вы сможете узнать благодаря параметру nSamplesPerSec в кластере OscFormat.
User avatar
dadreamer
professor
professor
 
Posts: 3062
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 765
I/O VIP vision internet

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

Postby phill on 05 Jul 2016, 13:53

Единственное, что не совсем понятно: почему у вас значения начинаются с таких цифр

Я привел данные из другого файла (меньше размером, чтоб без проблем открыть в текстовом редакторе)

Ну, вот вам тогда более продвинутый пример.

Спасибо! Теперь понятно.

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

Или формировать циклом массив такого размера бесполезно и обработку нужно делать то же порциями? Тогда встает вопрос отображения.
Attachments
OSC_Read_2-AE-цикл.vi
(32.47 KiB) Downloaded 110 times
phill
interested
interested
 
Posts: 5
Joined: 03 Jul 2016, 14:29
LabVIEW Version: 2015
Karma: 0

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

Postby dadreamer on 05 Jul 2016, 15:14

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

Или формировать циклом массив такого размера бесполезно и обработку нужно делать то же порциями? Тогда встает вопрос отображения.

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

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

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

Принудительно устанавливать курсор позиции в файле не нужно (Get/Set File Position). При чтении данных из файла курсор переводится вперёд на заданное число байт.
User avatar
dadreamer
professor
professor
 
Posts: 3062
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 765
I/O VIP vision internet

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

Postby rbl on 06 Jul 2016, 09:30

phill wrote:
Возникла новая проблема. Тестовые файлы 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(абсолютно уродский инструмент, не удивительно, что у Вас вешается компьютер) совмещенный с конкатенацией? Для того, чтобы склеить части достаточно одной конкатенации...
rbl
assistant
assistant
 
Posts: 101
Joined: 09 Dec 2014, 10:14
Location: Санкт-Петербург
LabVIEW Version: 7-2015
Karma: 22

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

Postby dadreamer on 06 Jul 2016, 15:52

rbl wrote:Зачем 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 обратно и всё стало как прежде. Хотелось бы ещё тот момент прояснить.
User avatar
dadreamer
professor
professor
 
Posts: 3062
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 765
I/O VIP vision internet

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

Postby rbl on 06 Jul 2016, 17:42

Insert Into Array всегда был уродством, даже больше чем локалки и глобалки. Лет 13 назад еще в 7й версии я потратил несколько дней на то, чтобы разобраться, почему на больших массивах информации программа работает дико медленно и с каждой итерацией все медленней и медленней. Виновен оказался, естественно, IIA, который без сожаления был заменен на комбинацию Init array + Replace array. И до выхода 2015 я так и пользовался этой связкой, либо автоиндексацией в цикле, пока в 2015 NI наконец не поправили работу Build Array и он стал оптимальным инструментом. 2015 в целом очень удачная версия, в последнем фиксе они пофиксили даже локалки. ;)
В 2011 не IIA был хорош, а BA зачастую тупил. Лучше реплейс, особенно в ин плейс. ;)
rbl
assistant
assistant
 
Posts: 101
Joined: 09 Dec 2014, 10:14
Location: Санкт-Петербург
LabVIEW Version: 7-2015
Karma: 22

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

Postby dadreamer on 06 Jul 2016, 20:33

rbl wrote:В 2011 не IIA был хорош, а BA зачастую тупил.

Ну, по крайней мере BA быстрее, нежели IIA. На W7, 8, 10 я практически всегда использую Build Array или In Place. С XP остались непонятки, постараюсь разобраться.
rbl wrote:Лучше реплейс, особенно в ин плейс. ;)

Согласен, всё больше нравится эта структура. Конечно, она менее компактна визуально на БД. Но её функционал с лихвой перекрывает эти мелочи.
User avatar
dadreamer
professor
professor
 
Posts: 3062
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 765
I/O VIP vision internet

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

Postby phill on 14 Jul 2016, 20:03

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

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

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

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

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

Всем спасибо за советы, очень помогли!
Attachments
простой frame OSC_Read_2-AE-цикл-медиана E P вне цикла.vi
(235.1 KiB) Downloaded 94 times
phill
interested
interested
 
Posts: 5
Joined: 03 Jul 2016, 14:29
LabVIEW Version: 2015
Karma: 0

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

Postby dadreamer on 05 Aug 2016, 18:48

dadreamer wrote:
rbl wrote:В 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 KiB) Downloaded 100 times

rbl wrote:Лет 13 назад еще в 7й версии я потратил несколько дней на то, чтобы разобраться, почему на больших массивах информации программа работает дико медленно и с каждой итерацией все медленней и медленней. Виновен оказался, естественно, IIA, который без сожаления был заменен на комбинацию Init array + Replace array.

Они оба с каждой итерацией работают всё медленнее. В зависимости от размерности массива виноват будет либо IIA, либо BA. Очевидно, что чем больше исходный массив (к которому добавляем), тем больше времени требуется на его копирование в новую область памяти. Точно не могу сказать, почему в одном случае так, а в другом иначе. Надо лезть в дебри asm'а, что не слишком-то приятное занятие.
rbl wrote:И до выхода 2015 я так и пользовался этой связкой, либо автоиндексацией в цикле, пока в 2015 NI наконец не поправили работу Build Array и он стал оптимальным инструментом.

А как именно поправили? Я прогнал свой пример и на 2015, и на 2016 - ситуация та же самая: на 1D рулит BA, на 2-D и более - IIA. Считаю, что на этом можно поставить точку. В идеальных случаях (когда заранее известен размер финального массива) всегда лучше будет
rbl wrote:реплейс, особенно в ин плейс

Если таких сведений нет, то выбираем BA или IIA в зависимости от размерности финального массива.
User avatar
dadreamer
professor
professor
 
Posts: 3062
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 765
I/O VIP vision internet


Return to Сохранение данных

Who is online

Users browsing this forum: No registered users and 3 guests

cron