Работа с очередью

Захват, обработка и генерирование сигнала
Ответить
VladosXPOM
beginner
beginner
Сообщения: 40
Зарегистрирован: 21 мар 2014, 14:09
Версия LabVIEW: 2011
Контактная информация:

Работа с очередью

Сообщение VladosXPOM »

Есть два параллельных цикла. В одном опрашивается периферия и рассчитывается математика (быстрый), в другом отрисовывается интерфейс (сравнительно медленный). В быстром цикле данные принимаются от железа в массивах определенной длины. Я запихиваю эти массивы в очередь по мере их поступления. Теперь мне надо в медленном цикле выковыривать эти массивы из очереди. Что бы очередь не переполнялась, выковыривать надо бОльшими кусками. Т.е. записываю часто, но мелко, читаю редко, но крупно. Я верно мыслю? Как мне реализовать непрерывное чтение из очереди в массив большего размера? Например, в быстром цикле (10 Гц) в очередь приходит два массива по 1000 элементов. В медленном цикле (1 Гц) я хочу выковырять один массив из 20000 элементов. Как мне это реализовать? Спасибо
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5464
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 87 раз

Re: Работа с очередью

Сообщение IvanLis »

VladosXPOM писал(а):Я верно мыслю?
Нет, не верно :crazy: .
Что бы очередь не переполнялась, чтение из нее должно выполняться чаще (в среднем) чем запись.
Организация очереди позволяет сделать асинхронно прием и обработку, что позволит в случае задержки при обработке не потерять данные от устройства.

Для реализации, как Вы написали.
Нужно в приемном цикле организовать массив и писать данные в него, по достижении определенного размера, записывать его в очередь. А уже цикл обработки заберет массив из очереди.
Я как правило для накопления использую промежуточный цикл, но можно обойтись и без него, все зависит от оборудования.

Получается:
"Приемный цикл" крутится независимо от нас, принимает данные с устройства и пишет в "Очередь прием".
"Цикл накопления" срабатывает при каждой записи данные в "Очередь прием" и перекидывает их в "буфер массив", проверяет его размер. Если необходимый объем данных накоплен, то данные записываются в "Очередь обработка". При этом остаток можно оставить в "буфер массив", они пойдут на обработку в следующей порции.
"Цикл обработки" срабатывает при записи данных в "Очередь обработка". И выполняет с данными необходимые операции.

Имеем:
"Приемный цикл" и "Цикл накопления" вращаются примерно с одинаковой скоростью.
"Цикл обработки" срабатывает по мере поступления данных.
VladosXPOM
beginner
beginner
Сообщения: 40
Зарегистрирован: 21 мар 2014, 14:09
Версия LabVIEW: 2011
Контактная информация:

Re: Работа с очередью

Сообщение VladosXPOM »

Можете подсказать как именно организовать "дозапись" меньшего массива в больший массив за несколько итераций цикла? Подозреваю, что через сдвиговый регистр
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5464
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 87 раз

Re: Работа с очередью

Сообщение IvanLis »

VladosXPOM писал(а):Подозреваю, что через сдвиговый регистр
Все верно.
Набросал пример для наглядности:
Untitled 1.vi
lv2010
(22.73 КБ) 276 скачиваний
VladosXPOM
beginner
beginner
Сообщения: 40
Зарегистрирован: 21 мар 2014, 14:09
Версия LabVIEW: 2011
Контактная информация:

Re: Работа с очередью

Сообщение VladosXPOM »

Огромное спасибо, все работает.
Скажите, существуют ли такие способы обработки сигнала в LV, когда прибор в цикле не ждет прихода всего массива и целиком его обрабатывает, а начинает обработку с приходом первого сигнала, постепенно продвигая данные вперед по мере их поступления. Встречал в палитрах приборы PtbPt или running RMS например. Они работают по такому принципу?
Borjomy_1

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

Re: Работа с очередью

Сообщение Borjomy_1 »

VladosXPOM, У по-точечной реализации есть только один плюс - малое время реакции. Все остальное - только минус (высокие накладные расходы на обработку, загрузка процессора, сложность реализации, необходимость предусмотрения буферов и прочее). Так как вы не выдаете управляющий сигнал, то вам абсолютно не нужна обработка по точкам. А для вывода на экран графика достаточно интервала 100мс. Под это время и рассчитывайте размер пакета.
VladosXPOM
beginner
beginner
Сообщения: 40
Зарегистрирован: 21 мар 2014, 14:09
Версия LabVIEW: 2011
Контактная информация:

Re: Работа с очередью

Сообщение VladosXPOM »

Просто в программе используется FFT для полосы частот. Если на вход подать маленький пакет данных, то спектральное разрешение слишком низкое. Поэтому приходится несколько пакетов запихивать в один большой массив и уже по нему считать спектр. При этом, пока данные записываются в большой массив, спектр не обновляется. Налицо очень большое время отклика программы между приходом реальных данных от АЦП и отображением их на спектре. Может как то можно это обойти? Спасибо
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5464
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 87 раз

Re: Работа с очередью

Сообщение IvanLis »

VladosXPOM писал(а):Может как то можно это обойти? Спасибо
Уменьшить размер буфера - накопителя.
Повысить частоту поступления данных.
Borjomy_1

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

Re: Работа с очередью

Сообщение Borjomy_1 »

VladosXPOM, Практика показывает, что если даже применять скользящее окно, для, например, обсчета спектра за 1 сек, со смещением 100мс, вы всё равно никакого увеличения динамики не получите. Причина заключается в том, что данные усредняются по гармоникам.

например прохождение импульса ___________----____________ приводит к тому, что в течение N-ного количества времени (ширина окна) вид спектра меняться не будет, хотя обновление и вычисление будет происходить в 10 раз чаще.

Можно, конечно, сделать вариант, когда более высокие гармоники считаются по меньшему окну (пропорциональному длине периода гармоники), однако возникает вопрос взаимного пересечения спектров при разных df и FFT тут уже не применишь.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Обработка сигнала»