2011-02-16 17 views
7

Estoy tratando de entender el algoritmo de FFT y hasta ahora creo que entiendo el concepto principal detrás de él. Sin embargo, estoy confundido en cuanto a la diferencia entre 'framesize' y 'window'.Confusión con el algoritmo de FFT

En mi entender, parece que son redundantes entre sí? Por ejemplo, presento como entrada un bloque de muestras con un tamaño de fotograma de 1024. Por lo tanto, tengo el byte [1024] presentado como entrada.

¿Cuál es el propósito de la función de ventana? Desde el principio, pensé que el propósito de la función de ventana es seleccionar el bloque de muestras de los datos originales.

Gracias!

Respuesta

13

¿Cuál es el propósito de la función de ventana?

Es para hacer frente a la llamada "fuga espectral": la FFT asume una serie infinita que repite el marco de muestra dado una y otra vez. Si tiene una onda sinusoidal que es un número integral de ciclos dentro del marco de muestra, entonces todo está bien, y la FFT le da un buen pico estrecho a la frecuencia adecuada. Pero si tiene una onda sinusoidal que no es un número integral de ciclos, existe una discontinuidad entre la última y la primera muestra, y la FFT le proporciona falsos armónicos.

Las funciones de ventana bajan las amplitudes al principio y al final del marco de muestra, para reducir los armónicos causados ​​por esta discontinuidad.

algunos diagramas de un National Instruments webpage on windowing:

# integral de ciclos:

enter image description here

no entero # de ciclos:

enter image description here

para información adicional:

http://www.tmworld.com/article/322450-Windowing_Functions_Improve_FFT_Results_Part_I.php

http://zone.ni.com/reference/en-XX/help/371361B-01/lvanlsconcepts/char_smoothing_windows/

http://www.physik.uni-wuerzburg.de/~praktiku/Anleitung/Fremde/ANO14.pdf

+0

Ahh veo. Entonces, básicamente, las funciones de ventana son solo para 'modificar' o mejorar los datos de las muestras para mejorar los resultados del algoritmo de FFT. ¿Estoy en lo cierto? ¡Gracias! – user488792

+0

@ user488792: sí, eso es más o menos: la función de ventana * suaviza * lo que de otro modo serían transitorios en los bordes de la ventana de muestreo. –

+0

Sí, ya veo. Muchas gracias por la aclaración y por brindar una excelente respuesta. – user488792

2

Si usted no modifica los valores de la muestra, y se selecciona la misma longitud de los datos como la longitud de FFT, esto es equivalente a usar una ventana rectangular, en la cual caso el marco y la ventana son idénticos. Sin embargo, multiplicar sus datos de entrada por una ventana rectangular en el dominio del tiempo es lo mismo que convolucionar el espectro de la señal de entrada con una función Sinc en el dominio de la frecuencia, que extenderá cualquier pico espectral para frecuencias que no son exactamente periódicas en la apertura FFT a través del todo el espectro

Las ventanas no rectangulares a menudo se utilizan, por lo que el espectro de FFT resultante se convoluciona con algo un poco más "enfocado" que una función de Sinc.

También puede usar una ventana rectangular que tiene un tamaño diferente al de la abertura o longitud de FFT. En el caso de una ventana de datos más corta, la trama FFT puede rellenarse en cero, lo que puede dar como resultado un espectro de resultados de FFT interpolado de aspecto más uniforme.Incluso puede usar una ventana rectangular que sea más larga que la longitud de la FFT envolviendo datos alrededor de la apertura FFT de una manera circular sumada para algunos efectos interesantes con la resolución de frecuencia.

AÑADIDO debido a una solicitud:

Multiplicando por una ventana en el dominio del tiempo produce el mismo resultado que la convolución con la transformación de esa ventana en el dominio de la frecuencia.

En general, una ventana de dominio de tiempo más estrecha produce una transformación de dominio de frecuencia más amplia. Esta es la razón por la que el relleno cero produce un gráfico de frecuencia más uniforme. La ventana de dominio de tiempo más estrecha produce un Sinc más ancho con curvas más gruesas y más suaves en relación con el ancho del marco que una ventana del ancho total de la trama FFT, lo que hace que los resultados de frecuencia interpolada parezcan más suaves que una FFT acolchada diferente de cero del mismo longitud del cuadro

