Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

goertzel

Transformación discreta de Fourier con algoritmo Goertzel de segundo orden

Sintaxis

dft_data = goertzel(data)
dft_data = goertzel(data,freq_indices)
dft_data = goertzel(data,freq_indices,dim)

Descripción

dft_data = goertzel(data) devuelve la transformación discreta de Fourier (DFT) de los datos de entrada, utilizando un algoritmo Goertzel de segundo orden.data Si es una matriz, calcula el DFT de cada columna por separado.datagoertzel Puede especificar tipos de datos como precisión doble o única.

dft_data = goertzel(data,freq_indices) devuelve el DFT para los índices de frecuencia .freq_indices Los valores de pueden ser cualquier número entero o fracción.freq_indices

dft_data = goertzel(data,freq_indices,dim) calcula la DFT de la matriz a lo largo de la dimensión.datadim

Ejemplos

contraer todo

Calcule las frecuencias del tono generado pulsando el botón 1 de un teclado telefónico.

El número 1 produce un tono con frecuencias 697 y 1209 Hz. Generar 205 muestras del tono con una frecuencia de muestreo de 8 kHz.

Fs = 8000; N = 205; lo = sin(2*pi*697*(0:N-1)/Fs); hi = sin(2*pi*1209*(0:N-1)/Fs); data = lo + hi;

Utilice el algoritmo Goertzel para calcular el DFT del tono. Elija los índices correspondientes a las frecuencias utilizadas para generar los números del 0 al 9.

f = [697 770 852 941 1209 1336 1477]; freq_indices = round(f/Fs*N) + 1;    dft_data = goertzel(data,freq_indices);

Trazar la magnitud DFT.

stem(f,abs(dft_data))  ax = gca; ax.XTick = f; xlabel('Frequency (Hz)') title('DFT Magnitude')

Genere un coseno ruidoso con componentes de frecuencia a 1,24 kHz, 1,26 kHz y 10 kHz. Especifique una frecuencia de muestreo de 32 kHz. Restablezca el generador de números aleatorios para obtener resultados reproducibles.

rng default  Fs = 32e3; t = 0:1/Fs:2.96; x = cos(2*pi*t*10e3) + cos(2*pi*t*1.24e3) + cos(2*pi*t*1.26e3) ...     + randn(size(t));

Genere el vector de frecuencia. Utilice el algoritmo Goertzel para calcular el DFT. Restringir el rango de frecuencias a entre 1,2 y 1,3 kHz.

N = (length(x)+1)/2; f = (Fs/2)/N*(0:N-1); indxs = find(f>1.2e3 & f<1.3e3); X = goertzel(x,indxs);

Trazar el espectro cuadrado medio expresado en decibelios.

plot(f(indxs)/1e3,mag2db(abs(X)/length(X)))  title('Mean Squared Spectrum') xlabel('Frequency (kHz)') ylabel('Power (dB)') grid

Algoritmos

El algoritmo Goertzel implementa el DFT como una ecuación de diferencia recursiva. Para establecer esta ecuación de diferencia, exprese el DFT como la convolución de una entrada de punto, ( ), con la respuesta de impulsoNxnhk(n)=WNknu(n)Dónde WNkn=ej2πkn/N y ( ) es la secuencia de pasos de la unidad.un

La transformación Z de la respuesta de impulso es

Hk(z)=1WNkz112cos(2πk/N)z1+z2.

La implementación directa de la forma II es:

Alternativas

También puede calcular el DFT con:

  • : menos eficiente que el algoritmo Goertzel cuando solo se necesita el DFT en unas pocas frecuencias.fft

  • , el chirp Z-transform. calcula la transformación Z de una entrada en un contorno circular o espiral e incluye el DFT como caso especial.cztczt

Referencias

[1] Proakis, John G., and Dimitris G. Manolakis. Digital Signal Processing: Principles, Algorithms, and Applications. 3rd Edition. Upper Saddle River, NJ: Prentice Hall, 1996, pp. 480–481.

[2] Burrus, C. Sidney, and Thomas W. Parks. DFT/FFT and Convolution Algorithms: Theory and Implementation. New York: John Wiley & Sons, 1985.

Capacidades ampliadas

Introducido antes de R2006a