Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Работа с библиотекой lcomp в linux

Вы не вошли.

 Поиск | Регистрация | Вход 

Konstantin
25.12.2012 11:08:31
#1

Гость

Работа с библиотекой lcomp в linux

Доброго времени суток. Сейчас пишем модуль для работы с платой L791 в составе нашего ПО. Не могли бы Вы кинуть ссылку или привести тут небольшой пример на С/С++ записи данных со всех 16 каналов платы (данные могут прийти на несколько каналов одновременно). В примере test.cpp производится запись с 4-х каналов и как я понял, одновременно. Когда я просматриваю записанный файл в L-Graph, то я вижу все 4 канала и могу отключить те, которые мне не нужны. Но как писать данные в отдельные файлы (1 канал - 1 файл)?

25.12.2012 11:52:17
#2

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Работа с библиотекой lcomp в linux

с 4 до 16 понятно как расширить. массив Chn до 16 заполнить и NCh 16 поставить. дальше поток всегда идет общий из кадров по 16 отсчетов. разбирать на отдельные каналы руками 0 16 32 отсчеты в один массив 1 17 33 в другой итд

Konstantin
25.12.2012 13:23:41
#3

Гость

Re: Работа с библиотекой lcomp в linux

Т.е. я получаю кадр с платы размера N. Этот кадр содержит данные со всех 16 каналов? Мне нужно отрезать куски по сдвигу? Лучше какой-нибудь простенький пример разбора.

Konstantin
25.12.2012 13:33:11
#4

Гость

Re: Работа с библиотекой lcomp в linux

А, кажется понял. С платы идет поток из кадров одного размера в количестве NCh. Соответственно, 1 кадр = Chn[1], 2 = Chn[2] и т.д. Т.е. 0,16,32,64 и т.д. кадр - это 1 канал. А могу ли я узнать, на какой канал или каналы пришли данные?

25.12.2012 13:50:48
#5

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Работа с библиотекой lcomp в linux

как запустили сбор так данные на все и приходят. плате все равно что там за значения. шум, 0 или сигнал... данные идут 0123012301230123... если 4 канала. если это рассматривать как одномерный массив, то 0 4 8 итд позиции выдернутые в отдельный массив дадут непрерывный поток данных с 0 канала. для других каналов аналогично.

Konstantin
25.12.2012 16:08:40
#6

Гость

Re: Работа с библиотекой lcomp в linux

Ну как кадр разбирать я понял. А можно как-то плате установить минимальный уровень входного сигнала через библиотеку? Я пока что плохо представляю, как мне в файл не писать шумы с не используемых каналов. По идее, запись с платы должна включаться при поступлении данных на какие-либо каналы. А тут получается, что у меня постоянно будут приходить данные в виде шумов по всем портам... Как-то неправильно...

25.12.2012 16:20:45
#7

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Работа с библиотекой lcomp в linux

нет. такого нет у этой платы. запись идет всегда по всем каналам. можете анализировать данные в программе и принимать решение.

25.12.2012 20:46:54
#8

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Работа с библиотекой lcomp в linux

Konstantin. По поводу "неправильности".
Концепция L-791 заключается в том, что L-791 кладёт данные в память компьютера без участия его процессора (DMA, BUS MASTER). В этом смысле, очень правильно, что ресурс компьютера Вам полностью отдаётся на любую сколь угодно гибкую обработку данных, находящихся тут же в памяти. Тем более, что алгоритм отделения сигнала от шума может быть совершенно разным для разных задач...
Но если Вам действительно нужен интеллект на уровне платы АЦП (в сочетании с вышеупомянутым DMA), то обратите внимание на новую плату PCI Express http://www.lcard.ru/products/boards/l-502 в модификации с процессором Blackfin на борту.

Konstantin
26.12.2012 10:41:45
#9

Гость

Re: Работа с библиотекой lcomp в linux

L-502 безусловно интересна, если мы перейдем на платформу с PCI-E обязательно будем использовать ее...

Konstantin
27.12.2012 13:24:25
#10

Гость

Re: Работа с библиотекой lcomp в linux

Poul, вот кусок потоковой функции из примера test.cpp

   halfbuffer =IrqStep*pages/2;
   fl1=fl2= (pp[I_ADC_PCI_COUNT_L791]<=halfbuffer) ? 0:1;

   for(i=0;i<multi;i++)
   {
      while(fl2==fl1) { fl2=(pp[I_ADC_PCI_COUNT_L791]<=halfbuffer) ? 0:1; usleep(10);}
      tmp1=(unsigned long *)p+(halfbuffer*fl1);
      fwrite(tmp1,1,halfbuffer*sizeof(long),fd);
      fl1=(pp[I_ADC_PCI_COUNT_L791]<=halfbuffer)? 0:1;
   }

Тут p - это указатель на начало кадра, а halfbuffer - это размер кадра? Если я правильно все понял, то в Вашем примере, если указать количество каналов 16, то данные будут писаться со всех этих каналов. А разбор кадров по каналам можно делать прямо тут по итерациям (0-я итерация - 1-й канал, 1-я - 2-й и т.д.) Поправьте меня, если я ошибаюсь...

