Несколько сообщений о МАТЛАБ и о том, как им пользоваться.
Комментарии, критика и восторженное рукоплескание приветствуются в самой категоричной форме.
Комментарии, критика и восторженное рукоплескание приветствуются в самой категоричной форме.
модернизированная функция WAVREAD
Запись от letete размещена 01.07.2014 в 19:29
Метки improvement, matlab
Среди встроенных функций МАТЛАБ существует функция чтения WAV-файлов под названием wavread. Собственно, это не новость и не секрет. Функция хорошо задокументирована и почти всегда нормально работает. В смысле почти всегда работает и почти всегда нормально. Попытаюсь объяснить что я имею ввиду. Если внимательно прочитать справку по функции (help wavread), то можно обратить внимание на то, что "Supports Microsoft PCM data format only". Однако, если посмотреть реализацию функции (edit wavread), то можно обратить внимание на то, что в ней заложено возможное расширение на другие форматы в будущем. Это, безусловно, хорошо, но если Вы натолкнулись на неподдерживаемый формат, придется самостоятельно его обрабатывать. И если у кого-то есть решения, дайте знать, пожалуйста. На что еще можно обратить внимание? А вот на что: в стандарте МАТЛАБ все переменные по умолчанию записываются в тип double, который, как известно, занимает 8 Байт. С другой стороны, стандарт формата WAV (во всяком случае, тот самый Microsoft PCM data format) предполагает кодирование каждого отсчета знаковым целым от -2 147 483 648 до 2 147 483 647 (сравни с [intmin('int32') intmax('int32')]) при 32-битной кодировке и еще меньший диапазон при других кодировках. Т.е. стандартом WAV ограничивается тип данных для выборки (не бывает WAV c 64-битной кодировкой*). Вывод: при чтении аудиофайла с помощью функции wavread в памяти занимается места минимум в 2 раза больше, чем требуется. Конечно, это не страшно, если мы считываем песенку длительностью 5 или даже 10 минут. Однако иногда требуется обрабатывать аудиофайлы длительностью несколько часов. Нехитрый подсчет: 32-разрядная кодировка, 2-канальная запись, частота дискретизации 22 кГц (радио), длительность 2 часа займет в оперативной памяти примерно 2.5 ГБ (при том, что на диске – вдвое меньше). Решение проблемы: можно вручную указывать тип данных:
___________________ * предвидя негодующие комментарии, сразу оговорюсь: в стандарте написано Significant Bits Per Sample This value specifies the number of bits used to define each sample. This value is usually 8, 16, 24 or 32. If the number of bits is not byte aligned (a multiple of 8) then the number of bytes used per sample is rounded up to the nearest byte size and the unused bytes are set to 0 and ignored. Конечно, ключевое слово здесь usually, и чисто теоретически возможна запись 64-разрядного звука, но во-первых, на практике редко используется (я не встречал), и во-вторых, встроенная функция wavread не сможет прочитать такого файла (см. строки 702-715 edit wavread). |
Всего комментариев 0
Комментарии