Получение полной информации из заголовка Wav-файла

Простейшие вопросы в области инженерной разработки
Apollo
interested
interested
Сообщения: 3
Зарегистрирован: 18 окт 2021, 21:58
Версия LabVIEW: 2012
Благодарил (а): 2 раза
Контактная информация:

Получение полной информации из заголовка Wav-файла

Сообщение Apollo »

Приветствую, перед мной стоит задача цифровой обработки Wav-файла (прочитать заголовок, заполнить массив порцией отсчетов, после чего произвести обработку, результат записать в другой Wav- файл). Возникают вопрос как лучше читать Wav-файл чтобы получить доступ к его заголовку и отсчетам? Для начала я использую стандартные блоки “Input File” -> “Sound File Info”. “Sound File Info” – позволяет прочитать частоту дискретизации и некоторые другие данные, но меня интересует заголовок полностью (не включая строковые обозначения “RIFF”, “WAVE”). После попытки расширения “Call library function Node в стандартном блоке получаю некорректные данные. Информацию из заголовка пытаюсь поместить в “Bundle By Name” с помощью “Call library function Node”. Если мой подход к решению данной задачи неверен прошу направить на правильный путь. В дополнение прикрепляю структуру заголовка написанную на C++.
На скриншоте 3 показано содержимое стандартного блока, красным обведено то, что сделал я.
Вложения
1.PNG
2.PNG
3.PNG
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2704
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 25 раз
Поблагодарили: 95 раз
Контактная информация:

Re: Получение полной информации из заголовка Wav-файла

Сообщение Artem.spb »

Если вы уверены, что заголовок именно такой (что вообще говоря не правда), то создайте кластер с теми же типами данный и прочитайте его из файла стандартными функциями: file open->read binary file
header.png
header.png (12.87 КБ) 758 просмотров
Не стоит открывать "звуковой" файл, если планируете читать бинарные данные. Можно открыть-прочитать заголовок-закрыть-открыть как звук.
Пару лет назад читал базовыми функциями, всё реально, но заголовок может содержать гораздо больше данных, чем у вас описано, стандарт это позволяет

Возможно, я по этой статье разбирал
Apollo
interested
interested
Сообщения: 3
Зарегистрирован: 18 окт 2021, 21:58
Версия LabVIEW: 2012
Благодарил (а): 2 раза
Контактная информация:

Re: Получение полной информации из заголовка Wav-файла

Сообщение Apollo »

Спасибо за Ваш ответ! Файл которые я использую содержит заголовок, который я указал (есть готовая программа на c++). Возникает вопрос, как интерпретировать массив символов char? На данный момент заменяю последовательность из четырех символов char одним Int элементом в кластере размером 4байта.
Вложения
ReadFromBinaryFile.vi
(9.52 КБ) 13 скачиваний
4.PNG
5.PNG
files.rar
Файл, который я использую
(1.39 МБ) 12 скачиваний
StructureWavFiles.ctl
(5.97 КБ) 14 скачиваний
6.PNG
Последний раз редактировалось Apollo 20 окт 2021, 19:03, всего редактировалось 3 раза.
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2704
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 25 раз
Поблагодарили: 95 раз
Контактная информация:

Re: Получение полной информации из заголовка Wav-файла

Сообщение Artem.spb »

Apollo писал(а): 20 окт 2021, 18:55 как интерпретировать массив символов char?
Это банальная строка из 4 символов
Apollo
interested
interested
Сообщения: 3
Зарегистрирован: 18 окт 2021, 21:58
Версия LabVIEW: 2012
Благодарил (а): 2 раза
Контактная информация:

Re: Получение полной информации из заголовка Wav-файла

Сообщение Apollo »

Не совсем понимаю, как это можно сделать в кластере. Нужно же-как то указать, что только 4 символа должны записаться в строку, а остальные биты дальше распределиться по остальным элементам кластера.
Вложения
7.PNG
Alex Dem
assistant
assistant
Сообщения: 115
Зарегистрирован: 06 май 2015, 22:24
Версия LabVIEW: 2014, 2018
Контактная информация:

Re: Получение полной информации из заголовка Wav-файла

Сообщение Alex Dem »

Чем Вас не устраивает прочитать Sound File Read Simple, сразу получив доступ к отчетам, а после обработки произвести обратную операцию?
Сам для управления вибростендом таким занимался когда-то. Что там такого важного содержится в заголовке, что необходимо для решения Вашей задачи?
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2704
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 25 раз
Поблагодарили: 95 раз
Контактная информация:

Re: Получение полной информации из заголовка Wav-файла

Сообщение Artem.spb »

Apollo писал(а): 20 окт 2021, 20:58 Нужно же-как то указать, что только 4 символа должны записаться в строку,
Так просто это не получится, потому что нет заголовка-длины, поэтому система не знает длину строки, придётся руками читать и преобразовывать
str.png
str.png (10.73 КБ) 655 просмотров
Apollo
interested
interested
Сообщения: 3
Зарегистрирован: 18 окт 2021, 21:58
Версия LabVIEW: 2012
Благодарил (а): 2 раза
Контактная информация:

