stft
Transformada de Fourier de tiempo corto
Sintaxis
Descripción
devuelve la Transformada de Fourier de tiempo corto (STFT) de s
= stft(x
)x
.
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.s
= stft(___,Name=Value
)
stft(___)
sin argumentos de salida representa la magnitud al cuadrado de la STFT en decibelios en la ventana de la figura actual.
Ejemplos
Transformada de Fourier de tiempo corto
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)
STFT del chirp cuadrático
Genere un chirp cuadrático muestreado a 1 kHz durante 2 segundos. La frecuencia instantánea es 100 Hz en y cruza 200 Hz en 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);
Comparar las funciones spectrogram
y stft
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 , donde 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 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, .
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
Intervalos de frecuencia de la STFT
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 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
STFT de señales multicanal
Genere una señal de tres canales compuesta por tres chirps diferentes muestreados a 1 kHz durante un segundo.
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.
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.
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
x
— Señal de entrada
vector | matriz | horario
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(
debe ser un entero. Utilice x
)-noverlap)/(length(window)-noverlap)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: Sí
fs
— Tasa de muestreo
2π
(predeterminado) | escalar positivo
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
ts
— Tiempo de muestreo
escalar de duración
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.
Window
— Ventana espectral
hann(128,"periodic")
(predeterminado) | vector
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
OverlapLength
— Número de muestras solapadas
75%
de la longitud de la ventana (predeterminado) | Entero no negativo
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
FFTLength
— Número de puntos DFT
128
(predeterminado) | entero positivo
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
FrequencyRange
— Intervalo de frecuencia de la STFT
"centered"
(predeterminado) | "twosided"
| "onesided"
Intervalo de frecuencia de la STFT, especificado como "centered"
, "twosided"
o "onesided"
.
"centered"
: Calcula una STFT centrada bilateral. SiFFTLength
es par,s
se calcula en el intervalo (–π, π] rad/muestra. SiFFTLength
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. SiFFTLength
es par,s
se calcula en el intervalo [0, π] rad/muestra. SiFFTLength
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
OutputTimeDimension
— Dimensión de tiempo de salida
"acrosscolumns"
(predeterminado) | "downrows"
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
s
— Transformada de Fourier de tiempo corto
matriz | Arreglo 3D
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 = ⌊(Nx–L)/(M–L)⌋, M es la longitud deWindow
, L esOverlapLength
y los símbolos ⌊⌋ denotan la función de suelo.El número de filas en
s
es igual al valor especificado enFFTLength
.
Tipos de datos: double
| single
f
— Frecuencias
vector
Frecuencias en las que se evalúa la STFT, devueltas como un vector.
Tipos de datos: double
| single
t
— Instantes de tiempo
vector
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
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 = M – R 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
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 contiene la DFT de los datos con ventana centrados en el tiempo mR:
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 laistft
y quiere que el resultado tenga la misma longitud que la señal de entradax
, el valor dedebe 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
Arreglos altos
Realice cálculos con arreglos que tienen más filas de las que caben en la memoria.
Notas y limitaciones de uso:
OutputTimeDimension
debe especificarse siempre y establecerse en "downrows"
.
Para obtener más información, consulte Arreglos altos.
Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.
Generación de código de GPU
Genere código CUDA® para GPU NVIDIA® mediante GPU Coder™.
Notas y limitaciones de uso:
Los horarios no son compatibles con la generación de código.
Entorno basado en subprocesos
Ejecute código en segundo plano con MATLAB® backgroundPool
o acelere código con Parallel Computing Toolbox™ ThreadPool
.
Notas y limitaciones de uso:
La sintaxis sin argumentos de salida no es compatible.
Para obtener más información, consulte Ejecutar funciones de MATLAB en un entorno basado en subprocesos.
Arreglos GPU
Acelere código mediante la ejecución en una unidad de procesamiento gráfico (GPU) mediante Parallel Computing Toolbox™.
Esta función es totalmente compatible con los arreglos de GPU. Para obtener más información, consulte Run MATLAB Functions on a GPU (Parallel Computing Toolbox).
Historial de versiones
Introducido en R2019a
Comando de MATLAB
Ha hecho clic en un enlace que corresponde a este comando de MATLAB:
Ejecute el comando introduciéndolo en la ventana de comandos de MATLAB. Los navegadores web no admiten comandos de MATLAB.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)