Читаю бинарник размером примерно 90 Мб, в нем IQ-отсчеты идут со скоростью 400 кГц. Демодулирую ЧМ-сигнал, затем передискретизирую до 44100 Гц и воспроизвожу на звуковой карточке. Бинарник читаю блоками, размер которых равен 40000 отсчетам. Всё рабоатет корректно. Но если изменить размер блока на 1000000, файл вместо минуты (как должно быть) воспроизводится 15 секунд, программа вылетает с ошибкой: Error 4 occurred at Read from Binary File in Read (LabVIEW: End of file encountered). Подскажите, пожалуйста, как корректно задвать в таком случае условие завершение программы? По идее окончание воспроизведение музыки не совпадает с окончанием чтения бинарника из-за промежуточных буферов.
Прикладываю изображение модели.
Условие завершения программы при чтении бинарного файла
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Условие завершения программы при чтении бинарного файла
А как Вы посчитали, что у Вас получилась длительность 1 минута?Grizzly писал(а):Всё рабоатет корректно. Но если изменить размер блока на 1000000, файл вместо минуты (как должно быть) воспроизводится 15 секунд
При частоте дискретизации 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
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Условие завершения программы при чтении бинарного файла
Я бы реализовал чтение файла и обработку/воспроизведение как два раздельных потока, а обмен - через очереди. Можно было бы выделить буфер ограниченного размера и в одном потоке туда писать данные, а из другого считывать. Тогда бы не было вот таких коллизий.
Re: Условие завершения программы при чтении бинарного файла
Размер файла 92 800 000 байт, в нем 16-битные квадратуры. 92 800 000/(2*2)*(44100/400000) = 2557800 отсчетов, или 58 секунд.IvanLis писал(а): А как Вы посчитали, что у Вас получилась длительность 1 минута?
При частоте дискретизации 44100, сигнал длительностью 1 минута должен состоять из 2646000 отсчетов.
В MATLAB читал целиком файл, там тоже получилось 58 секунд после всей обработки.
Спасибо за приведенную ссылку. Читаю.
Re: Условие завершения программы при чтении бинарного файла
Большое спасибо за ответ. Вы не могли бы привести ссылку на описание подобной реализации и какие-то примеры, если таковые имеются. Это мой первый опыт работы с LabView. До этого много лет работал в MATLAB/Simulink и то практически не в real time.dadreamer писал(а):Я бы реализовал чтение файла и обработку/воспроизведение как два раздельных потока, а обмен - через очереди.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Условие завершения программы при чтении бинарного файла
Сделал вот такой пример: В архиве имеется бинарный файл, в котором прописаны числа 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 писал(а):Вы не могли бы привести ссылку на описание подобной реализации и какие-то примеры, если таковые имеются.
Re: Условие завершения программы при чтении бинарного файла
Огромное Вам спасибо! Очень помогли разобраться.dadreamer писал(а):Сделал вот такой пример.
-
- interested
- Сообщения: 1
- Зарегистрирован: 12 май 2015, 19:15
- Версия LabVIEW: 2013
- Контактная информация:
Re: Условие завершения программы при чтении бинарного файла
Grizzly, Grizzly, Добрый день! А индивидуальное задание уже защитили Сергею?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 38 Ответы
- 13305 Просмотры
-
Последнее сообщение AndreyDmitriev
-
- 7 Ответы
- 941 Просмотры
-
Последнее сообщение dadreamer
-
- 5 Ответы
- 320 Просмотры
-
Последнее сообщение ujin1
-
- 2 Ответы
- 472 Просмотры
-
Последнее сообщение IvanLis
-
- 10 Ответы
- 2373 Просмотры
-
Последнее сообщение PAG