Компресія Α-Law

За своєю концепцією кодування А-типу аналогічно Як і мю-компресія, спочатку цей метод розроблявся для телефонних систем Мю-кодування використовується в Північній Америці і Японії, А-компресія в Європі Подібно мю-компресії, цей метод кодування описується як безперервною функцією, так і цифровий аппроксимацией

Ha насправді А-компресія визначає набір кодувань, що залежить від точного значення числового коефіцієнта A Найчастіше A дається значення 876 Якщо ми назвемо наявну у нас вибірку, лежачу в діапазоні від 0 до 1, s, то зазначена нижче формула дозволить обчислити значення А-типу sA:

⎧      A     ( s)    s     1

⎪1 + ln A

A        

⎪1 + ln( As )

⎪⎩  1 + ln A

A

1 ≤ | | ≤ 1

A

Цифрова апроксимація найвищою мірою нагадує апроксимацію, використовувану в мю-кодуванні Основна відмінність полягає в тому, що у вихідному коді кодування А-типу біти інвертуються через один

Лістинг 115 Інтерфейс для кодування А-типу

class DecompressG711ALaw: public AbstractDecompressor {

private:

static AudioSample *_decodeTable

public:

DecompressG711ALaw(AudioAbstract &ampa)

size_t GetSamples(AudioSample *buffer, size_t length)

}

AudioSample ALawDecode(AudioByte)

AudioByte ALawEncode(AudioSample)

Лістинг 116 Реалізація методів кодування А-типу

static bool aLawDecodeTableInitialized = false static AudioSample aLawDecodeTable[256] DecompressG711ALaw::DecompressG711ALaw(AudioAbstract &ampa)

: AbstractDecompressor(a) {

/ / / Кодування А-типу стандарту ITU G711

cerr &lt&lt &quotEncoding: ITU G711 A-Law\n"

if (aLawDecodeTableInitialized) { aLawDecodeTableInitialized = true for(int i=0i&lt256i++)

aLawDecodeTable[i] = ALawDecode(i)

}

}

size_t DecompressG711ALaw::GetSamples(AudioSample *buffer, size_t length) {

AudioByte *byteBuff =

reinterpret_cast&ltAudioByte *&gt(buffer) size_t read = ReadBytes(byteBuff,length) for(long i=read-1 i&gt=0 i–)

buffer[i] = aLawDecodeTable[ byteBuff[i] ]

return read

}

AudioByte ALawEncode(AudioSample s) {

unsigned char sign = (s <0)? 0:0 x80; / / Зберігаємо знак.

if (s <0) s =-s; / / Робимо відлік

/ / Позитивним

signed long adjusted = static_cast&ltlong&gt(s)+8L

/ / Округляємо його

if (adjusted> 32767) adjusted = 32767 / / Обмежуємо

unsigned char exponent = numBits[(adjusted&gt&gt8)&amp0x7F] unsigned char mantissa = (adjusted &gt&gt (exponent + 4)) &amp 0xF return sign | (((exponent &lt&lt 4) I mantissa) ^ 0x55)

}

AudioSample ALawDecode(AudioByte alaw) {

alaw ^ = 0x55

unsigned char exponent = (alaw &gt&gt 4) &amp 0x7

unsigned char mantissa = (alaw &amp 0xF) + (exponent16:0) unsigned long adjusted = (mantissa &lt&lt (exponent + 4)) return (alaw &amp 0x80) -adjusted : adjusted

}

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = A Programmers Guide to Sound: Пер з англ М: ДМК Пресс, 2000 432 с, іл (Серія «Для програмістів»)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*