Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

stft

Transformada de Fourier de tiempo corto

Descripción

s = stft(x) devuelve la Transformada de Fourier de tiempo corto (STFT) de x.

ejemplo

s = stft(x,fs) devuelve la STFT de x utilizando la tasa de muestreo fs.

ejemplo

s = stft(x,ts) devuelve la STFT de x utilizando el tiempo de muestreo ts.

ejemplo

s = stft(___,Name=Value) especifica opciones adicionales con argumentos de par nombre-valor. Las opciones incluyen la ventana y la longitud de la FFT. Estos argumentos se pueden añadir a cualquiera de las sintaxis de entrada anteriores.

ejemplo

[s,f] = stft(___) devuelve las frecuencias f en las que se evalúa la STFT.

ejemplo

[s,f,t] = stft(___) devuelve los tiempos en los que se evalúa la STFT.

ejemplo

stft(___) sin argumentos de salida representa la magnitud al cuadrado de la STFT en decibelios en la ventana de la figura actual.

ejemplo

Ejemplos

contraer todo

Genere un chirp con frecuencia que varíe sinusoidalmente. La señal se muestrea a 10 kHz durante dos segundos.

fs = 10e3;
t = 0:1/fs:2;
x = vco(sin(2*pi*t),[0.1 0.4]*fs,fs);

Calcule la transformada de Fourier de tiempo corto del chirp. Divida la señal en segmentos de 256 muestras y aplique a cada uno una ventana de Kaiser con un parámetro de forma β = 5. Especifique 220 muestras de solapamiento entre segmentos contiguos y una longitud de DFT de 512. Genere los valores de frecuencia y tiempo con los que se calcula la STFT.

[s,f,t] = stft(x,fs,Window=kaiser(256,5),OverlapLength=220,FFTLength=512);

La magnitud al cuadrado de la STFT también se conoce como espectrograma. Represente el espectrograma en decibelios. Especifique un mapa de colores que abarque 60 dB y cuyo último color corresponda al valor máximo del espectrograma.

sdb = mag2db(abs(s));
mesh(t,f/1000,sdb);

cc = max(sdb(:))+[-60 0];
ax = gca;
ax.CLim = cc;
view(2)
colorbar

Obtenga la misma gráfica llamando a la función stft sin argumentos de salida.

stft(x,fs,Window=kaiser(256,5),OverlapLength=220,FFTLength=512)

Genere un chirp cuadrático muestreado a 1 kHz durante 2 segundos. La frecuencia instantánea es 100 Hz en t=0 y cruza 200 Hz en t=1 segundo.

ts = 0:1/1e3:2;

f0 = 100;
f1 = 200;

x = chirp(ts,f0,1,f1,"quadratic",[],"concave");

Calcule y muestre la STFT del chirp cuadrático con una duración de 1 ms.

d = seconds(1e-3);
win = hamming(100,"periodic");

stft(x,d,Window=win,OverlapLength=98,FFTLength=128);

Genere una señal compuesta por un chirp muestreado a 1,4 kHz durante 2 segundos. La frecuencia del chirp disminuye linealmente de 600 Hz a 100 Hz durante el tiempo de medición.

fs = 1400;
x = chirp(0:1/fs:2,600,2,100);

Valores predeterminados de stft

Calcule la STFT de la señal con las funciones spectrogram y stft. Utilice los valores predeterminados de la función stft:

  • Divida la señal en segmentos de 128 muestras y aplique una ventana periódica de Hann a cada segmento.

  • Especifique 96 muestras de solapamiento entre segmentos contiguos. Esta longitud equivale al 75% de la longitud de la ventana.

  • Especifique 128 puntos de la DFT y centre la STFT en la frecuencia cero, con la frecuencia expresada en hercios.

Compruebe que los dos resultados son iguales.

M = 128;
g = hann(M,"periodic");
L = 0.75*M;
Ndft = 128;

[sp,fp,tp] = spectrogram(x,g,L,Ndft,fs,"centered");

[s,f,t] = stft(x,fs);

dff = max(max(abs(sp-s)))
dff = 0

Represente las dos salidas con la función mesh.