Lo contrario también es cierto en cierta medida. Una ventana rectangular más amplia producirá un Sinc más angosto, con los nulos más cerca del pico. Por lo tanto, es posible que pueda utilizar una ventana más amplia cuidadosamente elegida para producir un Sinc de aspecto más estrecho y anular una frecuencia más cercana a un intervalo de interés que un intervalo de frecuencia. ¿Cómo se usa una ventana más amplia? Envuelva los datos alrededor y sume, que es idéntico al uso de vectores de base FT que no están truncados a 1 fotograma FFT de longitud. Sin embargo, dado que al hacer esto, el vector de resultados de FFT es más corto que los datos, se trata de un proceso con pérdidas que introducirá artefactos e introducirá nuevos alias de novelas. Pero le dará un pico de selección de frecuencia más nítida en cada contenedor, y filtros de muesca que pueden colocarse a menos de 1 contenedor de distancia, por ejemplo a mitad de camino entre contenedores, etc.

+0

Esa es una FFT más larga que produce una resolución de frecuencia más alta, no solo relleno cero de la misma longitud FFT que no cambiaría la resolución, pero cambiaría la "suavidad". La duración de la FFT y la cantidad de relleno cero son dos parámetros diferentes, o "perillas", con las que puede jugar de forma independiente. – hotpaw2

6

Una ventana rectangular de longitud M tiene una respuesta de frecuencia de sin(ω*M/2)/sin(ω/2), que es cero cuando ω = 2*π*k/M, para k ≠ 0. Para un DFT de longitud N, donde ω = 2*π*n/N, hay nulos en n = k * N/M. La relación N/M no es necesariamente un número entero. Por ejemplo, si N = 40 y M = 32, entonces hay nulos en múltiplos de 1.25, pero solo los múltiplos enteros aparecerán en el DFT, que son los contenedores 5, 10, 15 y 20 en este caso.

Así es un gráfico de la DFT 1024-punto de una ventana rectangular de 32 puntos:

M = 32 
N = 1024 
w = ones(M) 
W = rfft(w, N) 
K = N/M 
nulls = abs(W[K::K]) 
plot(abs(W)) 
plot(r_[K:N/2+1:K], nulls, 'ro') 
xticks(r_[:512:64]) 
grid(); axis('tight') 

DFT of a 32-point rectangular window

Nota los nulos en cada N/M = 32 bins. Si N = M (es decir, la longitud de la ventana es igual a la longitud DFT), entonces hay valores nulos en todas las ubicaciones excepto en n = 0.

Cuando multiplica una ventana por una señal, la operación correspondiente en el dominio de frecuencia es convolución circular del espectro de la ventana con el espectro de la señal. Por ejemplo, la DTFT de una sinusoide es una función delta ponderada (es decir, un impulso con altura infinita, extensión infinitesimal y área finita) ubicada en la frecuencia positiva y negativa de la sinusoide. La activación de un espectro con una función delta simplemente lo desplaza a la ubicación del delta y lo escala por el peso del delta. Por lo tanto, cuando se multiplica una ventana por una sinusoide en el dominio de muestra, la respuesta de frecuencia de la ventana se escala y se cambia a la frecuencia de la sinusoide.

Hay un par de escenarios para examinar con respecto a la longitud de una ventana rectangular. Primero veamos el caso donde la longitud de la ventana es un múltiplo entero del período de la sinusoide, p.una ventana rectangular 32-muestra de un coseno con un periodo de 32/8 = 4 muestras:

x1 = cos(2*pi*8*r_[:32]/32) # ω0 = 8π/16, bin 8/32 * 1024 = 256 
X1 = rfft(x1 * w, 1024) 
plot(abs(X1)) 
xticks(r_[:513:64]) 
grid(); axis('tight') 

DFT of cosine at w0 = 8π/16 with a 32-point rectangular window

