Estimados,
Copio esto a todos porque vi que afecta a más de uno, y es bastante difícil de entender qué es lo que pasa.
A algunos de Uds. les está pasando que el filtro_norm les da valores bastante distintos a los de la referencia, sobre todo cuando el valor absolutio de la señal es grande.
El
tema es: esencialmente, están las dos cosas bien! El problema es en cómo
definimos la LUT, y sobre todo, el error que cometimos al usar la
función de soft clipping tal cual la definimos, porque no llega al valor
que supuestamente recorta. PAso a explicar:
- Si uno implementa
el soft_clipping con la LUT, dado como definimos la LUT (que va de -M-1 a
M+1-delta), todos los valores de la entrada que estén por debajo de
-M-1 van a dar una salida igual a T[0], es decir, M*tanh((-M+1)/M) ~
-24955. De la misma manera, todos los valores de la entrada por encima
de M+1-delta van a producir una salida igual a T[TAM_LUT-1] ~ 24955. Así
está hecha la solución de referencia.
- El tema es que si uno NO
implementa el soft clipping con la LUT (cosa que puede pasar y está
bien, porque era opcional), entonces los valores por fuera del rango van
a ser calculados directamente como M*tanh(x/M) que puede dar MENOR que
-24955 o mayor que 24955.
Por ejemplo, para x = 40000, da algo así como 27520.
Clarament
esto es una mejor aproximación a la función de soft clipping según la
letra; la justificación deusar una LUT es que es mucho más rápida que
evaluar tanh.
En todo caso, ninguna de las dos soluciones están
mal, pero dan bastante distintas para esos valores que mencionan varios
de ustedes!
Lo que podemos hacer es entonces generar una salida alternativa al filtro_norm para el caso de no usar la LUT.
En el sistema de verificación van a estar LAS DOS alternativas, y su código sólo va a dar igual a una de ellas.
Espero que se haya entendido.
Saludos,
Ignacio.
PD: Vamos a corregir la letra para la segunda etapa para tratar de unificar
estas dos cosas, y que el clipping recorte donde tiene que recortar.