2010-01-01 5 views
1

Кто-нибудь знает, как вычислить ошибку квантования от 16 бит до 8 бит?Как вычислить ошибку квантования от 16 бит до 8 бит?

Я просмотрел статью Википедии о Quantization, но это не объясняет это.

Может ли кто-нибудь объяснить, как это делается?

Много любви, Луиз

Update: Моя функция выглядит следующим образом.

unsigned char quantize(double d, double max) { 
    return (unsigned char)((d/max) * 255.0); 
} 
+0

Я думаю, что ваша функция близка. Он может использовать некоторую проверку ошибок - например, max лучше не равен нулю, оба значения, вероятно, должны быть положительными. Я бы предложил, чтобы его тестирование было на 100% уверенным. Когда вы ожидаете, что выход будет равен нулю? Когда 255? –

+3

Двойной не 16 бит ... –

+0

Похоже, что max является максимальным значением образца 'd'. Код не применяет его, хотя -d может принимать очень малые отрицательные значения или очень большие положительные значения, что приводит к выходу, который не находится в диапазоне 0-255 (что кажется намеренным.) Также, что такое вывод данные должны быть? Неподписанные звуковые сэмплы, расположенные вокруг 128? Любые отрицательные значения приведут к тому, что диапазон возврата будет [-255, 255], что, вероятно, не соответствует вашим потребностям. –

ответ

1

Это статья в Википедии, выраженная как отношение сигнал/шум. Но я думаю, что реальный вопрос: в каких единицах вы хотите получить результат? В качестве сигнала отношение мощности шума к, это 20 лог (2^8) = 55 дБ

Вы, вероятно, нужно прочитать: http://en.wikipedia.org/wiki/Decibel

+0

Итак, я думаю, что это значения SQNR, которые я должен вычислить и вычесть? SQNR_16 - SQNR_8 = 20 * log_10 (2^16) - 20 * log_10 (2^8) = 48.165 дБ или должно быть SQNR = 20 * log10 (2^(16-8)) = 55 дБ, если я хочу знать ошибку, идущую от 16 бит до 8 бит? – Louise

+0

Последний, 55 дБ, идущий от 16 бит до 8 бит. –

1

Как правило, погрешность представляет собой разницу между восстановленным квантованным сигналом и исходным сигналом.

Скажите, что ваша оригинальная серия Xi, и вы квантовываете, выполняя целочисленное деление на q - вы получаете серию целочисленных значений int (Xi/q). Ваш член ошибки e = Xi - q * int (Xi/q).

Например: примерное значение 60000, деленное на 256, дает 234. 234 * 256 = 59904 после деквантования. Ошибка квантования равна 60000-59904 = 96.

+0

Так что вообще невозможно вычислить ошибку? – Louise

+0

Это может пригодиться. Спасибо большое =) – Louise

2

Думаю, вам нужно преобразовать 16-разрядное значение и 8-битное значение в соответствующие им аналоговые значения, которые они представляют, а затем принять разницу между ними. Чтобы придерживаться записей в Википедии, вот one, в которых говорится об этом.

1

Интересно, что если вы обрабатываете последние 8 бит как подписанный символ, он дает правильную ошибку квантования.

ОК верхняя функция сложна, вы должны использовать что-то вроде.

short absolute_quatization_error(short measurement) //lets consider that short is 16bits 
{ 
    short r; 
    r=measurement & 0xFF; 
    if (r>0x7F) 
     return (0xFF-r); 
    else 
     return r; 
} 

Если вам нужна относительная ошибка, которую вы должны использовать.

float relative_quatization_error(short measurement) 
{ 
    return 1.0*absolute_quatization_error(measurement)/((float)measurement); //i did not check if this correctly converts to float. 
}