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


А. ДОЛГИЙ, г. Москва

При преобразовании 16-разрядных данных в восьмиразрядные существует опасность отсечь вместе с младшим байтом тихие звуки. Поэтому перед преобразованием данные желательно нормировать. Для этого прежде всего находят в массиве максимальный (по абсолютной величине) отсчет, затем - частное от деления числа 32767 на абсолютное значение этого отсчета, после чего умножают каждый отсчет массива на этот коэффициент. Чтобы уменьшить погрешность вычислений и избежать переполнения разрядной сетки, рекомендуется оперировать числами с плавающей запятой, а затем преобразовать результаты в целые числа.

Более простой, но менее точный способ нормирования заключается в следующем. Найдя в массиве наибольший по абсолютному значению код, подсчитывают число идущих подряд нулей (или единиц, если отсчет отрицательный)

в его старших двоичных разрядах. Затем сдвигают все коды массива в сторону старшего разряда. Число сдвигов каждого кода на единицу меньше ранее подсчитанного числа нулей (единиц) в максимальном отсчете. Например, максимальный отсчет в массиве - 00001010 10101110 - начинается с четырех нулей. Он же после нормирования (сдвига на три разряда влево) - 01010101 01110000. Другой отсчет того же массива - 11111101 11010011 - после нормирования (сдвига на три разряда влево) - 11101110 10011000.

Иногда динамический диапазон (отношение амплитуд самого громкого и самого тихого звуков) 16-разрядной записи настолько широк, что искажения восьмиразрядных данных остаются недопустимо большими даже после нормирования. В подобных случаях приемлемый результат иногда удается получить с помощью искусственного сжатия динамического диапазона. Такая процедура заключается, грубо говоря, в замене значения каждого отсчета величиной, пропорциональной его логарифму. В различных вариантах этой процедуры по-разному аппроксимируется логарифмическая функция и решается "проблема нуля", логарифм которого, как известно, равен минус бесконечности.

Чтобы изменить частоту FKB сигнала, необходимо по его отсчетам, взятым в определенные моменты, вычислить значения новых отсчетов, положение которых на оси времени в общем случае не совпадает ни с одним из имеющихся. Это - непростая операция. Нельзя, например, уменьшить FKB вдвое, просто взяв отсчеты через один. Спектральные составляющие исходного сигнала, находящиеся в интервале от половины новой до половины исходной FKB, будут преобразованы в полосу частот полезного сигнала и исказят его.

Перед понижением частоты FKB необходимо пропустить исходный массив отсчетов через цифровой ФНЧ, призванный подавить составляющие всех частот, лежащих выше половины новой FKB. При повышении частоты порядок действий обратный: сначала вычисляют значения новых выборок, а затем результат пропускают через фильтр, подавляющий частоты выше половины исходной FKB.

Фильтр с конечной импульсной характеристикой (КИХ-фильтр), реализуют, вычисляя отсчеты выходного сигнала у, по формуле у, = k,*х,+k2* хi+1+...+ Кm*xi+m-1.

Каждый из m последовательных входных отсчетов Xi+j-1, умножают на соответствующий коэффициент kj, а полученные произведения суммируют. Сдвинув входной массив на один отсчет, аналогичным образом получают значение уi+1 и т. д. до конца массива. Число m называют длиной или порядком фильтра. Чем оно больше, тем лучшие показатели (например, затухание в полосе непрозрачности фильтра) могут быть достигнуты, но тем больше вычислений придется выполнить.

В табл. 3 приведены коэффициенты ФНЧ (т=128), необходимого для подготовки данных к уменьшению значения FKB с 44,1 до 8 кГц. Спектральные составляющие с частотами выше 4 кГц он подавит не менее чем на 40 дБ. Данные из этой таблицы пригодны и для фильтрации сигналов с исходными частотами FKB 22,05 или 11,025 кГц - достаточно взять соответственно каждый второй или каждый четвертый коэффициент. Частота среза фильтра останется прежней.

cif-501-1.gif
Рис. 1
Приступая собственно к понижению частоты FKB, необходимо, зная временное положение каждого "нового" отсчета, взять из исходного массива несколько наиболее близких к нему по времени "старых" и на основании их значений рассчитать его величину. В простейших случаях просто повторяют значение ближайшего "соседа" или полагают, что оно лежит на прямой линии, соединяющей предыдущий отсчет с последующим (линейная интерполяция).

В справочниках по математике имеются интерполяционные формулы, учитывающие значения и большего числа соседних отсчетов. Расчеты по ним довольно сложны, но результаты - намного точнее. Однако при обработке сигналов, отсчеты которых представлены целыми числами, т. е. квантованы не только по времени, но и по амплитуде, не имеет смысла добиваться погрешности, значительно меньшей шага квантования по амплитуде. Для восьмиразрядных данных вполне достаточная точность достигается при учете двух-трех соседних отсчетов. Однако вычисления следует производить с максимальной точностью, прибегая к округлению промежуточных результатов лишь в крайнем случае. Если исходные данные - 16-разрядные, их следует обрабатывать именно в таком виде, преобразуя в восьмиразрядные только на последнем этапе.

Строго говоря, процедуру интерполяции можно свести к пропусканию сигнала через так называемый интерполяционный фильтр, который иногда удается объединить с рассмотренным выше ФНЧ, ограничивающим спектр сигнала. Конкретное решение зависит от располагаемой вычислительной мощности, времени, отведенного на обработку, доступного объема оперативной памяти и многих других факторов.

