9zip.ru Инструкции Декодер сжатого звука
Проблемы были очевидными - несжатый звук занимает слишком много памяти. С другой стороны, известные алгоритмы сжатия требуют много вычислительных ресурсов, хотя и обеспечивают хорошее сжатие и/или приличное звучание.
Итак, задача была поставлена - найти компромисс между простотой алгоритма, степенью сжатия и качеством звука.
В результате жестоких экспериментов над моими ушами получился элементарный декодер. На входе - два бита, на выходе значение очередного отсчета сигнала. Алгоритм напоминает последовательное приближение или сильно упрощенный ADPCM.
Процедура не зависит от частоты нарезки и разрядности отсчетов. Я не мастер формализовать алгоритмы, но выглядит это примерно так:
Алгоритм помнит два значения:
- предыдущее значение сигнала A(n)
- текущий шаг D(n)
На вход поступают два бита:
- знак S
- величина M
Надо получить:
- следующее значение сигнала A(n+1)
- следующий шаг D(n+1)
Если не вдаваться в тонкости реализации, то процедура элементарная. Здесь для простоты описания введена переменная Delta.
1. Считаем дельту:
Если M==0:
Delta = D(n)
D(n+1) = D(n) / 2
Eсли M==1:
Delta = D(n) * 3
D(n+1) = D(n) * 2
2. Считаем сигнал:
Eсли S==0:
A(n+1) = A(n) + Delta
Если S==1:
A(n+1) = A(n) - Delta
Как видите все достаточно просто. В конкретной реализации нужно только учесть граничные условия. Например, ограничить минимальные и максимальные значения шага и сигнала (чтобы обеспечить быструю сходимость и не вылезти за разрядную сетку).
Звук получается довольно шумный, но вполне разборчивый. Я пробовал играть коэффициентами или добавлять цифровые фильтры. Иногда удается получить лучший по качеству звук (особенно, когда известна частота нарезки и АЧХ сигнала) Но мне показалось, что вычислительные затраты растут неадекватно росту качества звучания. Кроме того, хотелось сохранить простоту и интуитивную понятность идеи. Впрочем можете поэкспериментировать сами.
Вся функция декодера написана на ассемблере для линковки с AVR-GCC проектом. Скорость ее работы зависит от входных данных, но худший случай - 28 тактов на выборку.
10 нравится?
6 01.02.2015 ©
9zip.ru Авторские права охраняет Роскомнадзор
| Понравилась статья? Коля говорит: поделись с друзьями! |
|
, Электродвигатель питается от сети переменного тока напряжением 220 В частотой 50 Гц. Под крышкой центрифуги установлен выключатель, блокирующий включение двигателя при открытой крышке. Установкой требуемой выдержки времени подготавливают цепи включения реле и нагревателя.