nexttile
mesh(tp,fp,abs(sp).^2)
title("spectrogram")
view(2), axis tight

nexttile
mesh(t,f,abs(s).^2)
title("stft")
view(2), axis tight

Valores predeterminados de spectrogram

Repita el cálculo utilizando los valores predeterminados de la función spectrogram:

  • Divida la señal en segmentos de longitud M=Nx/4.5, donde Nx es la longitud de la señal. Aplique una ventana de Hamming a cada segmento.

  • Especifique el 50% de solapamiento entre segmentos.

  • Para calcular la FFT, utilice max(256,2log2M) puntos. Calcule el espectrograma solo para las frecuencias normalizadas positivas.

M = floor(length(x)/4.5);
g = hamming(M);
L = floor(M/2);
Ndft = max(256,2^nextpow2(M));

[sx,fx,tx] = spectrogram(x);

[st,ft,tt] = stft(x,Window=g,OverlapLength=L, ...
    FFTLength=Ndft,FrequencyRange="onesided");

dff = max(max(sx-st))
dff = 0

Represente las dos salidas con la función waterplot. Divida el eje de la frecuencia por π en ambos casos. Para la salida de stft, divida los números de muestra por la tasa de muestreo efectiva, 2π.

figure
nexttile
waterplot(sx,fx/pi,tx)
title("spectrogram")

nexttile
waterplot(st,ft/pi,tt/(2*pi))
title("stft")