27.12.2012 15:41:07
#11

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Работа с библиотекой lcomp в linux

кадры они маленькие...16 отсчетов. а p указатель на начало буфера куда эти кадры попадают. тут без разбора ожидается заполнение половины буфера этими кадрами и потом запись на диск. и к другой половине... разбор можно и тут устроить, но надо иметь ввиду скорости сбора и все посчитать...

Konstantin
27.12.2012 16:35:05
#12

Гость

Re: Работа с библиотекой lcomp в linux

Исходя из того, что открывая файл test.dat в программе LGraph она корректно определяет данные по указанному мной количеству каналов, предположу, что размер кадра является величиной фиксированной. Так какой же у него размер? Или, если я ошибаюсь, то как мне его вычислить? Я планирую сразу разбирать кольцевой буфер на 16 канальных буферов, а уже потом, по заполнению этих 16 буферов, производить запись в файлы... Подскажите, возможно ли осуществить мой вариант?

27.12.2012 16:46:40
#13

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Работа с библиотекой lcomp в linux

кадр равен числу каналов. буфер один общий. если разбивать до в другие буфера ручками...

Konstantin
27.12.2012 17:02:49
#14

Гость

Re: Работа с библиотекой lcomp в linux

Т.Е. 16 бит или 2 байта ? Я прав?

Konstantin
28.12.2012 08:53:48
#15

Гость

Re: Работа с библиотекой lcomp в linux

Я имел ввиду для NCh = 16... И сразу еще один вопрос. Возможно ли на плате L791 реализовать управление внешней сигнализацией? К примеру, на микрофоне, подключенном к АЦП включать лампочку, если данные перестали поступать. Если такая возможность существует, то где я могу о ней почитать?

28.12.2012 12:19:41
#16

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Работа с библиотекой lcomp в linux

если 16 каналов, то отсчет там 32бита *16 те кадр 64 байта.
Про лампочку не понял. поток идет со всех каналов и вероятность что один канал отвалиться нулевая можно сказать, а какие данные в канале плате неведомо....

28.12.2012 12:38:37
#17

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Работа с библиотекой lcomp в linux

Konstantin, внешней сигнализацией можно управлять на верхнем программном уровне. Асинхронный вывод на цифровые линии в L-791 имеется.
Замечу также, что по электрическим характеристикам  L-791 в многоканальном режиме не подходит для прямого подключения пассивного микрофона. Для согласования с микрофоном обычно применяют предусилитель.

Konstantin
09.01.2013 10:33:35
#18

Гость

Re: Работа с библиотекой lcomp в linux

Poul, т.е. на каждый канал приходится по 32 бита или 4 байта вне зависимости от указанного количества каналов NCh? Меняется только размер кадра в зависимости от количества каналов. Еще не совсем понял про сам кольцевой буфер (*р - в Вашем примере test.cpp). Его размер фиксированный или также зависит от количества каналов NCh?

09.01.2013 10:53:27
#19

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Работа с библиотекой lcomp в linux

да.да.для 791 фиксированный.

Konstantin
10.01.2013 15:21:10
#20

Гость

Re: Работа с библиотекой lcomp в linux

Poul, подскажите, в Вашем примере переменная синхронизации *pp используется для определения уровня наполнения буфера. При этом используется флаг I_ADC_PCI_COUNT_L791. Что он означает и какие еще можно использовать флаги с этой переменной? И еще вопрос, что вообще из себя представляет эта переменная? Можно ли при помощи нее забирать данные из кадра и если да, то каким образом?

10.01.2013 15:57:33
#21

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Работа с библиотекой lcomp в linux

pp это массив  где все регистры отмаплены у платы. I_ADC_PCI_COUNT_L791 индекс в массиве для регистра ADC_PCI_COUNT_L791.

Konstantin
11.01.2013 10:21:30
#22

Гость

Re: Работа с библиотекой lcomp в linux

Т.е. переменная pp[I_ADC_PCI_COUNT_L791] показывает, сколько отсчетов считано в настоящий момент? А можно через нее забирать данные с конкретного отсчеда (например 0, 16, 32 и т.д. для 1 канала)?

11.01.2013 11:22:30
#23

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Работа с библиотекой lcomp в linux

есть I_ADC_BUFFER. как плата работает читайте описание, но работа с регистрами это однозначно медленно будет.

Konstantin
14.01.2013 15:16:41
#24

Гость

Re: Работа с библиотекой lcomp в linux

Poul. Сделал запись по каналам... Вроде работает, но есть некоторая проблема. Пытаюсь из сырого файла сделать wav, но не пойму какие параметры сигнала АЦП взять для заголовка. Например sample rate можно брать из dRate платы структуры ADC_PAR_1, битность 32 бит/сек (32 бит на канал) или я не правильно посчитал? Наверняка кто-то уже сталкивался с такой проблемой... Может есть какой-нибудь пример пересчета?

14.01.2013 15:57:35
#25

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Работа с библиотекой lcomp в linux

dRate это частота в кадре. частота кадров 1/dKadr.
Диаграмма там вида ||||  ||||  |||| итп