cif-501-2.gif
Рис. 2
Принципиальная схема одного из возможных устройств воспроизведения записанных в ПЗУ аудиоданных изображена на рис. 2. Его удалось предельно упростить, применив микроконтроллер AT90S2323 (DD1) и РПЗУ 24С512 (DS1), связанные по шине I2C. Тем не менее все узлы, имеющиеся в рассмотренной выше структурной схеме (см. рис. 1), здесь присутствуют. Функцию тактового генератора микроконтроллер реализует программно, посылая каждые 125 мкс по шине I2C запрос чтения очередного байта из РПЗУ. Последнее, выдав на шину требуемый байт, автоматически инкрементиру-ет свой внутренний адресный счетчик. Таким образом, частота FKB в данном случае равна 8 кГц, что позволяет хранить в РПЗУ объемом 64 Кбайт звуковые фрагменты "телефонного" качества длительностью до 8 с.

Операцию преобразования кода в пропорциональное ему напряжение также выполняет микропроцессор. На своем выводе РВ2 он программно формирует импульс длительностью, пропорциональной значению полученного из РПЗУ кода. Закон изменения "постоянной составляющей" полученной ШИМ-последовательности (ШИМ - широтно-импульсная модуляция, в англоязычной литературе этому термину соответствует PWM - Pulse Width Modulation) совпадает с заданными кодами, хранящимися в РПЗУ Коды программы, которые следует занести во FLASH-память микроконтроллера, приведены в табл. 4.

Один из недостатков ШИМ по сравнению с другими вариантами цифро-аналогового преобразования - повышенный уровень спектральных компонентов с частотами, близкими к частоте FKB, которая в рассматриваемом случае к тому же лежит в слышимом диапазоне. Простейшего RC-фильтра для их подавления недостаточно, поэтому применена микросхема МАХ295 (DA1), представляющая собой ФНЧ восьмого порядка. Частоту среза фильтра 3,6 кГц устанавливают подборкой конденсатора С5. Если в качестве DA1 использовать микросхему МАХ7400 или МАХ7403 (они рассчитаны на питание от одного источника и отличаются назначением выводов), элементы R3, R4 и С4 можно исключить.

cif-501-3.gif
ШИМ свойственны и другие недостатки, зачастую делающие невозможным ее применение в аудиосистемах высокого качества. Один из них связан с тем, что для ФНЧ (при его отсутствии - для уха слушателя) энергия каждого импульса представляется сосредоточенной в его "центре тяжести". В результате, если все импульсы (рис. 3, последовательность 3) начинаются в моменты, совпадающие с очередными отсчетами исходного сигнала (рис. 3, кривая 1), на выходе фильтра он искажается таким образом (кривая 2), будто каждый отсчет задержан на время, равное половине длительности соответствующего импульса.
cif-501-4.gif
Рис. 3
Пренебрегать этим явлением нельзя, так как даже на частоте, в восемь раз меньшей частоты квантования, коэффициент гармоник искаженного сигнала достигает 20 %, возрастая с повышением частоты. К счастью, такие искажения легко устранить. Достаточно сдвигать каждый импульс таким образом, чтобы независимо от длительности он располагался симметрично относительно середины соответствующего периода квантования (рис. 3, последовательность 4). Такой прием реализован в предлагаемой программе микроконтроллера.

С другим эффектом, связанным с так называемыми апертурными искажениями, дело обстоит сложнее. Известно, что коэффициент передачи ЦАП зависит от частоты сигнала тем сильнее, чем более длинные импульсы используются для восстановления сигнала. Соответствующие зависимости приведены на рис. 4. Например, если длительность импульса tИ равна периоду квантования T=1/FKB (выходное напряжение в интервалах между отсчетами остается постоянным и равным значению отсчета), амплитуда восстановленного сигнала на частоте, близкой к 0,5FKB, уменьшается почти на 40 % по сравнению с получаемой на значительно более низких частотах.

В обычных ЦАП длительность импульсов постоянна, и апертурные искажения не имеют нелинейного характера. Их легко устраняют с помощью простых цифровых или аналоговых фильтров, поднимающих высокие частоты. Длительность импульсов ШИМ изменяется в широких пределах пропорционально мгновенным значениям сигнала, что приводит к динамической нелинейности преобразования. Искажения растут с увеличением частоты и амплитуды. Если последняя такова, что длительность импульсов изменяется от нуля до максимума, почти равного периоду квантования, коэффициент гармоник сигнала частотой, в восемь раз меньшей FKB, составит примерно 4 %. При увеличении частоты сигнала вдвое он возрастет до 30 %. С уменьшением амплитуды искажения падают.

Один из путей снижения подобных искажений - уменьшение максимальной длительности импульсов. Однако это требует повышенного быстродействия формирующего ШИМ узла и неблагоприятно отражается на энергетических и шумовых характеристиках устройства в целом.

Другой способ - повышение частоты FKB - связан еще и с увеличением объема ПЗУ, хранящего данные. Некоторый эффект дает применение двухканальной системы, в которой максимальной длительности импульсов в одном из каналов соответствует минимальная в другом. Вычитая выходные сигналы каналов, можно частично скомпенсировать апертурные искажения. К сожалению, другие достаточно простые способы устранения искажений подобного рода автору неизвестны. Возможно, их смогут предложить читатели.

cif-501-5.gif
Рис. 4

Радио 5/2001, с.23-24.