Recientemente comencé a jugar con la transformación de Fourier (después de pasar unas semanas aprendiendo sobre las matemáticas detrás de ella). Decidí intentar hackear un filtro de paso bajo en el siguiente sonido:
En particular, tomé la transformada de Fourier, puse a cero la mitad más alta de las frecuencias, y luego tomé la transformada inversa de Fourier. Esto es lo que conseguí
¿Por qué hay ese crujido?
fourier-transform
discrete-signals
sound
JeremyKun
fuente
fuente
Respuestas:
Dos posibles problemas:
fuente
Primero, solo una nota, las transformadas de Fourier no son ideales para filtros de paso bajo / alto. Los filtros Butterworth son un buen lugar para comenzar y seguir los filtros Chebyshev / Elípticos si se vuelve más ambicioso.
Parece que estás intentando implementar un filtro ideal. No hay forma de que podamos implementar estos filtros de 'pared de ladrillos' donde cortamos todas las frecuencias por encima / debajo de un valor dado. Todos los filtros bien desarrollados disminuirán de 1 a 0 alrededor de nuestra frecuencia de corte.
Los filtros ideales solo son teóricos posibles y si tuviera una Transformada continua de Fourier su método anterior funcionaría.
Pero estamos haciendo transformaciones discretas de Fourier, por lo que hay más de qué preocuparse. Como no estoy seguro del método de su implementación, supongo que está haciendo ventanas, ya que solo extraer frecuencias es una forma segura de obtener chisporroteo en un DFT con ventana.
Al hacer ventanas en un DFT, uno podría pensar que las amplitudes de frecuencia entre ventanas son relativamente continuas. por ejemplo, si la frecuencia de 400Hz tiene una amplitud de 0.5 en la ventana actual, en la siguiente ventana la amplitud estará cerca de 0.5. Desafortunadamente, esto no es cierto, por lo que si simplemente elimináramos la frecuencia de 400Hz de nuestro DFT, podríamos escuchar ruidos fuertes o grietas entre ventanas.
Un pequeño ejemplo: la frecuencia de corte es de 600 Hz. La ventana 1 reproduce un seno de 800 Hz. La ventana 2 se conecta 'continuamente' con la ventana 1 y reproduce 400 Hz. Luego escucharemos un pop entre la ventana porque la ventana 1 estará en silencio y la ventana 2 se encenderá inmediatamente.
Otra cosa a tener en cuenta es que solo podemos representar una cantidad finita de frecuencias con un DFT. Si tenemos un archivo de audio con una onda sinusoidal de una frecuencia entre dos de nuestras frecuencias discretas en nuestro DFT, en realidad lo representamos con muchas de nuestras frecuencias discretas. Entonces, aunque un archivo de audio de ejemplo puede contener una onda sinusoidal inferior a nuestro límite, si su frecuencia está entre nuestras frecuencias DFT, podríamos cortar parte de él y distorsionarlo con el método anterior, ya que se necesitan frecuencias más altas para representar el audio. archivo.
Espero que ayude
fuente
He combinado un pequeño programa Python para ilustrar algunos de los conceptos: el código es bastante horrible, pero acabo de tomar un código viejo que tenía para problemas similares. Aunque casi no hay comentarios, debería ser bastante fácil de seguir debido a los pequeños módulos. El son dos DFT / IDFT funciones; dos funciones fshiftn / fshiftp para cambiar la frecuencia de la señal i dominio DFT para filtrado; una función dftlpass para realizar el filtrado en el dominio DFT; una función zpblpass para hacer el filtrado mediante el uso de un filtro Butterworth; una función bbdftsig para formar la señal de prueba y realizar el filtrado; y finalmente una pequeña función tramapara trazar las señales. Al final del guión, se establecen los diferentes parámetros y se hacen las diferentes figuras.
En conclusión, es posible utilizar el filtrado directo forzando los coeficientes de Fourier a cero, lo que también se hace a veces en la detección de compresión para reducir el soporte de una señal para forzar la dispersión en una señal. Sin embargo, hay consecuencias de esto como errores aumentados en particular en los bordes de la señal. Además, lo anterior es un mejor caso en el que toda la señal se trata como una secuencia. Si la señal debe dividirse en marcos de tiempo, se complica ya que entonces debemos considerar algunas técnicas de ventanas u otras técnicas para garantizar la continuidad de la señal entre cuadros. Por lo tanto, mi consejo es similar a algunas de las otras publicaciones al recomendar el uso normal de Butterworth / Elliptic / ... o cualquier filtro.
fuente
Poner a cero los contenedores en una FFT en realidad puede aumentar la amplitud de otras frecuencias cercanas pero no centradas en el contenedor de ed cero o sus contenedores adyacentes. Este aumento puede causar recorte.
Además, si está haciendo la FFT usando bloques rellenados sin ceros (y sin superposición añadida) (a diferencia de la canción completa en una gran FFT), cualquier modificación de datos de FFT se ajustará desde la parte posterior hasta la parte frontal del secuencia de dominio de tiempo en cada bloque, agregando así otras discontinuidades extrañas en los lugares equivocados.
fuente
Aquí hay un filtro de paso de banda FFT rápido y sucio, con el código FFT también.
para cada muestra del audio de entrada, llame a mainbandpass con la muestra de entrada y el rango de frecuencias que desea mantener en lowcut y highcut. Si lowcut es mayor que highcut, el resultado será un filtro de rechazo de banda. Hay una convolución circular, pero no habrá emisiones fuera de banda, lo cual es bueno para los módems.
fuente