Pregunta

Me pregunto si algo como esto es posible (y relativamente fácil de hacer), y si es así, ¿cómo podría hacerlo?

Me gustaría hacer un filtrado de banda en un archivo wave que estoy reproduciendo. Algo similar al ecualizador " que ves en la mayoría de las aplicaciones tipo Winamp.
Sin embargo, mi idea es no igualar el sonido, sino usar valores de dB negativos muy altos, casi matar la banda que estoy filtrando.

La primera pregunta es: ¿DirectSound me da algo que me permita hacer esto?
Si no es así: ¿cómo implementaría esto?
Sé (aunque no lo entiendo completamente) que puede convertir de la forma de onda muestreada a la distribución de frecuencias usando una Transformada rápida de Fourier. Ahora, obviamente no puedo volver de esa distribución a la forma de onda original después de cambiar los valores de amplitud de ciertas frecuencias :-)

¿Cómo podría hacer algo como esto?

Además, ¿con qué precisión puedo hacer estos filtros? (Si quisiera filtrar todo de 2250Hz a 2275Hz, ¿cuál sería el error que tendría un filtro? ¿Cuál sería la precisión máxima de la que puedo depender?)

¡Gracias!

¿Fue útil?

Solución

No sé si DirectSound ofrece esta funcionalidad, supongo que no, ya que DSP es bastante complicado y a menudo varía mucho de una situación a otra. Lo que quieres hacer normalmente se llama '' filtrado '' en DSP (procesamiento de señal digital). Muchas veces esto implica el uso de un filtro FIR (respuesta de impulso finito). Hay muchas bibliotecas para hacer exactamente lo que quieres. Uno de los aspectos más difíciles del diseño del filtro es que siempre hay compensaciones entre velocidad, precisión y error. En su ejemplo, podrá eliminar la señal entre frecuencias, pero esto también afectará las frecuencias circundantes. La cantidad que afectará está relacionada con el tiempo de procesamiento y el diseño del filtro.

Quizás comience aquí (matemáticas pesadas): Filtro FIR

Luego busque en Google su propia información relacionada con FIR específica de Windows / DirectSound

Otros consejos

DirectSound no realiza el filtrado de bandas como usted describe aquí, que yo sepa.

La idea general detrás del filtrado de paso de banda es usar líneas de retardo, que toman la salida de señal y la retroalimentan al flujo de entrada, con un tiempo de retardo y un factor de disminución (o atenuación) especificados. El diseño cuidadoso del filtro le permitirá amplificar o atenuar rangos de frecuencia específicos en su fuente de audio. Tenga en cuenta que esta técnica no utiliza FFT, excepto como una herramienta de diagnóstico al probar los efectos de filtro. Las técnicas FFT hacen un trabajo más preciso de limitar o amplificar frecuencias, pero las líneas de retardo son generalmente más rápidas (y mucho más fáciles de codificar).

Para procesar un archivo WAV (en lugar de hacer una síntesis / filtrado en tiempo real), ejecutar una línea de retraso en el búfer de audio es tan simple como:

for (int i = 0; i < samples.Length - delay; i++)
{
    samples[i + delay] += samples[i] * decay;
}

Es un poco más complicado que esto en la práctica (tiene que lidiar con valores de desbordamiento potenciales, por ejemplo, y algunos tipos de líneas de retardo deben ejecutarse en reversa, lo que siempre es una molestia en la codificación de estilo C), por supuesto.

En cuanto a la precisión del filtro, eso solo depende de qué tan bien esté diseñado (es muy difícil). Cuando diseña un filtro utilizando líneas de retardo, básicamente está haciendo lo mismo que los ingenieros eléctricos hicieron (y siguen haciendo) en las décadas anteriores a los microprocesadores baratos.

DirectSound no ofrece instalaciones de procesamiento de señal en absoluto. Hay una variedad de técnicas que puedes usar para hacer lo que quieras. Es posible utilizar la FFT para hacer lo que quiera, pero probablemente no sea el mejor ni el método más fácil. Debería leer en DSP de audio, particularmente el filtrado digital (IIR, FIR). Hay un buen libro de DSP disponible en línea gratuito llamado La guía del científico e ingeniero para el procesamiento de señales digitales que definitivamente vale la pena una mirada. También hay muchos otros buenos libros DSP disponibles en Amazon, etc.

No conozco ninguna biblioteca que se ocupe de este tipo de cosas directamente.

Puede lograr lo que desea con las transformadas de Fourier, implementaciones como FFTW hacen el trabajo de cálculo para usted, pero en mi experiencia, es bastante desagradable para trabajar, y utiliza cantidades prodigiosas de memoria, especialmente si desea procesar bits más largos de audio de un solo golpe.

La idea básica para aplicar eq usando FFT es esta:

  1. Obtenga su audio. El audio es solo un conjunto muy largo de valores (muestras) que es el desplazamiento del cono del altavoz / a lo largo del tiempo.
  2. Tome la Transformada de Fourier del audio (la biblioteca lo hará, pero tendrá que derivar las muestras de audio al formato correcto. Esto convierte las muestras basadas en el tiempo en una representación basada en la frecuencia, esencialmente esto convierte la señal a muestra la distribución de frecuencias en la señal.
  3. Divida la distribución de frecuencia: divida la distribución en regiones, cada región tendrá un rango de frecuencias.
  4. Luego puede realizar ajustes en las bandas de frecuencia; por ejemplo, puede poner a cero una región para eliminar todo rastro de ella.
  5. Tome la Transformada inversa de Fourier de la distribución de frecuencia actualizada. Esto devolverá la representación al dominio del tiempo, reconstruyendo una (aproximación) de la señal original, pero con los ajustes que haya realizado.

Hacer algo como esto le permitirá manipular con precisión las frecuencias presentes en su audio, dándole el tipo de control que parece desear. Sin embargo, tenga en cuenta que no es sencillo implementarlo.

Recomiendo leer sobre el tema. La detección de latidos está bastante relacionada con mucho de esto (utiliza mucho las técnicas básicas): pruebe las primeras secciones aquí como comienzo.

Espero que ayude un poco.

DirectSound podría no admitir esto directamente, pero DirectShow debería. ¿Podrías usar esa API en su lugar?

Secundo la idea del filtro FIR. Para obtener una muesca estrecha, necesitará un núcleo de filtro largo.

Básicamente, utiliza la convolución de la secuencia de entrada contra un conjunto de valores (el núcleo). Cada muestra de salida es una suma de las N muestras anteriores multiplicadas con su entrada correspondiente en el núcleo del filtro.

Por lo tanto, debe mantener una matriz de kernel y un FIFO o búfer circular del mismo número de muestras.

Son calculadoras de kernel de filtro FIR en la web, solo google "calculadora de filtro FIR".

Debería poder hacer una FFT, perder el tiempo en el dominio de la frecuencia (escala de intervalos de frecuencia) y luego hacer una IFFT para recuperar la señal del dominio del tiempo. De lo contrario, diseñar filtros con ScopeFIR o MATLAB es bastante fácil. ScopeFIR puede diseñar fácilmente un filtro de parada de banda y darle los coeficientes para que pueda hacer una convolución en la señal. Aquí hay un tutorial del sitio web de ScopeFIR: http://www.iowegian.com/fir/ tutor / firintro.htm

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top