![]() |
Datos interpaginados a array
Hola, tengo una aplicación que me funciona bien, pero teóricamente no entiendo del todo cómo lo hace, me explico: se trata de alimentar un codificador de audio, al cual le llega un array tipo byte con las muestras interpaginadas de los canales L y R. Para ello primero voy leyendo el wav de entrada, que voy guardando a cada pasada del bucle, con Blockread, guardo en un array bufer de 2*n posiciones. Después con otro bucle interno al primero se van interpaginando las muestras guardándose en otro array pcm de mitad de tamaño, o sea, n. Cuando termina este subbucle, coge y alimenta al codificador. Para que se entienda, voy a poner el trozo de código que interesa:
Cita:
No pongo más segmentos de código porque no interesa saber nada más que lo que aquí muestro. La clave está en por qué utilizo un bufer de mitad de tamaño para interpaginar las muestras, cómo se interpaginan dentro del for, o sea, cuándo se cogen las pares. |
¿Es mi impresión, o el array llamado PCM va a ser el contenido del audio en mono? No sé, igual estoy algo confundido, pero eso de que opere con buffer[2*i+1] y buffer[2*i] da toda la impresión de que se estén mezclando ambos canales, en ese caso la operación adecuada para sumar ambos canales sea esa con shl y or.
Salu2, y perdón si sólo estoy confundido y no te he ayudado :(. |
Hola ixMike, gracias por tu interés, estás cerca de dar con la clave, mira te explico un poco mejor ahora que he estado repasando un poco:
buffer recordemos que es un array de bytes, o sea, cada posición, un byte. EL flujo de datos wav que se va a almacenar en buffer va así, sabiendo que una muestra de un canal ocupa 2bytes: Cita:
Cita:
Cita:
|
¡Hola!
Cita:
te devolverá un entero de valor decimal 28 (en binario, 00011100). 00010100 (20) Or 00001100 (12) ------------------ 00011100 (28) <-- (se integró el bit de valor 8 al los bits de 20) Or toma todos los bits activos (los que están en 1) de ambos operandos. And toma todos los bits que estén activos en ambos operandos. XOr toma todos los bits que estén activos en alguno de los operandos pero inactivos en el otro. Espero te sirva de algo esta modesta explicación. Un saludo Or abrazo. Al González. :) |
Perfecto
Hola Al, sólo tengo que decirte que tu explicación encaja como un guante, ahora entiendo cómo trabaja el bloque completo. Hacía tiempo que no usaba or para sumar bits, estaba obcecado pensando en "el otro or", o sea, o cojo la expresión evaluada a la izquierda o la de la derecha (es que hoy estoy espeso).
Bueno, pues dejo la explicación final y resumida:para una muestra de un canal tenemos 2bytes, al más significativo lo corro 8 bits a la izquierda con shl 8, y a continuación se le suma con el operador or el byte menos significatico, cuyo resultado va a una posición del array pcm. Para una muestra completa de una posición de pcm resultaría del siguiente ejemplo: byte1 + byte2 = muestra completa canal L byte1 = 11000001; byte2 = 01010001 Tomando que el byte1 debe ser el más significativo, debe ser el que desplacemos 8 bits a la izquierda: muestra1 equivalente = 1100000100000000 (habrá que guardarlo en un entero) Ahora hago la suma de ambas muestras (guardadas en variables tipo entero): 1100000100000000 0000000001010001 + -------------------- 1100000101010001 --> será una muestra del array pcm, de tipo entero ¡ Todo encaja ! Gracias a los dos :p |
La franja horaria es GMT +2. Ahora son las 04:16:44. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi