Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Filtro de interpolación calidad CD

Iniciado por gdl, 04 de Octubre de 2007, 10:38:12 AM

« anterior - próximo »

gdl

Hola a todos.

Últimamente estaba metido en el ajo de reproducir sonidos a distintas frecuencias. Esto se consigue modificando la frecuencia de muestreo del sonido que tienes, pero reproduciéndolo a la que tenías antes. El resultado es que el sonido cambia su frecuencia y su longitud.

He estado leyendo cosas sobre esto antes de ponerme manos a la obra y todo me ha ido bien, pero he llegado a un punto que me da a intuir que no es así.

Para empezar, todo esto es pensando en el upsampling (bajar el tono del sonido) de forma que no hace falta usar mipmapping ni técnicas complicadas.

Para intentar obtener calidad CD (16bits) he de dejar el ruido producido por el aliasing (después del filtrado) por debajo del ruido de cuantización. Es decir a -96dB para 16 bits. He conseguido esto usando un filtro FIR simétrico-par (fase lineal) de 31 muestras. El filtro es una sinc enventanada con Kaiser (creo que de beta 6 o por ahí). Ahora bien, leyendo las especificaciones de las Sound Fonts 2 e incluso de otros samplers, veo que sólo se necesitan de guarda 8 samples. Esto es la mitad de lo que necesita el filtro que he hecho (floor(31/2)=15 muestras). Encima los cachondos de SF2 dicen que hay que hacer downsampling de dos octavas. Pero si no consigo hacer ni lo fácil con 8 samples...

¿Alguna idea, información, etc. que me pueda ayudar? Me he recorrido ya internet un montón de veces y no encuentro nada que me desdiga de lo que he hecho.

ethernet

En algunos libros de la carrera (me da la impresión que estudias teleco) viene el típico caso del upsampling que hacen los reproductores de CD's para evitar tener que poner filtros de un orden muy alto.

También es muy común hacer un downsample en dos fases para que los filtros sean de orden menor, en pocas palabras, reducir primero N samples, filtrar y después reducir el resto de samples y volver a filtrar. El resutlado del procesado de los filtros es menor que si lo haces de una tacada. Si quieres más info de esto te la puedo buscar, ahora mismo no recuerdo bien todo ese tema.

gdl

Si tuvieras alguna bibliografía por ahí te lo agradecería  :D

ethernet

He estado buscando entre los apuntes pero tengo más bien pocas hojas y no tengo bibliografía. De todas formas en cualquier libro de los míticos encuentras temas de diezmado e interpolado.

La idea que te digo es la siguiente: si tienes una señal con un BW de 20khz y tienes una frecuencia de corte del filtro justo ahí y tiene que tener una caida de 90db en 1 khz es mejor hacer un filtrado primero con un filtro con muchas menos restricciones, bajas la frecuencia y ahí ya haces el filtro que corte para tener el aliasing deseado. No es lo mismo tener un filtro abrupto en 20khz que en 5khz.

alberizo

Cita de: "ethernet"La idea que te digo es la siguiente: si tienes una señal con un BW de 20khz y tienes una frecuencia de corte del filtro justo ahí y tiene que tener una caida de 90db en 1 khz es mejor hacer un filtrado primero con un filtro con muchas menos restricciones, bajas la frecuencia y ahí ya haces el filtro que corte para tener el aliasing deseado. No es lo mismo tener un filtro abrupto en 20khz que en 5khz.
:shock:
No se te olvide activar el condensador de fluzo  :twisted:

synchrnzr

CitarAhora bien, leyendo las especificaciones de las Sound Fonts 2 e incluso de otros samplers, veo que sólo se necesitan de guarda 8 samples.

Dado que la intención es funcionar a tiempo real y, por lo menos las SoundFonts, están diseñadas hace ya un tiempo, lo más probable es que utilicen una interpolación mucho más sencilla (splines cúbicas, por ejemplo) y admitan un nivel de ruido por encima de -96dB, por el típico tema del compromiso entre calidad y eficiencia.

Pero bueno, no me voy a meter mucho porque tengo que admitir que no me entero demasiado de la discusión. De hecho con el último comentario de ethernet incluso me ha dado la sensación que hablabais de temas opuestos... :oops:

sync

gdl

@ethernet: Encontré una web donde te explica más o menos lo de la interpolación en dos partes. No parece difícil conceptualmente, aunque lo particulariza a múltiplos enteros (que no se llevan bien con las frecuencias de las notas en temperamento igual). De todas las maneras, mi pregunta era si se podía hacer ese filtro en ocho muestras, cosas que parece que no.

@synchrnzr: Lo que me lleva a pensar que los de SF2 le han metido un buen recorte a la calidad por eso del tiempo real. De todas las maneras, existe software que interpola sin aliasing tanto up como downsampling y con calidad de 24bits. Lo que no sé es si es en tiempo real o no (sólo he visto una comparativa). A ver si algún músico de los del foro me da alguna pista de las calidades de los programas de por ahí. Así me haré una idea de qué es "razonable" y qué no.

@alberizo: Lo primero que hago siempre es conectar el condensador de fluzo y comprobar los pares de simetría super-chiralidad en el fibrado de la k-brana multidimensional cuántica. Así que por ahí no falla.  :lol:

synchrnzr

CitarA ver si algún músico de los del foro me da alguna pista de las calidades de los programas de por ahí.

Lo más probable es que la mayoría de programas comerciales e incluso no comerciales (el ModPlug Tracker, por ejemplo) utilicen filtros FIR con sinc tipo lo que propones, incluso de más de 31 muestras. Pero bueno, jamás descubrirás qué tipo de interpolación utilizan, en cada compañía se lo guardan para sí mismos y de cara al mundo exterior todo es High Quality Interpolation, High Quality Pitch Interpolation, etc...

