Главная » Программирование звука » Свойства логарифмического кодирования

0

Чтобы  по-настоящему  понять,  что  происходит  при  логарифмическом  кодировании,  давайте  внимательно  посмотрим,  как  ведет  себя  отношение  сигнал/шум, о котором мы говорили в разделе третьей главы.

B случае линейной ИКМ берется некоторый аналоговый сигнал и каждое идеально  точное  моментальное  значение  округляется  до  ближайшего  целого  числа. Таким  образом,  разница  между  идеальной  выборкой  и  значением  ИКМ  никогда не  превышает  1/2  величины  младшего  разряда. B  случае  логарифмического  кодирования  ситуация  усложняется:  для  больших  величин  выборок  ошибка  увеличится, для небольших величин уменьшится.

Давайте посмотрим, как такой меняющийся уровень ошибки влияет на ее общую мощность. Если исходный звук становится громче, то величина отсчетов возрастает и, соответственно, возрастает ошибка. Это приводит к тому, что при увеличении мощности сигнала возрастает мощность ошибки. Фактически, в случае строго логарифмической кодировки отношение сигнал/шум практически постоянно.

Чтобы  убедиться  в  этом,  вы  можете  воспользоваться  программой,  аналогичной той, которая приведена на листинге 11.7. Эта программа берет 1000 выборок синусоиды  и  вычисляет  общую  мощность  ошибки  для  ИКМ  и  компрессии  мютипа.  Вычисления  проводятся  для  пиковых  уровней  отсчетов  в  диапазоне  от  100 до 32000.

Листинг 11.7. Программа logtest.cpp

#include "audio.h"

#include "g711.h"

#include <math.h>

void SNR(AudioSample magnitude) {

// Строим один  период  синусоиды.

float original[1000];

for(int i=0;i<1000;i++)

original[i] = sin(i*2.0*3.14159265/1000.0)*magnitude;

// Сжимаем  ее.

AudioByte compressed[1000];

for(int i=0;i<1000;i++)

compressed[i] = MuLawEncode(static_cast<AudioSample>(original[i]))

// Проводим  декомпрессию.

AudioSample uncompressed[1000];

for(int i=0;i<1000;i++)

uncompressed[i] = MuLawDecode(compressed[i]);

// Вычисляем  погрешность.

float error[1000];

for(int i=0;i<1000;i++)

error[i] = original[i] uncompressed[i];

// Считаем  общую  мощность.

float originalPower = 0.0, errorPower = 0.0, pcmErrorPower =

0.0;

for(int i=0;i<1000;i++) {

originalPower += original[i] * original[i];

errorPower += error[i] * error[i]; float pcmError = original[i] static_cast<AudioSample>(original[i]); pcmErrorPower += pcmError * pcmError;

}

// Отношение  сигнал/шум  и  величина  выходного сигнала.

cout << magnitude;

cout << " " << 10*logl0(originalPower/errorPower); cout << " " << 10*logl0(originalPower/pcmErrorPower); cout << "\n";

}

int main() {

int magnitude = 100;

for (; magnitude < 32000; magnitude += 100) SNR(magnitude);

return 0;

}

Ha рис. 11.2 представлен график, получающийся в результате работы этой про-

граммы. По горизонтальной оси отложена максимальная амплитуда тестируемой

синусоиды;  по  вертикальной   отношение  сигнал/шум  в  децибелах.  Поскольку ИКМ  имеет  фиксированный  уровень  шумов,  можно  предполагать,  что  отношение сигнал/шум   будет   возрастать   логарифмически   (так   как   децибелы   измеряются логарифмически).  Обратите  внимание  на  то,  что  отношение  сигнал/шум  для  логарифмического  кодирования  практически  не  изменяется  и  держится  на  уровне около  30  дБ,  независимо  от  уровня  сигнала.  Дрожание  графика  вызвано  тем,  что мю-компрессия  стандарта  G.711  представляет  собой  лишь  аппроксимацию  логарифмического кодирования.

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

По теме:

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