Herramienta de ejemplo y código fuente
La herramienta de transformación de IR incluida para ayudarle a transformar sus respuestas al impulso del dominio del tiempo al dominio de la frecuencia se ha actualizado para incluir compatibilidad con el mecanismo de reducción. La herramienta se puede configurar para generar esta tabla pasando un parámetro de línea de comandos para especificar la calidad (entre 0.0 y 99.9, donde 0.0 significa que se conservará el 99,9 % de la energía de la respuesta al impulso, y 99.9 significa que se conservará el 99,99 % de la potencia). Con esto habilitado, XDSP no procesará las muestras de potencia extremadamente baja de la respuesta al impulso (valores de cero o casi cero) para mejorar la velocidad de procesamiento. El código para establecer y escribir la tabla de reducción está en una clase llamada ImpulseResponseReduction en el archivo main.cpp, y la función que escribe la tabla de reducción es ImpulseResponseReduction::SetReductionBlock. Esto se puede personalizar para adaptarse a sus necesidades, siempre que el formato de la tabla de reducción sea el que se especifica a continuación, lo que le permite indicar cuántas muestras desea procesar para cada bloque de la respuesta al impulso.Formato de la tabla de reducción
El mecanismo de reducción de la respuesta al impulso funciona sobre la base de un bloque de reducción agregado al final del búfer de la respuesta al impulso en el dominio de la frecuencia. El bloque de reducción tiene el tamaño de un bloque de respuesta al impulso y comienza con una firma de 4 bytes igual a 0xFFFFACE1, seguida de hasta 15 entradas de estructuras de 4 bytes. El resto del bloque debe rellenarse con ceros. La estructura de 4 bytes contiene dos valores sin signo de 16 bits: la frecuencia de corte y el índice de bloque. A continuación se muestra un ejemplo:
Cuando XDSP procesa un bloque de reducción de este tipo, ocurre lo siguiente:
- El hardware procesará el bloque de respuesta al impulso completo hasta el bloque 8 (es decir, los primeros 8 bloques, ya que los bloques se indexan desde 0).
- Desde el bloque 8 hasta el bloque 86, el hardware solo procesará las primeras 384 muestras de cada bloque, descartando el resto de las muestras, ya que se considera que tienen muy poco impacto en la salida.
- Desde el bloque 86 hasta el bloque 102, el hardware solo procesará las primeras 128 muestras de cada bloque, descartando el resto de las muestras.
- Desde el bloque 102 hasta el bloque 159, el hardware solo procesará las primeras 16 muestras de cada bloque, descartando el resto de las muestras. Como la respuesta al impulso de este ejemplo solo tiene 158 bloques, esto representa la última entrada válida de la tabla.
- El hardware solo considera válida la siguiente entrada si tiene un índice de bloque mayor que la entrada actual; por lo tanto, el resto de la tabla se rellena con la última entrada válida para indicar que no son válidas y que deben ignorarse.
Notas
Hay varios aspectos que se deben tener en cuenta al implementar un algoritmo personalizado para generar una tabla de reducción de impulso válida:- El índice de bloque debe tener un valor de al menos 8; en otras palabras, los primeros 8 bloques de la respuesta al impulso nunca deben reducirse.
- La frecuencia de corte debe ser un múltiplo de 16 y debe ser de al menos 16.
- La frecuencia de corte no debe superar el tamaño del bloque; esto sería una entrada no válida.
- El bloque de reducción de la respuesta al impulso debe tener el tamaño de un bloque completo de respuesta al impulso. Se espera que el espacio posterior a la tabla se rellene con ceros.
- Al usar una respuesta al impulso estéreo con el mecanismo de reducción, se espera un bloque de reducción al final de cada canal.
- Recuerde tener en cuenta el espacio adicional del bloque de reducción de la respuesta al impulso al especificar el parámetro impulseResponseLengthInFloats en XDspActivationParameters.