Aunque estés muy preocupado con el tema de los 8 samples de guarda, piensa que el tamaño mínimo de los buffers en los pogramas de edición profesionales es de 10ms: 441 samples a 44100Hz. 8 samples, 15 samples... es un retardo completamente despreciable, además de ser prácticamente imperceptible. El principal problema que suponía este tipo de filtros antaño, para usarlos en tiempo real era el consumo de CPU, pero hoy en día con las CPUs actuales no es un dato muy preocupante.

Por otro lado, ya he pillado lo que comenta ethernet, de intercalar upsamplings a frecuencias intermedias para que los filtros te salgan de orden menor (joer, debía estar cantidad de espeso el otro día) Pero no le acabo de ver el punto de hacerlo por software. Sí que necesitarás filtros de menor orden, pero también tienes que repetir el filtrado... así a ojo, parece que al final te tenga que salir más o menos el mismo número de operaciones, sólo que sería todo más complejo... No sé, todo es probarlo... A mi me parece un método pensado para abaratar costes de hardware más bien: en vez de un filtro de orden alto que será más complejo y más caro, pongo varios de orden mucho más bajo y me sale más barato.

sync

Mars Attacks

Cita de: "synchrnzr"
Por otro lado, ya he pillado lo que comenta ethernet, de intercalar upsamplings a frecuencias intermedias para que los filtros te salgan de orden menor (joer, debía estar cantidad de espeso el otro día)

Sí, ¿eh? Yo en cuanto conecté los cheurones fotónicos de nivel seis lo vi todo claro en el atomizador holográfico hipertemporal.

synchrnzr

Se nota que la programación de cosas de audio no es el fuerte de estos foros... :P  

Si al final no encuentras lo que buscabas puedes comentar el tema en los foros de HydrogenAudio en el foro Scientific/R&D Discussion. Encontrarás más gente versada en estos temas que aquí... :roll:

sync

gdl

Cita de: "synchrnzr"Aunque estés muy preocupado con el tema de los 8 samples de guarda, piensa que el tamaño mínimo de los buffers en los pogramas de edición profesionales es de 10ms: 441 samples a 44100Hz. 8 samples, 15 samples... es un retardo completamente despreciable, además de ser prácticamente imperceptible. El principal problema que suponía este tipo de filtros antaño, para usarlos en tiempo real era el consumo de CPU, pero hoy en día con las CPUs actuales no es un dato muy preocupante.

Esto cambia mucho la cosa. Con 441 muestras puedo hacer lo que quiera. Vamos, hasta calidad 32bits si la ecuación de Kaiser no falla. Eso sí, no estoy seguro de que sea muy conveniente para hacer cosas en tiempo real sin utilizar algún tipo de truco. Como todo en la vida, habrá que buscar un punto intermedio y de compromiso. :roll:

Edit: No te agobies por lo de la programación de audio en los foros que esto era algo muy muy muy específico. Poco a poco se irá cogiendo nivel.

Mars Attacks

Estaba pensando (para variar) que puedes echarle un vistazo al código fuente de Audacity para ver cómo lo solucionan ellos.
Edito: ups, tiempo real... tonces ya supongo que no te valdrá.

synchrnzr

Audacity utiliza un método como el que gdl sugiere. Es muy fácil comprobarlo:

1. Pon tu proyecto de 44100Hz, genera una señal de 11025Hz.
2. Cambia la frecuencia a 22050Hz y exporta un WAV.
3. Abre el WAV generado en el paso anterior.
4. ¡Sorpresa!

Además de esto, ahí tienes un fallo de ese método de downsampling ;)

Curiosamente, ahora que he estado trabajando mucho en el tema, creo que he descubierto accidentalmente la forma de hacer el downsampling, conservando toda la gama de frecuencias y sin necesidad de filtrado de frecuencias superiores. Pero eso sí, sería para procesado off-line :roll:

sync

gdl

Siento tener que corregirte (sólo un poquito, Sync).

Si ponemos la frecuencia de muestreo a 44100Hz, la frecuencia de Nyquist será la mitad 22050Hz. Hasta ahí todo bien. Sin embargo, el límite máximo de frecuencia efectiva es más bajo porque hay una zona de guarda. En CD el límite máximo es de 20000Hz. De forma que el espectro se divide de la siguiente manera.

De 0 a 20000Hz la información deseada.
De 20000Hz a 24100Hz zona de guarda donde NO debe haber sonido.
De 24100 a 44100Hz espectro especular de la información deseada.

Esto se hace así para que en esa zona de guarda el filtro pueda variar (banda de transición).  Cuando bajamos a 22050Hz el espectro se divide de la siguiente manera.

De 0 a 10000Hz la información deseada.
De 10000Hz a 12050Hz la zona de guarda.
De 12050Hz a 22050Hz espectro especular.

Así pues, las frecuencias que se deberían filtrar estarían entre 10000Hz y 20000Hz, pero como hay que aceptar la zona de guarda (es inevitable), realmente se filtrarán entre 12050Hz y 20000Hz. Por eso tu señal de 11025Hz se colaba (y es aceptable).

Eso sí, de 12050Hz a 20000Hz no hay excusa y he probado el Audacity con una señal de 15000Hz ¡y vaya cacaaaaa! Sale exactamente una sinusoide a 7050Hz que es justamente la imagen (15000-11025=3975 y 11025-3975=7050).

synchrnzr

La zona de guarda se deja precisamente por la imperfección de los filtros (que es lo que comentaba que creo que he encontrado una forma de poder aprovecharla) Pero el experimento era para ver el tipo de filtrado que usa el Audacity, no para hablar del tema de las zonas de guarda :roll:

sync






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.