Условие завершения программы при чтении бинарного файла

Простейшие вопросы в области инженерной разработки
Ответить
Grizzly
interested
interested
Сообщения: 5
Зарегистрирован: 15 мар 2015, 10:50
Версия LabVIEW: 2013

Условие завершения программы при чтении бинарного файла

Сообщение Grizzly »

Читаю бинарник размером примерно 90 Мб, в нем IQ-отсчеты идут со скоростью 400 кГц. Демодулирую ЧМ-сигнал, затем передискретизирую до 44100 Гц и воспроизвожу на звуковой карточке. Бинарник читаю блоками, размер которых равен 40000 отсчетам. Всё рабоатет корректно. Но если изменить размер блока на 1000000, файл вместо минуты (как должно быть) воспроизводится 15 секунд, программа вылетает с ошибкой: Error 4 occurred at Read from Binary File in Read (LabVIEW: End of file encountered). Подскажите, пожалуйста, как корректно задвать в таком случае условие завершение программы? По идее окончание воспроизведение музыки не совпадает с окончанием чтения бинарника из-за промежуточных буферов.
Прикладываю изображение модели.

Изображение
Аватара пользователя
IvanLis

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

Re: Условие завершения программы при чтении бинарного файла

Сообщение IvanLis »

Grizzly писал(а):Всё рабоатет корректно. Но если изменить размер блока на 1000000, файл вместо минуты (как должно быть) воспроизводится 15 секунд
А как Вы посчитали, что у Вас получилась длительность 1 минута?
При частоте дискретизации 44100, сигнал длительностью 1 минута должен состоять из 2646000 отсчетов.
Grizzly писал(а):программа вылетает с ошибкой: Error 4 occurred at Read from Binary File in Read (LabVIEW: End of file encountered).
Эта ошибка возникает, когда Вы пытаетесь читать "за пределами размера файла". Т.е. указанного блока не существует, достигнут конец файла. Ошибки подобного рода как правило обрабатывают.
http://digital.ni.com/public.nsf/allkb/ ... 050065F294
Аватара пользователя
dadreamer

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

Re: Условие завершения программы при чтении бинарного файла

Сообщение dadreamer »

Я бы реализовал чтение файла и обработку/воспроизведение как два раздельных потока, а обмен - через очереди. Можно было бы выделить буфер ограниченного размера и в одном потоке туда писать данные, а из другого считывать. Тогда бы не было вот таких коллизий.
Grizzly
interested
interested
Сообщения: 5
Зарегистрирован: 15 мар 2015, 10:50
Версия LabVIEW: 2013

Re: Условие завершения программы при чтении бинарного файла

Сообщение Grizzly »

IvanLis писал(а): А как Вы посчитали, что у Вас получилась длительность 1 минута?
При частоте дискретизации 44100, сигнал длительностью 1 минута должен состоять из 2646000 отсчетов.
Размер файла 92 800 000 байт, в нем 16-битные квадратуры. 92 800 000/(2*2)*(44100/400000) = 2557800 отсчетов, или 58 секунд.
В MATLAB читал целиком файл, там тоже получилось 58 секунд после всей обработки.

Спасибо за приведенную ссылку. Читаю.
Grizzly
interested
interested
Сообщения: 5
Зарегистрирован: 15 мар 2015, 10:50
Версия LabVIEW: 2013

Re: Условие завершения программы при чтении бинарного файла

Сообщение Grizzly »

dadreamer писал(а):Я бы реализовал чтение файла и обработку/воспроизведение как два раздельных потока, а обмен - через очереди.
Большое спасибо за ответ. Вы не могли бы привести ссылку на описание подобной реализации и какие-то примеры, если таковые имеются. Это мой первый опыт работы с LabView. До этого много лет работал в MATLAB/Simulink и то практически не в real time.
Аватара пользователя
dadreamer

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

Re: Условие завершения программы при чтении бинарного файла

Сообщение dadreamer »

Grizzly писал(а):Вы не могли бы привести ссылку на описание подобной реализации и какие-то примеры, если таковые имеются.
Сделал вот такой пример:
2015-03-15_19-50-49.jpg
FileWorks.rar
lv2013
(27.86 КБ) 197 скачиваний
В архиве имеется бинарный файл, в котором прописаны числа I32 от 0 до 9. Это для проверки работы алгоритма - с wave я возиться не стал. В общем, задаёте Elements To Read - количество элементов, считываемое из файла за 1 раз (например, 10 элементов I32), Chunk Size - размер минимальных фрагментов, на которые нужно разбить считанные данные (например, 4 - получаем 10 / 4 = 2,5 , то есть 3 фрагмента: 2 по 4 и 1 по 2). Во втором цикле нужно разместить вашу обработку данных и проигрывание аудио вместо задержки в 1 сек. Как видно, файл не будет дальше считываться, пока нотифаер CanSend? равен False. Этим и пользуемся: пока идёт обработка/воспроизведение, нотифаер равен False, как только очередь опустела, нотифаер становится равен True и данные снова читаются из файла.
Grizzly
interested
interested
Сообщения: 5
Зарегистрирован: 15 мар 2015, 10:50
Версия LabVIEW: 2013

Re: Условие завершения программы при чтении бинарного файла

Сообщение Grizzly »

dadreamer писал(а):Сделал вот такой пример.
Огромное Вам спасибо! Очень помогли разобраться.
Limonadnyy
interested
interested
Сообщения: 1
Зарегистрирован: 12 май 2015, 19:15
Версия LabVIEW: 2013
Контактная информация:

Re: Условие завершения программы при чтении бинарного файла

Сообщение Limonadnyy »

Grizzly, Grizzly, Добрый день! А индивидуальное задание уже защитили Сергею?
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»