13 votos

Extracción de frecuencias exactas de la salida FFT

Digamos que paso 512 muestras en mi FFT

Mi micrófono escupe datos a 10KHz, así que esto representa 1/20s.

(Así, la frecuencia más baja que captaría la FFT sería de 40 Hz).

T - bin 0: [0 - 40Hz) - bin 1: [40 - 80Hz) etc

Entonces, si mi sonido original contenía energía a, por ejemplo, 115 Hz, ¿cómo puedo recuperar con precisión esta frecuencia?

Eso va a estar en la casilla nº 2, pero muy cerca de la nº 3. Así que yo esperaría que ambas casillas contuvieran algo distinto de cero.

Pregunta: ¿qué ocurre con los bins situados a ambos lados? ¿Estarían garantizados para ser cero si no hay otras frecuencias cercanas en la señal original?

Pregunta principal: ¿existe algún algoritmo para descifrar la frecuencia original a partir de las intensidades relativas de los contenedores?

6voto

Sabacon Puntos 12051

Recuerde que la FFT es circular. Las entradas que contengan un número entero de ciclos saldrán limpias como un único punto, en la casilla correspondiente. Las que no, actúan como si fueran multiplicadas por un pulso rectangular en el dominio del tiempo, lo que crea la convolución por una función sinc en el dominio de la frecuencia. Como la función sinc tiene un soporte ilimitado, tu suposición de que todos los bins excepto los dos más cercanos serían cero es incorrecta.

Encontrar una solución analítica de forma cerrada puede ser imposible, en cuyo caso lo mejor sería empezar con la frecuencia central de los dos intervalos más fuertes y utilizar la búsqueda binaria para encontrar la frecuencia intermedia que más se aproxime al espectro real.

5voto

gvkv Puntos 168

Por lo general, es necesario aplicar un función de ventana a su señal antes de realizar la FFT, para obtener picos limpios para los componentes de frecuencia (sin "faldas"). (La única excepción es si los componentes de frecuencia ajuste exactamente en la longitud de la FFT de modo que cada uno de ellos llene exactamente un contenedor).

Si se utiliza una función de ventana gaussiana y, a continuación, se ajusta una parábola a los tres puntos más altos de la FFT, se puede obtener un resultado teóricamente exacto de la frecuencia:

Interpolación cuadrática de picos espectrales

3voto

alex Puntos 131

Acabo de darme cuenta de esta vieja pregunta y he pensado en ampliar el comentario de J.M. (es decir, lo que creo que estaba insinuando).

En primer lugar, una pequeña observación sobre los "bins" de los que hablas: Las frecuencias asociadas a los coeficientes deben considerarse como situadas en el centro de su "intervalo", y además estás equivocado por un factor de 2, a menos que me esté perdiendo algo. Así, el primer intervalo sería de 0-10 Hz, el segundo de 10-29 Hz, el tercero de 29-49 Hz, y así sucesivamente. Sin embargo, como otros han señalado, todo lo que no sea una onda seno/coseno con una frecuencia exactamente igual aparecerá en más de un "bin" de todos modos, así que es mejor abandonar la noción de "bin" y pensar sólo en frecuencias.

Esto se debe a que una forma de interpretar la FFT es que descompone la señal en una suma de ondas coseno con determinadas amplitudes (dadas por los valores absolutos de los coeficientes) y desfases temporales (dados por la fase). Por ejemplo, si la entrada es una onda sinusoidal de 39 Hz con una amplitud de 1, el tercer coeficiente tendrá un valor absoluto de 1 (o 512, dependiendo del algoritmo) y una fase de $-\pi/2$ (o $\pi/2$ ). Esto se traduce en una onda coseno desplazada a la derecha en $\pi$ para obtener una onda sinusoidal, y luego se estira adecuadamente en ambas direcciones.

Si desplaza lentamente la ventana FFT hacia la derecha, la fase disminuirá, se envolverá (porque una fase de $2\pi$ es igual a una fase de $0$ ), y volver a $-\pi/2$ después de 1/39s o 256 muestras.

Lo mismo ocurre con las frecuencias que no son múltiplos exactos de 19,5 Hz. Así que puedes determinar cuántas muestras tarda la fase en dar la vuelta, y esto te dará una frecuencia tan exacta como quieras: Para aumentar la precisión, basta con dejar que se envuelva una vez más. Por cierto, no es necesario calcular la fase; basta con comprobar cuándo la parte real o imaginaria (la que prefieras) pasa por cero.

2voto

Rob Cooper Puntos 15945

Puede intentar una FFT con relleno de ceros (añada ceros al final de la señal y luego realice la FFT).

1voto

dertoni Puntos 256

Al final derivé una fórmula que calcula la frecuencia exacta a partir de la velocidad a la que gira cada recipiente.

Mi resultado puede verse aquí: https://stackoverflow.com/questions/4633203/extracting-precise-frequencies-from-fft-bins-using-phase-change-between-frames

Para comprender rotación de la papelera Basta con mirar un solo contenedor. Así que consideremos theta = 2pi/12, por lo que exp(i.n.theta) para n en {0, ..., 11} nos dará nuestras doce raíces 12 de la unidad; si nos fijamos en el plano complejo hará una estrella de 12 puntas.

Ahora bien, si la señal coincide con esa frecuencia, es decir, 12 muestras forman una onda, al proyectar repetidamente esa señal sobre esa estrella ( proj[k] = sig[k]*star[k%12] ) se estirará una espina (la correspondiente a la amplitud positiva máxima de sig[k], el pico de la onda sinusoidal si se quiere) y se aplastará o se estirará negativamente (dependiendo de si la onda sinusoidal está centrada verticalmente, es decir, desplazamiento de CC = 0) la espina diametralmente opuesta.

Si mantiene una suma vectorial continua de las 12 últimas proyecciones, el resultado saldrá en esta dirección, por simetría. Y el ángulo del resultado da la fase del bin, y la longitud da la magnitud del bin.

Y la fase permanece constante. Así que no hay rotación de contenedores.

Pero ahora si cambias la frecuencia de entrada a {13 muestras = una onda}, puedes ver que esta suma vectorial ahora va a rotar 1/12 de ciclo Si un pico corresponde a un ángulo de 0, el siguiente pico ya no se alineará, corresponderá a 1/12 de revolución

Y esta es la rotación de la papelera.

Aunque no espero que el lector deduzca la respuesta a partir de esta base, es de esperar que le proporcione una comprensión intuitiva de lo que está ocurriendo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X