Implementación rápida de DCT


7

Tengo problemas para descubrir cómo seguir los rápidos diagramas del algoritmo DCT 8x8 que se encuentran en los siguientes dos documentos:

(1) Un algoritmo computacional rápido para la transformación discreta del coseno por Chen et al.

y

(2) Algoritmos prácticos rápidos de DCT 1-D con 11 multiplicaciones de Loeffler et al.

En particular, el segundo diagrama que muestra el algoritmo en (2) tiene el siguiente aspecto:

ingrese la descripción de la imagen aquí

La descripción de las operaciones en este algoritmo son:

ingrese la descripción de la imagen aquí

Hay algunas preguntas que tengo sobre esta formulación, y no estoy seguro de dónde encontrar las respuestas:

  1. (2) sugiere que este algoritmo genera un DCT que se escala en algún valor . Menciona que este fue elegido arbitrariamente para evitar cualquier multiplicación en el cálculo del coeficiente DC. Realmente el único requisito es que . Entonces mi pregunta es esta: ¿Cuál es el factor de escala de los coeficientes de salida usando este algoritmo? Parece que son diferentes a la definición original de DCT, pero no sé cuánto (principalmente porque realmente no veo ninguna relación entre este diagrama y la formulación original de DCT): dondeC=2CCDCTCIDCT=4N2

    F(k)=2c(k)Nn=0N1f(n)cos((2n+1)πk2N)
    c(k)=12para y para .k=0c(k)=1k0
  2. El documento establece que la realización del IDCT se puede hacer usando exactamente el mismo algoritmo pero transformando las salidas en entradas y viceversa. Primero, ¿deben ordenarse los coeficientes DCT en orden de inversión de bits antes de ejecutarlos a través del IDCT? Segundo, para los bloques de rotación (los cuadrados en el diagrama), la operación inversa no debería ser: Mi razonamiento es este: la inversa de una rotación por es una rotación por . Por lo tanto, simplemente reemplazamos el ángulo por su inverso y usamos las identidades y

    O0=I0kcosnπ2NI1ksinnπ2NO1=I1ksinnπ2N+I1kcosnπ2N
    θθcos(θ)=cos(θ)sin(θ)=sin(θ) . Tercero, ¿cuál es el factor de escala de los valores transformados después del IDCT? (2) dice , pero empíricamente, esto no ha producido resultados correctos.2N2
  3. Supongamos que después de ejecutar el algoritmo, tengo el resultado de cada carril almacenado en los valores d0 ... d7. Cual de los siguientes es correcto:

    salida [0] = d0 o salida [0] = d0
    salida [4] = d1 salida [1] = d4
    salida [2] = d2 salida [2] = d2
    salida [6] = d3 salida [3] = d6
    salida [7] = d4 salida [4] = d7
    salida [3] = d5 salida [5] = d3
    salida [5] = d6 salida [6] = d5
    salida [1] = d7 salida [7] = d1 

Si hay alguna forma de mejorar esta pregunta, o si debo preguntar en otro lado, hágamelo saber.


Para responder prácticamente a este tipo de preguntas, lo que realmente necesita es un conjunto de valores DCT precalculados y ajustar su implementación hasta que sus resultados se ajusten a esos precalculados ...
Fat32

Tengo todas esas preguntas y más ... ¿alguna vez lo resolviste? Encontré alguna implementación de C que trato de extraer cosas de forma. Escribiré algo si encuentro respuestas.
Pepijn

Respuestas:


4

Muy bien, después de algunos días de mirar este problema, espero poder brindar un poco de orientación a la próxima pobre alma.

  1. Sí, la escala es diferente. En comparación con scipy.fftpack.dctel término DC es y los otros términos . Pero aparentemente todo se cancela muy bien en la transformación inversa.1222
  2. El orden de entrada inverso es exactamente como sale: bit invertido. Literalmente como si voltea la figura y conecta las líneas. Y sí, tienes razón en que el pecado tiene un signo menos. Estoy viendo un factor de escala de 8, FWIW.
  3. El orden de salida de la inversa es el mismo que el orden de entrada de la transformación directa. Entoncesx[n]=IDCT(DCT(x[n]))8

También tenga en cuenta que hay un error en el gráfico y es para el bloque de rotación del lado par.2c6


¡Gracias por tomarse el tiempo de responder estas preguntas! Mi motivación original para esto fue en el contexto de un algoritmo de compresión 2D, por lo que todavía no estoy claro sobre el orden relativo de las salidas (me gustaría que sean de 0-7 para que pueda tenerlas desde el más pequeño al más grande). Tampoco se invierten un poco: 3 -> 5, 5 -> 6, 7 -> 1 no son exactamente reversiones de bits (o no entendí mal aquí).
Mokosha 01 de

1
El orden coincide con en.wikipedia.org/wiki/Bit-reversal_permutation, así que ahí está. Por supuesto, puede reordenarlos como desee. Sugeriría tener esto en cuenta directamente en el paso en zig-zag para evitar costos adicionales.
Pepijn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.