Uso de np.round() ao invés de np.floor() para quantização

Uso de np.round() ao invés de np.floor() para quantização

por Gustavo Chicato -
Número de respostas: 2

Segundo os exemplos do livro, a quantização está sendo feita deste jeito:

xqnorm = np.floor(16*xsnorm)
xq = (ub-lb)*xqnorm/16+lb+0.5*(ub-lb)/16

Porém, uma alternativa seria:

xqnorm = np.round(16*xsnorm)
xq = (ub-lb)*xqnorm/16+lb

Desta forma não é necessário fazer a "correção" no final.
Testei aqui e aparentemente o erro de quantização é o mesmo. Tudo bem usar esta forma?

Em resposta à Gustavo Chicato

Re: Uso de np.round() ao invés de np.floor() para quantização

por Marcelo Queiroz -

Oi, Gustavo!

A diferença entre as duas formas é sutil, mas não é desprezível. De fato existe uma relação simples entre floor e round dada por

round(x) = floor(x+0.5), para todo x>=0;

o que acontece com as duas alternativas no entanto tem a ver com o mapeamento posterior ao truncamento/arredondamento, que é o passo final da quantização (o mapa q-til na notação do livro). Pra simplificar a diferenciação dos casos, considere ub=L e lb=0.

No primeiro exemplo, os 16 códigos k=0,1,...,15 são mapeados nos valores (0.5,1.5,...,15.5) * L onde L é a extensão das amplitudes dos sinais. Isso significa que cada código k ocupará o centro de uma faixa de largura L/16, sendo todas as faixas iguais.

No segundo exemplo, os 17 códigos k=0,1,...,16 são mapeados nos valores (0,1,...,16) * L, sendo que os códigos 0 e 16 representarão faixas de largura L/32, e todos os demais códigos representarão faixas de largura L/16.

Conforme a situação, a segunda fórmula pode produzir valores incompatíveis com a codificação desejada: basta pensar nos 256 valores 0,...,255 cabíveis em cada canal de cor RGB, e a possibilidade da fórmula produzir um pixel com valor 256. Tentar resolver fazendo L=255/16 não resolve o problema das faixas de largura desigual.

A rigor, em cada amostra o erro de quantização será diferente nos dois casos, mas como esse erro tem um comportamento aparentemente aleatório, não é improvável que ao se calcular a energia relativa do erro de quantização se chegue mesmo em valores bem parecidos.

Espero que tenha ficado claro...

Em resposta à Marcelo Queiroz

Re: Uso de np.round() ao invés de np.floor() para quantização

por Gustavo Chicato -

De fato, testando nas questões do EP, tanto a quantização unidimensional quanto de imagem só produziam resultados corretos com o floor().

Essa explicação deixa mais claro o porquê.

Obrigado, professor!