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 тактов на выборку. 
 11 
 нравится? 
 8
 8 
 01.02.2015 © 
9zip.ru
 Авторские права охраняет Роскомнадзор
|  | Понравилась статья? Коля говорит:
 поделись с друзьями!
 |  | 
 , Электродвигатель питается от сети переменного тока напряжением 220 В частотой 50 Гц. Под крышкой центрифуги установлен выключатель, блокирующий включение двигателя при открытой крышке. Установкой требуемой выдержки времени подготавливают цепи включения реле и нагревателя.