8-бітна ІКМ

Як я вже говорив вище, незважаючи на те що більшість програмістів вважають ІКМ-дані «незжатими», правильніше було б говорити не про компресії, а прокодуванніПодібно іншим методи представлення звуку, ІКМ є кодуванням K жаль, широкого поширення набуло безліч варіантів ІКМ

Найчастіше при запису даних із застосуванням ІКМ для зберігання одного від-

рахунку використовується від 8 до 16 біт (1 або 2 байти) Однак навіть у тому випадку, якщо задіяний тільки один байт, виникають певні розбіжності

Знакова

Для зберігання звуку в цифровому вигляді необхідно мати можливість записувати як позитивні, так і негативні числа, єдиної думки про те, як це слід робити, досі не вироблено

B  знаковомуформаті (званому щедодатковим кодом)один байт використовується для представлення відліків в діапазоні від -128 до +127 Значення в діапазоні від 0 до +127 записуються без змін негативні, від -128 до -1, перетворюються в двійкові байти в результаті складання їх з числом 256 Цей формат збігається з внутрішнім поданням чисел, яке, як правило, воліють програмісти і використовують у багатьох системах

Лістинг 103 Класи для 8-бітної ІКМ

class DecompressPcm8Signed: public AbstractDecompressor {

public:

DecompressPcm8Signed(AudioAbstract &ampa): AbstractDecompressor(a) {

/ / Кодування: 8-бітна знакова (додатковий код) ІКМ

cerr &lt&lt &quotEncoding: 8-bit signed (twos complement) PCM\n"

}

size_t GetSamples(AudioSample * buffer, size_t length)

}

Незважаючи на невелику довжину представленої нижче версії реалізації методу GetSamples, при її написанні довелося врахувати ряд складних моментів Поперше, через те, що 8-бітові відліки коротше, ніж значення типу AudioSample, можливе повторне використання одного і того ж буфера Також необхідно стежити за тим, щоб не затерти необроблені дані при перетворенні

8-бітних відліків в більш довгі значення типу AudioSample Зверніть увагу на те, як змінюються типи: будь декомпрессор звукової інформації зчитуєбайти,а повертаєвибіркиТакож відзначимо, що короткі 8-бітові вибірки зсуваються вліво, в область найбільш значущих бітів більш довгих значень типу AudioSample

Лістинг 104 Реалізація методів для 8-бітної ІКМ

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

AudioByte *byteBuff =

reinterpret_cast&ltAudioByte *&gt(buffer)

size_t samplesRead = ReadBytes(byteBuff,length)

for(long i=samplesRead-1 i&gt=0 i–)

buffer[i] = static_cast&ltAudioSample&gt(byteBuff[i])

&lt&lt ((sizeof(AudioSample)-1)*8)

return samplesRead

}

Беззнаковая

При роботі збеззнаковимформатом (також званимкодом з надлишком

128) використовується той же діапазон відліків, до яких додається число 128,

щоб отримати байт із значенням від 0 до 255 B зокрема в байт, відповідний нульовому значенню вибірки, записується 128 беззнакового формат задається кількома телекомунікаційними стандартами і широко використовується в апаратному забезпеченні

Лістинг 103 Класи для 8-бітної ІКМ (продовження)

class DecompressPcm8Unsigned: public AbstractDecompressor {

public:

DecompressPcm8Unsigned(AudioAbstract &ampa): AbstractDecompressor(a) {

/ / Кодування :8-6ітная Беззнаковая (код з надлишком 128) ІKM

cerr &lt&lt &quotEncoding: 8-bit unsigned (excess-128) PCM\n"

}

size_t GetSamples(AudioSample * buffer, size_t length)

}

Єдиним реальним відмінністю між числами із знаком і числами без знака є старший біт B знаковому форматі для негативних чисел в старший біт записується одиниця в беззнакового форматі старший біт використовується для позитивних чисел Таким чином, для перетворення беззнакових чисел потрібно вважати блок байтів, а потім у кожному байті змінити значення старшого біта на протилежне Наведений нижче варіант методу GetSamples ідентичний що використовувалися раніше версіями, крім операції виключає АБО, за допомогою якої змінюються значення старшого біта

Лістинг 104 Реалізація методів для 8-бітної ІКМ (продовження)

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

AudioByte *byteBuff =

reinterpret_cast&ltAudioByte *&gt(buffer)

size_t samplesRead = ReadBytes(byteBuff,length)

for(long i=samplesRead-1 i&gt=0 i–)

buffer[i] = static_cast&ltAudioSample&gt(byteBuff[i] ^ 0x80)

&lt&lt ((sizeof(AudioSample)-1)*8)

return samplesRead

}

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = 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>

*

*