Властивості логарифмічного кодування

Щоб по-справжньому зрозуміти, що відбувається при логарифмічному кодуванні, давайте уважно подивимося, як веде себе ставлення сигнал / шум, про який ми говорили в розділі третього розділу

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

Давайте подивимося, як такий мінливий рівень помилки впливає на її загальну потужність Якщо вихідний звук стає голосніше, то величина відліків зростає і, відповідно, зростає помилка Це призводить до того, що при збільшенні потужності сигналу зростає потужність помилки Фактично, у разі строго логарифмічною кодування відношення сигнал / шум практично постійно

Щоб переконатися в цьому, ви можете скористатися програмою, аналогічної тій, яка приведена на лістингу 117 Ця програма бере 1000 вибірок синусоїди і обчислює загальну потужність помилки для ІКМ і компресії мютіпа Обчислення проводяться для пікових рівнів відліків в діапазоні від 100 до 32000

Лістинг 117 Програма logtestcpp

#include &quotaudioh&quot

#include &quotg711h&quot

#include &ltmathh&gt

void SNR(AudioSample magnitude) {

/ / Будуємо один період синусоїди

float original[1000]

for(int i=0i&lt1000i++)

original[i] = sin(i*20*314159265/10000)*magnitude

/ / Стискаємо її

AudioByte compressed[1000]

for(int i=0i&lt1000i++)

compressed[i] = MuLawEncode(static_cast&ltAudioSample&gt(original[i]))

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

AudioSample uncompressed[1000]

for(int i=0i&lt1000i++)

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

/ / Обчислюємо похибку

float error[1000]

for(int i=0i&lt1000i++)

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

/ / Вважаємо загальну потужність

float originalPower = 00, errorPower = 00, pcmErrorPower =

00

for(int i=0i&lt1000i++) {

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

errorPower += error[i] * error[i] float pcmError = original[i] static_cast&ltAudioSample&gt(original[i]) pcmErrorPower += pcmError * pcmError

}

/ / Відношення сигнал / шум і величина вихідного сигналу

cout &lt&lt magnitude

cout &lt&lt &quot &quot &lt&lt 10*logl0(originalPower/errorPower) cout &lt&lt &quot &quot &lt&lt 10*logl0(originalPower/pcmErrorPower) cout &lt&lt &quot\n"

}

int main() {

int magnitude = 100

for ( magnitude &lt 32000 magnitude += 100) SNR(magnitude)

return 0

}

Ha рис 112 представлений графік, що виходить в результаті роботи цієї про-

грами По горизонтальній осі відкладена максимальна амплітуда тестируемой

синусоїди по вертикальній відношення сигнал / шум в децибелах Оскільки ІКМ має фіксований рівень шумів, можна припускати, що ставлення сигнал / шум буде зростати логарифмічно (Так як децибели вимірюються логарифмічно) Зверніть увагу на те, що ставлення сигнал / шум для логарифмічного кодування практично не змінюється і тримається на рівні близько 30 дБ, незалежно від рівня сигналу Тремтіння графіка викликано тим, що мю-компресія стандарту G711 являє собою лише апроксимацію логарифмічного кодування

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

*

*