Форум программистов, компьютерный форум, киберфорум
letete
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Несколько сообщений о МАТЛАБ и о том, как им пользоваться.

Комментарии, критика и восторженное рукоплескание приветствуются в самой категоричной форме.
Оценить эту запись

модернизированная функция 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 ГБ (при том, что на диске – вдвое меньше).

Решение проблемы: можно вручную указывать тип данных:
Matlab M
1
x = single(wavread(...));
либо заменить встроенную функцию wavread функцией с MATLAB Central File Exchange (можно не заменять, а положить в более "высокую" папку из списка директорий – см. help path). Почему заменить – хорошая идея: встроенная функция wavread абсолютно идентична, за исключением указанного приведения типа, такая замена никоим образом не скажется на функционале.

___________________
* предвидя негодующие комментарии, сразу оговорюсь: в стандарте написано
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).
Размещено в МАТЛАБ
Показов 5449 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru