Главная » Программирование звука » Компрессия ?-Law для телефонных систем

0

По  своей  концепции  кодирование  А-типа  аналогично.  Как  и  мю-компрессия, первоначально  этот  метод  разрабатывался  для  телефонных  систем.  Мю-кодировка  используется  в  Северной  Америке  и  Японии,  А-компрессия   в  Европе.  Подобно   мю-компрессии,  этот   метод   кодирования   описывается   как  непрерывной функцией, так и цифровой аппроксимацией.

Ha  самом  деле  А-компрессия  определяет  набор  кодировок,  зависящий  от  точного  значения  числового  коэффициента  A.  Чаще  всего  A  дается  значение  87.6. Если мы назовем имеющуюся у нас выборку, лежащую в диапазоне от 0 до 1, s, то указанная ниже формула позволит вычислить значение А-типа sA:

?      A     ( s)    s     1

?1 + ln A

A        ?

?1 + ln( As )

??  1 + ln A

?

A

1 ? | | ? 1

A

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

Листинг 11.5. Интерфейс для кодировки А-типа

class DecompressG711ALaw: public AbstractDecompressor {

private:

static AudioSample *_decodeTable;

public:

DecompressG711ALaw(AudioAbstract &a);

size_t GetSamples(AudioSample *buffer, size_t length);

};

AudioSample ALawDecode(AudioByte);

AudioByte ALawEncode(AudioSample);

Листинг 11.6. Реализация методов кодировки А-типа

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

: AbstractDecompressor(a) {

// /Кодировка  А-типа  стандарта ITU G.711

cerr << “Encoding: ITU G.711 A-Law\n”;

if (!aLawDecodeTableInitialized) { aLawDecodeTableInitialized = true; for(int i=0;i<256;i++)

aLawDecodeTable[i] = ALawDecode(i);

}

}

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

AudioByte *byteBuff =

reinterpret_cast<AudioByte *>(buffer); size_t read = ReadBytes(byteBuff,length); for(long i=read-1; i>=0; i–)

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

return read;

}

AudioByte ALawEncode(AudioSample s) {

unsigned char sign = (s<0)?0:0x80;         // Сохраняем  знак.

if (s<0) s=-s;                             // Делаем  отсчет

// положительным.

signed long adjusted = static_cast<long>(s)+8L;

// Округляем  его .

if (adjusted > 32767) adjusted = 32767;    // Ограничиваем.

unsigned char exponent = numBits[(adjusted>>8)&0x7F]; unsigned char mantissa = (adjusted >> (exponent + 4)) & 0xF; return sign | (((exponent << 4) I mantissa) ^ 0x55);

};

AudioSample ALawDecode(AudioByte alaw) {

alaw ^ = 0x55;

unsigned char exponent = (alaw >> 4) & 0x7;

unsigned char mantissa = (alaw & 0xF) + (exponent?16:0); unsigned long adjusted = (mantissa << (exponent + 4)); return (alaw & 0x80)? -adjusted : adjusted;

};

Источник: Кинтцель Т.  Руководство программиста по работе со звуком = A Programmer’s Guide to Sound: Пер. с англ. М.: ДМК Пресс, 2000. 432 с, ил. (Серия «Для программистов»).

По теме:

  • Комментарии