Re: Получение полной информации из заголовка Wav-файла

Сообщение Apollo »

Alex Dem писал(а): 20 окт 2021, 22:11 Чем Вас не устраивает прочитать Sound File Read Simple, сразу получив доступ к отчетам, а после обработки произвести обратную операцию?
Сам для управления вибростендом таким занимался когда-то. Что там такого важного содержится в заголовке, что необходимо для решения Вашей задачи?
У меня стоит задача изменения частоты дискретизации методом Sinc-интерполяции. Я беру исходный файл преобразовываю заголовок (при изменении частоты я должен произвести перерасчет некоторых полей заголовка). После произвожу обработку отсчетов с учетом новой частоты.
Вложения
8.PNG
Последний раз редактировалось Apollo 20 окт 2021, 23:08, всего редактировалось 1 раз.
Alex Dem
assistant
assistant
Сообщения: 115
Зарегистрирован: 06 май 2015, 22:24
Версия LabVIEW: 2014, 2018
Контактная информация:

Re: Получение полной информации из заголовка Wav-файла

Сообщение Alex Dem »

Если задание состоит в том, что нужно обязательно редактировать заголовок, тогда понятно.
https://forums.ni.com/t5/Example-Code/R ... anguage=en
Apollo
interested
interested
Сообщения: 3
Зарегистрирован: 18 окт 2021, 21:58
Версия LabVIEW: 2012
Благодарил (а): 2 раза
Контактная информация:

Re: Получение полной информации из заголовка Wav-файла

Сообщение Apollo »

Наконец-то удалось считать строковые данные из заголовка. А как быть с unsigned long(unsigned short), удалось найти, что если преобразовывать типы данных U8->U32 (I8->I32), то могут быть потеряны значения?
Вложения
9.PNG
10.PNG
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2704
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 25 раз
Поблагодарили: 95 раз
Контактная информация:

Re: Получение полной информации из заголовка Wav-файла

Сообщение Artem.spb »

Apollo писал(а): 21 окт 2021, 20:53 если преобразовывать типы данных U8->U32 (I8->I32), то могут быть потеряны значения?
Если преобразовывать именно так (от меньшего к большему), то потерь не будет.
Не понял, зачем сумма четырёх значений?
Apollo
interested
interested
Сообщения: 3
Зарегистрирован: 18 окт 2021, 21:58
Версия LabVIEW: 2012
Благодарил (а): 2 раза
Контактная информация:

Re: Получение полной информации из заголовка Wav-файла

Сообщение Apollo »

Artem.spb писал(а): 21 окт 2021, 21:11 Если преобразовывать именно так (от меньшего к большему), то потерь не будет.
Не понял, зачем сумма четырёх значений?
Пытаюсь объединить 4 отдельно прочитанных байта, в одну переменную типа unsigned long. :dntknw:
Последний раз редактировалось Apollo 21 окт 2021, 21:16, всего редактировалось 1 раз.
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2704
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 25 раз
Поблагодарили: 95 раз
Контактная информация:

Re: Получение полной информации из заголовка Wav-файла

Сообщение Artem.spb »

Apollo писал(а): 21 окт 2021, 21:15 Пытаюсь объединить 4 отдельно прочитанных байта, в одну переменную типа unsigned long. :dntknw:
А что мешает прочитать правильно?
Если это именно ОДНО значение, то так вы его не получите.
Сумма, это именно сумма, а не последовательная склейка. Грубо говоря
01,02,03,04, нужно число 01020304 = 1020304
А у вас 01+02+03+04 = 10
Но надо делать с учётом расположения байт.
convert.png
convert.png (14.23 КБ) 557 просмотров
Apollo
interested
interested
Сообщения: 3
Зарегистрирован: 18 окт 2021, 21:58
Версия LabVIEW: 2012
Благодарил (а): 2 раза
Контактная информация:

Re: Получение полной информации из заголовка Wav-файла

Сообщение Apollo »

На изображении 11 видно, что ровно 4 значения содержаться между двумя строками, которые состоят из 4 элементов. На 12 картинке сопоставлены значения из программы на с++. Значения для строк “RIFF” и “WAWE” совпадает полностью. Почему-то некорректно преобразует значение между двумя строками. Должно быть 1974532 (изображение 12), но имею значение, которое обозначено на картинке 13.
Вложения
11.PNG
12.PNG
12.PNG (9.31 КБ) 551 просмотр
13.PNG
14.PNG
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2704
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 25 раз
Поблагодарили: 95 раз
Контактная информация:

Re: Получение полной информации из заголовка Wav-файла

Сообщение Artem.spb »

Ключевое слово "с учётом расположения байт"
Поскольку формат WAV-файла пришел от операционной системы Windows, в которой традиционно использовались процессоры Intel, все значения данных формата хранятся как Little-Endian, т. е. самый младший значащий байт идет первым.
order.PNG
Собирайте в обратном порядке, или разверните массив
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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