function waterplot(s,f,t)
% Waterfall plot of spectrogram
    waterfall(f,t,abs(s)'.^2)
    set(gca,XDir="reverse",View=[30 50])
    xlabel("Frequency/\pi")
    ylabel("Samples")
end

Genere una señal muestreada a 5 kHz durante 4 segundos. La señal consiste en un conjunto de pulsos de duración decreciente separados por regiones de amplitud oscilante y frecuencia fluctuante con tendencia al aumento. Represente la señal.

fs = 5000;
t = 0:1/fs:4-1/fs;

x = besselj(0,600*(sin(2*pi*(t+1).^3/30).^5));

plot(t,x)

Calcule la transformada de Fourier de tiempo corto unilateral, bilateral y centrada de la señal. En todos los casos, aplique una ventana de Kaiser de 202 muestras con factor de forma β=10 a los segmentos de la señal. Muestre el intervalo de frecuencias utilizado para calcular cada transformada.

rngs = ["onesided" "twosided" "centered"];

for kj = 1:length(rngs)
    
    opts = {'Window',kaiser(202,10),'FrequencyRange',rngs(kj)};

    [~,f] = stft(x,fs,opts{:});
    subplot(length(rngs),1,kj)
    stft(x,fs,opts{:})
    title(sprintf('''%s'': [%5.3f, %5.3f] kHz',rngs(kj),[f(1) f(end)]/1000))

end

Repita el cálculo, pero ahora cambie la longitud de la ventana de Kaiser a 203, un número impar. El intervalo de frecuencia 'twosided' no cambia. Los otros dos intervalos de frecuencia se abren en el extremo superior.

for kj = 1:length(rngs)
    
    opts = {'Window',kaiser(203,10),'FrequencyRange',rngs(kj)};

    [~,f] = stft(x,fs,opts{:});
    subplot(length(rngs),1,kj)
    stft(x,fs,opts{:})
    title(sprintf('''%s'': [%5.3f, %5.3f] kHz',rngs(kj),[f(1) f(end)]/1000))

end

Genere una señal de tres canales compuesta por tres chirps diferentes muestreados a 1 kHz durante un segundo.

  1. El primer canal consiste en un chirp cuadrático cóncavo con frecuencia instantánea de 100 Hz en t = 0 y cruza 300 Hz en t = 1 segundo. Tiene una fase inicial igual a 45 grados.

  2. El segundo canal consiste en un chirp cuadrático convexo con frecuencia instantánea de 100 Hz en t = 0 y cruza 500 Hz en t = 1 segundo.

  3. El tercer canal consiste en un chirp logarítmico con frecuencia instantánea de 300 Hz en t = 0 y cruza 500 Hz en t = 1 segundo.

Calcule la STFT de la señal multicanal utilizando una ventana de Hamming periódica de longitud 128 y una longitud de solapamiento de 50 muestras.

fs = 1e3;
t = 0:1/fs:1-1/fs;

x = [chirp(t,100,1,300,'quadratic',45,'concave');
      chirp(t,100,1,500,'quadratic',[],'convex');
      chirp(t,300,1,500,'logarithmic')]'; 
  
[S,F,T] = stft(x,fs,'Window',hamming(128,'periodic'),'OverlapLength',50);

Visualice la STFT de cada canal como una gráfica de cascada. Controle el comportamiento de los ejes mediante la función de ayuda helperGraphicsOpt.

waterfall(F,T,abs(S(:,:,1))')
helperGraphicsOpt(1)

waterfall(F,T,abs(S(:,:,2))')
helperGraphicsOpt(2)

waterfall(F,T,abs(S(:,:,3))')
helperGraphicsOpt(3)

Esta función de ayuda establece la apariencia y el comportamiento de los ejes actuales.

function helperGraphicsOpt(ChannelId)
ax = gca;
ax.XDir = 'reverse';
ax.ZLim = [0 30];
ax.Title.String = ['Input Channel: ' num2str(ChannelId)];
ax.XLabel.String = 'Frequency (Hz)';
ax.YLabel.String = 'Time (seconds)';
ax.View = [30 45];
end

Argumentos de entrada

contraer todo

Señal de entrada, especificada como un vector, una matriz o un timetable de MATLAB®.

Nota

Si quiere que x y s tengan la misma longitud, el valor de (length(x)-noverlap)/(length(window)-noverlap) debe ser un entero. Utilice Window para especificar la longitud de window y OverlapLength para especificar noverlap.

  • Si la entrada tiene varios canales, especifique x como una matriz en la que cada columna se corresponde con un canal.

  • En la entrada del horario, x debe contener tiempos de fila finitos y uniformemente crecientes. Si en un horario faltan puntos de tiempo o están duplicados, puede solucionarlo con los consejos de Clean Timetable with Missing, Duplicate, or Nonuniform Times.

  • En la entrada de horario multicanal, especifique x como un horario con una sola variable que contenga una matriz o un horario con múltiples variables y con un vector columna cada una. Todas las variables deben tener la misma precisión.

Cada canal de x debe tener una longitud mayor o igual a la longitud de la ventana.

Ejemplo: chirp(0:1/4e3:2,250,1,500,"quadratic") especifica un chirp de un solo canal.

Ejemplo: timetable(rand(5,2),SampleRate=1) especifica una variable aleatoria de dos canales muestreada a 1 Hz durante 4 segundos.

Ejemplo: timetable(rand(5,1),rand(5,1),SampleRate=1) especifica una variable aleatoria de dos canales muestreada a 1 Hz durante 4 segundos.

Tipos de datos: double | single
Soporte de números complejos:

Tasa de muestreo, especificada como un escalar positivo. Este argumento solo se aplica cuando x es un vector o una matriz.

Tipos de datos: double | single

Tiempo de muestreo, especificado como un escalar duration. Este argumento solo se aplica cuando x es un vector o una matriz

Ejemplo: seconds(1) es un escalar duration que representa una diferencia de tiempo de 1 segundo entre muestras de señales consecutivas.

Tipos de datos: duration

Argumentos de par nombre-valor

Especifique pares de argumentos opcionales como Name1=Value1,...,NameN=ValueN, donde Name es el nombre del argumento y Value es el valor correspondiente. Los argumentos de nombre-valor deben aparecer después de otros argumentos. Sin embargo, el orden de los pares no importa.

Ejemplo: Window=hamming(100),OverlapLength=50,FFTLength=128 aplica una ventana de Hamming de 100 muestras a los datos, con 50 muestras de solapamiento entre segmentos contiguos y una FFT de 128 puntos.

En las versiones anteriores a la R2021a, utilice comas para separar cada nombre y valor, y encierre Name entre comillas.

Ejemplo: 'Window',hamming(100),'OverlapLength',50,'FFTLength',128 aplica una ventana de Hamming de 100 muestras a los datos, con 50 muestras de solapamiento entre segmentos contiguos y una FFT de 128 puntos.

Ventana espectral, especificada como un vector. Si no se especifica la ventana o se especifica como vacía, la función utiliza una ventana de Hann de longitud 128. La longitud de Window debe ser mayor o igual a 2.

Para obtener una lista de las ventanas disponibles, consulte Ventanas.

Ejemplo: hann(N+1) y (1-cos(2*pi*(0:N)'/N))/2 especifican ambas una ventana de Hann de longitud N + 1.

Tipos de datos: double | single

Número de muestras solapadas, especificado como entero positivo menor que la longitud de Window. Si se omite OverlapLength o se especifica como vacío, se establece como el mayor entero inferior al 75% de la longitud de la ventana, que es de 96 muestras para la ventana de Hann por defecto.

Tipos de datos: double | single

Número de puntos DFT, especificado como entero positivo. El valor debe ser mayor o igual a la longitud de la ventana. Si la longitud de la señal de entrada es inferior a la longitud de la DFT, los datos se rellenan con ceros.

Tipos de datos: double | single

Intervalo de frecuencia de la STFT, especificado como "centered", "twosided" o "onesided".

  • "centered": Calcula una STFT centrada bilateral. Si FFTLength es par, s se calcula en el intervalo (–π, π] rad/muestra. Si FFTLength es impar, s se calcula en el intervalo (–π, π) rad/muestra. Si se especifica la información de tiempo, los intervalos son respectivamente (–fs, fs/2] ciclos/unidad de tiempo y (–fs, fs/2) ciclos/unidad de tiempo, donde fs es la tasa de muestreo efectiva.

  • "twosided": Calcula una STFT bilateral en el intervalo [0, 2π) rad/muestra. Si se especifica información de tiempo, el intervalo es de [0, fs) ciclos/unidad de tiempo.

  • "onesided": Calcula una STFT unilateral. Si FFTLength es par, s se calcula en el intervalo [0, π] rad/muestra. Si FFTLength es impar, s se calcula en el intervalo [0, π) rad/muestra. Si se especifica la información de tiempo, los intervalos son respectivamente [0, fs/2] ciclos/unidad de tiempo y [0, fs/2) ciclos/unidad de tiempo, donde fs es la tasa de muestreo efectiva. Esta opción es válida solo para señales reales.

    Nota

    Cuando este argumento se establece en "onesided", stft genera los valores en el intervalo positivo de Nyquist y no conserva la potencia total.

Para ver un ejemplo, consulte Intervalos de frecuencia de la STFT.

Tipos de datos: char | string

Dimensión de tiempo de salida, especificada como "acrosscolumns" o "downrows". Establezca este valor como "downrows" si desea la dimensión de tiempo de s en las filas y la dimensión de frecuencia en las columnas. Establezca este valor como "acrosscolumns" si desea la dimensión de tiempo de s en las columnas y la dimensión de frecuencia en las filas. Esta entrada se ignora si se llama a la función sin argumentos de salida.

Argumentos de salida

contraer todo

Transformada de Fourier de tiempo corto, devuelta como matriz o como arreglo 3D. El tiempo aumenta en las columnas de s y la frecuencia se reduce en las filas. La tercera dimensión, si está presente, se corresponde con los canales de entrada.

  • Si la señal x tiene Nx muestras de tiempo, s tiene k columnas, donde k = ⌊(NxL)/(ML)⌋, M es la longitud de Window, L es OverlapLength y los símbolos ⌊⌋ denotan la función de suelo.

  • El número de filas en s es igual al valor especificado en FFTLength.

Tipos de datos: double | single

Frecuencias en las que se evalúa la STFT, devueltas como un vector.

Tipos de datos: double | single

Instantes de tiempo, devueltos como un vector. t contiene los valores de tiempo correspondientes a los centros de los segmentos de datos utilizados para calcular las estimaciones del espectro de potencia en tiempo corto.

  • Si se proporciona una tasa de muestreo fs, el vector contiene valores de tiempo en segundos.

  • Si se proporciona un tiempo de muestreo ts, el vector es un arreglo de duración con el mismo formato de tiempo que la entrada.

  • Si no se proporciona información sobre el tiempo, el vector contiene números de muestra.

Tipos de datos: double | single

Más acerca de

contraer todo

Transformada de Fourier de tiempo corto

La transformada de Fourier de tiempo corto (STFT) se utiliza para analizar cómo cambia el contenido de frecuencia de una señal no estacionaria a lo largo del tiempo. La magnitud al cuadrado de la STFT se conoce como la representación de tiempo-frecuencia del espectrograma de la señal. Para obtener más información sobre el espectrograma y cómo calcularlo mediante las funciones de Signal Processing Toolbox™, consulte Spectrogram Computation with Signal Processing Toolbox.

La STFT de una señal se calcula deslizando una ventana de análisis g(n) de longitud M sobre la señal y calculando la transformada discreta de Fourier (DFT) de cada segmento de los datos con ventana. La ventana salta sobre la señal original en intervalos de R muestras, lo que equivale a L = MR muestras de solapamiento entre segmentos contiguos. La mayoría de las funciones de ventana se estrechan en los bordes para evitar el anillamiento espectral. La DFT de cada segmento con ventana se añade a una matriz de valor complejo que contiene la magnitud y la fase de cada punto en tiempo y frecuencia. La matriz STFT tiene

k=NxLML

 columnas, donde Nx es la longitud de la señal x(n) y los símbolos ⌊⌋ denotan la función de suelo. En las transformadas centradas y bilaterales, el número de filas de la matriz es igual a NDFT, el número de puntos de la DFT, y en las transformadas unilaterales de señales de valor real es un número impar cercano a NDFT/2.

La columna m de la matriz de la STFT X(f)=[X1(f)X2(f)X3(f)Xk(f)] contiene la DFT de los datos con ventana centrados en el tiempo mR:

Xm(f)=n=x(n)g(nmR)ej2πfn.

  • La transformada de Fourier de tiempo corto es invertible. El proceso de inversión solapa y suma los segmentos con ventana para compensar la atenuación de la señal en los bordes de la ventana. Para obtener más información, consulte Inverse Short-Time Fourier Transform.

  • La función istft invierte la STFT de una señal.

  • En una serie de circunstancias concretas es posible lograr la "reconstrucción perfecta" de una señal. Para obtener más información, consulte Perfect Reconstruction.

  • La función stftmag2sig devuelve una estimación de una señal reconstruida a partir de la magnitud de su STFT.

Reconstrucción perfecta

En general, calcular la STFT de una señal de entrada e invertirla no da lugar a una reconstrucción perfecta. Si quiere que la salida de la ISTFT coincida lo máximo posible con la señal de entrada original, la señal y la ventana deben cumplir las siguientes condiciones:

  • Tamaño de la entrada: Si invierte la salida de la stft utilizando la istft y quiere que el resultado tenga la misma longitud que la señal de entrada x, el valor de

    k = NxLML

    debe ser un entero. En la ecuación, Nx es la longitud de la señal, M es la longitud de la ventana y L es la longitud de solapamiento.

  • Conformidad con COLA: Utilice ventanas que cumplan con COLA, suponiendo que no ha modificado la transformada de Fourier de tiempo corto de la señal.

  • Relleno: Si la longitud de la señal de entrada es tal que el valor de k no es un entero, rellene con ceros la señal antes de calcular la transformada de Fourier de tiempo corto. Elimine los ceros extra después de invertir la señal.

Referencias

[1] Mitra, Sanjit K. Digital Signal Processing: A Computer-Based Approach. 2nd Ed. New York: McGraw-Hill, 2001.

[2] Sharpe, Bruce. Invertibility of Overlap-Add Processing. https://gauss256.github.io/blog/cola.html, accessed July 2019.

[3] Smith, Julius Orion. Spectral Audio Signal Processing. https://ccrma.stanford.edu/~jos/sasp/, online book, 2011 edition, accessed Nov 2018.

Capacidades ampliadas

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Historial de versiones

Introducido en R2019a