Главная » Программирование звука » 16-битная ИКМ

0

16-битные  форматы  также  бывают  знаковые  и  беззнаковые,  однако  беззнаковый 16-битный формат используется редко. Главным отличием является порядок, в котором 2 байта 16-битного отсчета записываются в файл. (Эта же проблема возникает при использовании менее распространенных 24и 32-битных выборок.)

формата MSB

B формате MSB первым следует старший байт, за ним младший. Этот формат широко применяется в аудиофайлах для компьютеров Macintosh и Amiga, где используются процессоры семейства Motorola 680×0. Такой порядок записи байтов

также согласуется с сетевым форматом, применяемым многими стандартами

Internet.

Листинг 10.5. Классы для 16-битной ИКМ

class DecompressPcm16MsbSigned: public AbstractDecompressor {

public:

DecompressPcm16MsbSigned(AudioAbstract &a): AbstractDecompressor(a) {

// Кодировка: 16-битная  MSB ИКМ.

cerr << "Encoding: 16-bit MSB PCM\n";

};

size_t GetSamples(AudioSample *buffer, size_t length);

};

Для  повышения  эффективности  работы  16-битная  версия  метода  GetSamples просто  считывает  байты  в  буфер,  после  чего  преобразует  каждую  пару  байтов в один отсчет. Учтем, что данный фрагмент кода программы обладает абсолютной переносимостью: мы не делали никаких предположений о порядке байтов, используемом в компьютере, на котором запущена программа. Эта функция будет работать при любом размере данных типа AudioSample, превышающем 16 бит.

Листинг 10.6. Реализация методов для 16-битной ИКМ

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

AudioByte *byteBuff =

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

short s = static_cast<AudioSample>(byteBuff[2*i]) << 8; s |= static_cast<AudioSample>(byteBuff[2*i+1]) & 255; buffer[i] = static_cast<AudioSample>(s)

<< ((sizeof(AudioSample)-2)*8);

}

return read;

}

формата LSB

B случае LSB формата сначала записывается младший байт, а затем старший. Такой  порядок  записи  байтов  широко  распространен  в  форматах,  используемых в  операционных  системах  MS  DOS,  OS/2  и  Microsoft  Windows,  работающих  на процессорах семейства Intel 80×86.

Листинг 10.5. Классы для 16-битной ИКМ (продолжение)

class DecompressPcm16LsbSigned: public AbstractDecompressor {

public:

DecompressPcm16LsbSigned(AudioAbstract &a) i

AbstractDecompressor(a) {

// Кодировка:16-битная  LSB ИКМ

cerr << "Encoding: 16-bit LSB PCM\n";

};

size_t GetSamples(AudioSample *buffer, size_t length);

};

Листинг 10.6. Реализация методов для 16-битной ИКМ (продолжение)

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

AudioByte *byteBuff =

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

short s = static_cast<AudioSample>(byteBuff[2*i+1]) << 8; s |= static_cast<AudioSample>(byteBuff[2*i]) & 255; buffer[i] = static_cast<AudioSample>(s)

<< ((sizeof(AudioSample)-2)*8);

}

return read;

}

Глава 11. Нелинейные звуковые форматы

Линейные  форматы  записи  звука,  в  некотором  смысле,  являются  примитивными. Слух  человека  устроен  так,  что  мы  практически  нечувствительны  к  небольшим искажениям  громких  звуков,  зато  очень хорошо  замечаем  те  же искажения  в  более  тихих  звуках.  Однако  при  использовании  ИКМ  уровень  погрешности  не  зависит от величины амплитуды.

He  будем  забывать,  что  величина,  используемая  нами  для  записи  выборки,  всего  лишь  код.  Стоит  внимательнее  присмотреться  к  этим  кодам  и  подумать, нельзя ли переопределить их так, чтобы повысилось  качество  звука, который мы сможем записать с помощью того же объема данных. Эта идея легла в основу нескольких методов, являющихся альтернативой простой ИКМ.

Предпочтительным  вариантом  кодировки,  применяемой  при  обработке  звука, всегда  останется  линейная  ИКМ.  Независимо  от  того,  какие  манипуляции  вы проводите   смешиваете  два  звука  путем  суммирования  или  изменяете  уровень звучания  при  помощи  умножения  на  постоянный  коэффициент   вы  работаете в  предположении,  что  используемая  кодировка  линейна.  Зато  нелинейные  форматы пригодятся для передачи и хранения звуков.

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

По теме:

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