Pregunta

Estoy tratando de implementar un ecualizador de 8 bandas basada en DFT con el único propósito de aprender. Para probar que mi aplicación funciona DFT di de comer a una señal de audio, lo analizaba y luego resynthesized de nuevo sin modificaciones realizadas en el espectro de frecuencias. Hasta aquí todo bien.

Estoy usando la llamada 'forma estándar de cálculo de la DFT', que es por correlación. Este método calcula las partes real e imaginaria ambos N / 2 + 1 muestras de longitud. Para atenuar una frecuencia Sólo estoy haciendo:

float atnFactor = 0.6;
Re[k] *= atnFactor;
Im[k] *= atnFactor;

donde 'k' es un índice en el rango de 0 a N / 2, pero lo que se obtiene después de resíntesis es una señal distorsionada leve, especialmente a bajas frecuencias.

La frecuencia de muestreo de la señal de entrada es de 44,1 kHz y puesto que sólo quiero una de 8 bandas de ecualizador estoy alimentando las muestras DFT 16 a la vez, así que tengo 8 grupos de frecuencia con los que jugar.

Puede alguien me muestre lo que estoy haciendo mal? He intentado encontrar información sobre este tema en Internet, pero no pude encontrar ninguna.

Gracias de antemano.

¿Fue útil?

Solución

DFT y FFT son esencialmente los mismos a los efectos de esta pregunta.

Para atenuar un contenedor de frecuencia (o "banda") en una matriz de FFT-transformada, es necesario multiplicar tanto los componentes real e imaginaria por el mismo factor, y también se multiplican las componentes real e imaginaria de la correspondiente negativo contenedor de frecuencia. FFT produce un par transformada de matrices donde el primer medio de los valores representan componentes de frecuencia positivo y el segundo medio representa componentes de frecuencia negativas.

Este es un ejemplo de código simplificado para un filtro de paso bajo que explica lo que quiero decir:

// fftsize = size of fft window
int halfFFTsize = fftsize / 2;
float lowpassFreq1 = 1000.0;
float lowpassFreq2 = 2000.0;
for (int i = 0; i < halfFFTsize; i++)
{
    int ineg = fftsize - 1 - i; // index of neg. freq.
    float freq = (float)i * (44100.0F / (float)halfFFTsize);
    if (freq >= lowpassFreq2)
    {
        real[i] = 0;
        imag[i] = 0;
        real[ineg] = 0;
        imag[ineg] = 0;
    }
    else if (freq >= lowpassFreq1)
    {
        float mult = 1.0 - ((freq - lowpassFreq1) / 
            (lowpassFreq2 - lowpassFreq1));
        real[i] *= mult;
        imag[i] *= mult;
        real[ineg] *= mult;
        imag[ineg] *= mult;
    }

}

Actualización: después de leer su edición, yo tendría que decir que su código funciona como se esperaba. Supuse que estaba recibiendo un masivamente re-sintetizado señal distorsionada, no una "señal distorsionada levemente, especialmente a bajas frecuencias".

Creo que la distorsión que están viendo es el resultado del tamaño de la ventana muy pequeña que está utilizando -. Esto sería especialmente el caso si usted no está usando un enfoque de ventana Hanning para reconstruir la señal original

Trate de ejecutar el código con un tamaño más típica ventana (como 1024). Un ecualizador de 8 bandas no suele utilizar una ventana de FFT de 8 bandejas. Típicamente, la configuración de 8 deslizadores se utilizan para calcular una función curvilínea que conecta los 8 puntos en el dominio de la frecuencia, y esta función a continuación, se utilizan para ajustar las amplitudes de basura para un conjunto mucho más grande, más finamente de grano de frecuencias.

Un punto más, también: los intervalos de frecuencia dividen la gama disponible de manera uniforme, por lo que no importa cuán grande es su tamaño de la ventana es, más de la mitad de los contenedores de cubrir las frecuencias que no son audibles para el oído humano. Esta es la razón por la bandas cubierto por un ecualizador son típicamente escala logarítmica (por ejemplo, 100 Hz, 1 kHz y 10Khz para un típico ecualizador de 3 bandas) y por lo tanto no se aplican a un número igual de frecuencia Cestos .

En el caso de una ventana de espaciados uniformemente-8 bin, la atenuación de 5 de los 8 es seguro que no tienen ningún efecto audible distinta de la distorsión de las frecuencias audibles.

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