Como antes, hay valores nulos en múltiplos de N/M = 32. Sin embargo, la ventana de el espectro se ha desplazado al bin 256 de la sinusoide y se ha escalado por su magnitud, que está dividido en 0,5 entre la frecuencia positiva y la frecuencia negativa (solo estoy trazando frecuencias positivas). Si la longitud DFT hubiera sido 32, los nulos se alinearían en cada contenedor, lo que provocó la aparición de que no hay fugas. Pero esa apariencia engañosa es solo una función de la longitud DFT. Si rellena la señal de ventana con ceros (como se indicó anteriormente), verá la respuesta similar a sinc en las frecuencias entre los nulos.

Ahora veamos un caso en el que la longitud de la ventana no es un múltiplo entero del período de la sinusoide, p. un coseno con una frecuencia angular de 7.5π/16 (el período es de 64 muestras):

x2 = cos(2*pi*15*r_[:32]/64) # ω0 = 7.5π/16, bin 15/64 * 1024 = 240 
X2 = rfft(x2 * w, 1024) 
plot(abs(X2)) 
xticks(r_[-16:513:64]) 
grid(); axis('tight') 

DFT of cosine at w0 = 7.5π/16 with a 32-point rectangular window

El centro de localización del compartimiento ya no está en un múltiplo entero de 32, pero desplazado en un medio hasta el contenedor 240. Veamos cuál sería el DFT de 32 puntos correspondiente (inferir una ventana rectangular de 32 puntos). Voy a calcular y representar gráficamente la DFT de 32 puntos de x2 [n] y también superponer una copia 32x diezmado del 1024 puntos DFT:

X2_32 = rfft(x2, 32) 
X2_sample = X2[::32] 
stem(r_[:17],abs(X2_32)) 
plot(abs(X2_sample), 'rs') # red squares 
grid(); axis([0,16,0,11]) 

32-point DFT of cosine at w0 = 7.5π/16

como se puede ver en el gráfico anterior , los nulos ya no están alineados en múltiplos de 32, por lo que la magnitud del DFT de 32 puntos no es cero en cada contenedor. En el DFT de 32 puntos, los nulos de la ventana todavía están espaciados cada N/M = 32/32 = 1 bin, pero desde ω0 = 7.5π/16, el centro está en 'bin' 7.5, lo que pone los nulos en 0.5, 1.5 , etc., por lo que no están presentes en el DFT de 32 puntos.

El mensaje general es que la fuga espectral de una señal de ventana es siempre presente pero puede ser enmascarado en la DFT si el specrtum señal, longitud de la ventana, y la longitud de DFT se unen en la forma correcta de alinear los nulos . Más allá de eso, simplemente debe ignorar estos artefactos DFT y concentrarse en la DTFT de su señal (es decir, rellenar con ceros para muestrear la DTFT a mayor resolución para que pueda examinar claramente la fuga).

La fuga espectral causada por la convolución del espectro de una ventana siempre estará allí, por lo que es tan importante el arte de crear ventanas con formas especiales. El espectro de cada tipo de ventana se ha diseñado para una tarea específica, como el rango dinámico o la sensibilidad.

He aquí un ejemplo que compara la salida de una ventana rectangular contra una ventana de Hamming:

from pylab import * 
import wave 

fs = 44100 
M = 4096 
N = 16384 
# load a sample of guitar playing an open string 6 
# with a fundamental frequency of 82.4 Hz 
g = fromstring(wave.open('dist_gtr_6.wav').readframes(-1), 
       dtype='int16') 
L = len(g)/4 
g_t = g[L:L+M] 
g_t = g_t/float64(max(abs(g_t))) 
# compute the response with rectangular vs Hamming window 
g_rect = rfft(g_t, N) 
g_hamm = rfft(g_t * hamming(M), N) 

def make_plot(): 
    fmax = int(82.4 * 4.5/fs * N) # 4 harmonics 
    subplot(211); title('Rectangular Window') 
    plot(abs(g_rect[:fmax])); grid(); axis('tight') 
    subplot(212); title('Hamming Window') 
    plot(abs(g_hamm[:fmax])); grid(); axis('tight') 

if __name__ == "__main__": 
    make_plot() 

rectangular vs hamming window

+0

¿qué programa es ese? (parece python, pero ¿en qué entorno está?) He estado buscando alternativas a MATLAB. –