Радиолюбительские схемы Четверг, 02 Мая 24, 23:36
Меню сайта
Категории раздела
Электроника в быту [16]
Световые приборы и освещение: [10]
Индикаторы и детекторы: [12]
Таймеры и реле [2]
Разное [7]
Электроника на рыбалке [7]
Охранные устройства [12]
Инфракрасная техника [1]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » Электроника в быту » Разное

КАК ЗАПИСАТЬ В ПЗУ АУдИОдАННЫЕ ИЗ wav-ФАЙЛА И ПРОИГРАТЬ ИХ

КАК ЗАПИСАТЬ В ПЗУ АУдИОдАННЫЕ ИЗ wav-ФАЙЛА И ПРОИГРАТЬ ИХ

Независимо от используемой элементной базы конструктивного исполнения и сервисных удобств принцип действия большинства “говорящих” и “играющих” устройств одинаков. Их тракт формирования звуковой информации построен по структурной схеме, показанной на рис. 1. С каждым импульсом тактового генератора G1 изменяется состояние счетчика адреса D1 и код из очередной ячейки ПЗУ DS1 поступает на цифроаналоговый преобразователь (ЦАП) А1. Сигнал с его выхода через фильтр нижних частот (фНЧ) Z1 поступает на вход УМЗЧ (на схеме не показан), а с его выхода — на громкоговоритель. Главное достоинство устройства, выполненного по такой схеме, — способность воспроизвести любой звук: достаточно занести в ПЗУ описывающие его коды, а затем считать их. Но где их взять? Прежде всего, в огромной коллекции различных звуков и мелодий, cуществующих в виде компьютерных файлов. При необходимости файл с записью нужного звукового фрагмента несложно создать самостоятельно, воспользовавшись стандартными программными средствами Windows. для хранения аудиоданных в файлах разработано множество форматов. Один из самых распространенных — wav (подобные файлы имеют имена с расширением .wav). Согласно требованиям фирмы Мiсrosoft, в любом мультимедийном приложении, официально признанном совместимым с Windows, должна быть предусмотрена возможность работы именно с такими файлами, а со всеми другими — лишь по желанию авторов приложений. Имея нужный wav-файл, ответить на поставленный в заголовке вопрос очень просто: достаточно найти в нем последовательность байтов 64Н, 61Н, 74Н, 61Н (соответствующие им символы образуют слово data), пропустить следующие за ними четыре байта и “зашить” в ПЗУ оставшуюся часть файла. Сделать это поможет программа, текст которой на языке Тuгbо Раsсаl 7.0 приведен в табл. 1. Проанализировав файл, программа выводит на экран монитора сведения о содержащихся в нем аудиоданных и записывает эти данные в РПЗУ (например, АТ24С512). Сохраните рисунок и увельчьте его в любом графическом редакторе. Остается собрать несложное воспроизводящее устройство (оно будет описано далее) и слушать сколько угодно раз записанные в РПЗУ звуки. Однако хороший результат будет получен лишь при соблюдении некоторых условий, в противном случае воспроизведенные звуки лишь отдаленно напомнят оригинал. Основных требований два: частота квантования (Fкв,) звукового сигнала в исходном wav-файле должна быть в точности равна таковой (т. е. частоте смены адресов ПЗУ) в устройстве воспроизведения, а коды чисел-отсчетов мгновенных значений — представлены в форме, пригодной для непосредственной подачи на ЦАП. При неравенстве частот квантования воспроизводимый звук будет замедлен или ускорен с соответствующим сдвигом по частоте всего спектра (вспомните голоса Винни-Пуха и Пятачка в известном мультфильме). А несовпадение форм представления чисел приведет к очень большим нелинейным искажениям. Конечно, искажения возможны и по другим причинам. Например, в файле записан стереозвук, а воспроизводящее устройство — монофоническое. Нередко, стремясь уменьшить длину файла, аудиоданные перед записью “сжимают” тем или иным способом. Результат их воспроизведения без предварительной “распаковки” вообще непредсказуем. Но не отчаивайтесь, обнаружив, что понравившийся звуковой фрагмент записан в wav-файл в форме, непригодной для прямого переноса в ПЗУ синтезатора. Прежде всего попытайтесь преобразовать его с помощью стандартной программы, например, той, которая входит в стандартный комплект Windows и под названием “Звукозапись” находится в папке “Развлечения” (Пуск>Программы >Стандартные>Развлечения>Звукозапись). Кроме своего основного назначения, она “умеет” изменять частоту квантования звука, преобразовывать 16-разрядные данные в восьмиразрядные и обратно, а стереофоническую запись — в монофоническую. Если стандартная программа по какой-либо причине не подошла, придется выполнить необходимые преобразования самостоятельно. А для этого нужно знать, как “устроен” wav-файл — частный случай разработанного фирмой Мiсrosoft формата файлов RIFF (Resource Interchange File Format), предназначенных для обмена ресурсами между программами. Аббревиатуру RIFF можно прочитать в самых первых байтах файла, просматривая его как текст. Через четыре байта после нее находится слово wave. Именно эти символы, а не расширение имени файла, служат для безошибочного определения его формата. Подобный прием для фирмы Мiсrosoft обычен. Вспомним, что командные процессоры созданных ею операционных систем фактически распознают исполняемые файлы не по расширению .ехе, а по аббревиатуре МZ в первых двух байтах. Структура wav-файла представлена в табл. 2. Он состоит из разделов, каждый из которых начинается с заголовка — четырехсимвольного идентификатора и 32-разрядного числа, равного длине данного раздела в байтах за вычетом восьми, занятых заголовком. Байты этого и всех других чисел следуют в обычном для IВМ-совместимых компьютеров порядке: первым — младший, последним — старший. Возможные исключения из этого правила обязтельно оговариваются. Собственно аудиоданные находятся в разделе data, однако ему предшествуют один или несколько разделов, в которых приведены значения параметров, необходимых для правильного воспроизведения; адреса контрольных точек, делящих данные на фрагменты; порядок воспроизведения фрагментов, число повторений каждого из них, символьные строки — названия записи в целом и ее фрагментов, а также комментарии. Из всех вспомогательных разделов обязателен только fmt_ (последний символ — пробел). Признак формата записи — первое из полей раздела fmt_ — определяет стратегию всех дальнейших действий. Если он равен 1, коды в разделе data представляют собой простую последовательность отсчетов мгновенных значений сигнала. В технике связи ее называют РСМ (Pulse Code Modulation — импульсно-кодовая модуляция, ИКМ). другие значения признака зарезервированы за различными форматами, зарегистрированными фирмой Мiсrosoft и разрешенными ею для применения в wav-файлах. Например, 2 обозначает АDРСМ (адаптивная дифференциальная ИКМ), 50Н — МРЕG. Все они предусматривают сжатие аудиоданных, причем алгоритмы кодирования и декодирования далеко не всегда опубликованы. “Изобретателям” новых форматов рекомендуется до официальной регистрации записывать в поле признака формата значение ОFFFFН. Для непосредственной подачи на ЦАП пригодна только РСМ. Преобразования, необходимые при записи/воспроизведении данных других форматов, обычно выполняют программно (если позволяет производительность процессора) или аппаратно. Для кодирования и декодирования данных наиболее распространенных форматов выпускаются специализированные микросхемы. Все дальнейшие сведения, приводимые в настоящей статье, относятся только к РСМ. Число каналов записи особых пояснений не требует. Одновременные отсчеты сигналов каждого канала (если их более одного) записаны в разделе data последовательно в порядке номеров каналов. Например, при стереозаписи вначале следует первый отсчет левого канала, затем — первый отсчет правого канала, второй отсчет левого канала, второй отсчет правого канала и т. д. Преобразовать такую запись в монофоническую несложно. достаточно взять отсчеты через один (только левого или только правого канала) либо, арифметически сложив значения каждой пары, получить таким образом отсчеты суммарного сигнала. Необходимо учесть, что для многоканальных систем порядок следования отсчетов сигналов различных каналов в большинстве случаев не стандартизован. Частота Fкв (число выборок в секунду) — важнейший параметр. Чем она выше, тем большей может быть максимальная частота компонентов спектра записываемого сигнала, но тем длиннее получится файл. В этом поле большинства wav-файлов вы найдете значения 11025, 22050 или 44100 Гц. Именно на них рассчитаны воспроизводящие устройства почти всех звуковых карт. Если в приборе, для которого предназначено ПЗУ, частота другая, первое, что необходимо сделать, — выяснить, нельзя ли добиться нужного значения, например, заменив кварцевый резонатор. Пропорционально частоте следует изменить и частоту среза ФНЧ на выходе ЦАП (она не должна быть выше половины Fкв). Если этого сделать не удается, придется прибегнуть к довольно сложной процедуре изменения частоты сигнала, представленного в цифровой форме. При этом следует помнить, что любое такое преобразование вносит в сигнал искажения, как правило, необратимые и трудно поддающиеся коррекции. Средняя скорость потока данных служит лишь для оценки длительности записанного в файле звукового фрагмента и равна произведению значений предыдущего (Fкв) и следующего (размер блока) полей раздела. Размер блока данных — число байт, которое необходимо обработать, чтобы получить значения одной выборки сигнала во всех каналах (для восьмиразрядной одноканальной записи — 1, для 16-разрядной стерео —4). Разрядность данных — число бит, отведенное одному отсчету сигнала одного канала. Значения, не равные 8 (один байт) или 16 (два байта), встречаются здесь только для форматов, отличающихся от РСМ. За нулевой уровень при восьмиразрядном кодировании принято шестнадцатиричное число 80Н. Максимальному положительному уровню (127) соответствует код ОFFН, минимальному отрицательному (—128) — ООН. Такие коды (их называют прямыми со смещением) пригодны для непосредственной подачи на восьмиразрядный ЦАП, на выходе которого постоянную составляющую сигнала нетрудно скомпенсировать или устранить с помощью разделительного конденсатора. Однако арифметические действия с представленными подобным образом числами дают неверные результаты (сложив два отрицательных значения, можно получить положительную сумму). Это необходимо учитывать, например, формируя монофонический сигнал из стереофонического. С особой осторожностью следует подходить к коду 7FН. Иногда вместо обычной “минус единицы” его трактуют как “минус ноль". Соответственно, вся шкала отрицательных значений оказывается смещенной на одну ступень. Шестнадцатиразрядные отсчеты принято представлять иначе. Здесь нулевое значение — ОН, максимальное положительное (32767) — 7FFFН, а минимальное отрицательное (—32768) — 8000Н. Код ОFFFFН соответствует —1. Этот способ представления чисел со знаком называют дополнительным кодированием. Именно к нему приспособ- лены арифметические устройства абсолютно всех микропроцессоров. Переход от одного способа кодирования к другому очень прост. Достаточно инвертировать значение старшего (восьмого или 16-го) двоичного разряда и удалить лишний либо добавить недостающий младший байт. Например: 0000 -> 8000 -> 80 FFFF ->7FFF -> 7FXX FF -> 7F -> 7р 01 ->81 ->81XX Все числа в этом примере — шестнадцатиричные. добавляемый младший байт ХХ может быть любым, но одинаковым во всем преобразуемом массиве. Обычно рекомендуют пользоваться значением 80Н. При преобразовании 16-разрядных данных в восьмиразрядные существует опасность отсечь вместе с младшим байтом тихие звуки. Поэтому перед преобразованием данные желательно нормировать. для этого прежде всего находят в массиве максимальный (по абсолютной величине) отсчет, затем — частное от деления числа 32767 на абсолютное значение этого отсчета, после чего умножают каждый отсчет массива на этот коэффициент. Чтобы уменьшить погрешность вычислений и избежать переполнения разрядной сетки, рекомендуется оперировать числами с плавающей запятой, а затем преобразовать результаты в целые числа. Более простой, но менее точный способ нормирования заключается в следующем. Найдя в массиве наибольший по абсолютному значению код, подсчитывают число идущих подряд нулей (или единиц, если отсчет отрицательный)в его старших двоичных разрядах. Затем сдвигают все коды массива в сторону старшего разряда. Число сдвигов каждого кода на единицу меньше ранее подсчитанного числа нулей (единиц) в максимальном отсчете. Например, максимальный отсчет в массиве—0000101О10101110— начинается с четырех нулей. Он же после нормирования (сдвига на три разряда влево) — 01010101 01110000. другой отсчет того же массива — 11111101 11010011 — после нормирования (сдвига на три разряда влево) — 11101110 10011000. Иногда динамический диапазон (отношение амплитуд самого громкого и самого тихого звуков) 16-разрядной записи настолько широк, что искажения восьмиразрядных данных остаются недопустимо большими даже после нормирования. В подобных случаях приемлемый результат иногда удается получить с помощью искусственного сжатия динамического диапазона. Такая процедура заключается, грубо говоря, в замене значения каждого отсчета величиной, пропорциональной его логарифму. В различных вариантах этой процедуры по-разному аппроксимируется логарифмическая функция и решается “проблема нуля”, логарифм которого, как известно, равен минус бесконечности. Чтобы изменить частоту сигнала, необходимо по его отсчетам, взятым в определенные моменты, вычислить значения новых отсчетов, положение которых на оси времени в общем случае не совпадает ни с одним из имеющихся. Это — непростая операция. Нельзя, например, уменьшить Fкв вдвое, просто взяв отсчеты через один. Спектральные составляющие исходного сигнала, находящиеся в интервале от половины новой до половины исходной Fкв, будут преобразованы в полосу частот полезного сигнала и исказят его. Перед понижением частоты необходимо пропустить исходный массив отсчетов через цифровой ФНЧ, призванный подавить составляющие всех частот, лежащих выше половины новой Fкв. При повышении частоты порядок действий обратный: сначала вычисляют значения новых выборок, а затем результат пропускают через фильтр, подавляющий частоты выше половины исходной Fкв. Принципиальная схема одного из возможных устройств воспроизведения записанных в ПЗУ аудиоданных изображена рисунке: Его удалось предельно упростить, применив микроконтроллер АТ90S2323 (DD1) и РПЗУ 24С512 (DS1), связанные по шине I2C. Тем не менее все узлы, имеющиеся в рассмотренной выше структурной схеме (см. рис. 1), здесь присутствуют. Функцию тактового генератора микроконтроллер реализует программно, посылая каждые 125 мкс по щине I2С запрос чтения очередного байта из РПЗУ. Последнее, выдав на шину требуемый байт, автоматически инкрементирует свой внутренний адресный счетчик. Таким образом, частота Fкв в данном случае равна 8 кГц, что позволяет хранить в РПЗУ объемом 64 Кбайт звуковые фрагменты “телефонного” качества длительностью до 8 с. Операцию преобразования кода в пропорциональное ему напряжение выполняет микропроцессор.На своем выводе РВ2 он программно формирует импульс длительностью, пропорциональной значению полученного из РПЗУ кода. Закон изменения “постоянной составляющей” полученной ШИМ-последовательности (ШИМ — широтно-импульсная модуляция, в англоязычной литературе этому термину соответствует PWM — Pulse Width Modulation) совпадает с заданными кодами, хранящимися в РПЗУ. Коды программы, которые следует занести во FLASH-память микроконтроллера, приведены на рисунке:
Категория: Разное | Добавил: cxema (11 Декабря 06)
Просмотров: 3358
Вход на сайт
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • База знаний uCoz
  • Copyright MyCorp © 2024
    Используются технологии uCoz