Main Content

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.

istft

Transformación inversa de corta distancia de Fourier

Descripción

x = istft(s) devuelve la transformación inversa de Fourier (ISTFT) de .s

ejemplo

x = istft(s,fs) devuelve el ISTFT de utilizar la frecuencia de muestreo.sfs

x = istft(s,ts) devuelve el ISTFT utilizando el tiempo de muestra.ts

ejemplo

x = istft(___,Name,Value) especifica opciones adicionales mediante argumentos de par nombre-valor. Las opciones incluyen la longitud de la ventana FFT y el número de muestras superpuestas. Estos argumentos se pueden agregar a cualquiera de las sintaxis de entrada anteriores.

ejemplo

[x,t] = istft(___) devuelve los tiempos de señal en los que se evalúa el ISTFT.

Ejemplos

contraer todo

Genere una señal de tres canales que consta de tres chirridos diferentes muestreados en 1 khZ durante 1 segundo.

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

  2. El segundo canal consiste en un chirrido cuadrático convexo con frecuencia instantánea 200Hz a 0 y cruza 600 Hz a 1 segundo.t = t =

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

Calcular el STFT de la señal multicanal utilizando una ventana hamming periódica de longitud 256 y una longitud de superposición de 15 muestras.

fs = 1e3; t = 0:1/fs:1-1/fs; x = [chirp(t,100,1,300,'quadratic',45,'concave');       chirp(t,200,1,600,'quadratic',[],'convex');       chirp(t,300,1,500,'logarithmic')]';     [S,F,T] = stft(x,fs,'Window',hamming(256,'periodic'),'OverlapLength',15);

Trazar las versiones originales y reconstruidas del primer y segundo canal.

[ix,ti] = istft(S,fs,'Window',hamming(256,'periodic'),'OverlapLength',15);  plot(t,x(:,1)','LineWidth',1.5) hold on plot(ti,ix(:,1)','r--') hold off legend('Original Channel 1','Reconstructed Channel 1')

 plot(t,x(:,2)','LineWidth',1.5) hold on plot(ti,ix(:,2)','r--')  legend('Original Channel 2','Reconstructed Channel 2')

El vocoder de fase realiza el estiramiento del tiempo y el escalado de tono transformando el audio en el dominio de frecuencia. Este diagrama muestra las operaciones implicadas en la implementación del vocoder de fase.

El vocoder de fase toma el STFT de una señal con una ventana de análisis de tamaño de salto

<math display="inline">
<mrow>
<msub>
<mrow>
<mi mathvariant="italic">R</mi>
</mrow>
<mrow>
<mn>1</mn>
</mrow>
</msub>
</mrow>
</math>
y luego realiza un ISTFT con una ventana de síntesis de tamaño de lúpulo
<math display="inline">
<mrow>
<msub>
<mrow>
<mi mathvariant="italic">R</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msub>
</mrow>
</math>
. El vocoder aprovecha así el método WOLA. Para estirar el tiempo de una señal, la ventana de análisis utiliza un mayor número de muestras de superposición que la síntesis. Como resultado, hay más muestras en la salida que en la entrada (
<math display="inline">
<mrow>
<msub>
<mrow>
<mi mathvariant="italic">N</mi>
</mrow>
<mrow>
<mi mathvariant="italic">S</mi>
<mo>,</mo>
<mi mathvariant="normal">Out</mi>
</mrow>
</msub>
<mo>></mo>
<msub>
<mrow>
<mi mathvariant="italic">N</mi>
</mrow>
<mrow>
<mi mathvariant="italic">S</mi>
<mo>,</mo>
<mi mathvariant="normal">In</mi>
</mrow>
</msub>
</mrow>
</math>
), aunque el contenido de frecuencia sigue siendo el mismo. Ahora, puede escalar esta señal reproduciéndola a una frecuencia de muestreo más alta, lo que produce una señal con la duración original pero un tono más alto.

Cargue un archivo de audio que contenga un fragmento del "Hallelujah Chorus" de Handel muestreado a 8192 Hz.

load handel

Diseñe una ventana de raíz-Hann de longitud 512. Establezca la longitud de superposición de análisis como 192 y la longitud de superposición de síntesis como 166.

wlen = 512; win = sqrt(hann(wlen,'periodic')); noverlapA = 192; noverlapS = 166;

Implemente el vocoder de fase mediante una ventana de análisis de superposición 192 y una ventana de síntesis de superposición 166.

S = stft(y,Fs,'Window',win,'OverlapLength',noverlapA); iy = istft(S,Fs,'Window',win,'OverlapLength',noverlapS);   %To hear, type soundsc(w,Fs), pause(10), soundsc(iw,Fs);

Si las ventanas de análisis y síntesis son las mismas pero se cambia la longitud de solapamiento, habrá una ganancia/pérdida adicional que tendrá que ajustar. Este es un enfoque común para implementar un vocoder de fase.

Calcule la relación de salto y utilíquela para ajustar la ganancia de la señal reconstruida. También calcule la frecuencia de los datos desplazados de tono utilizando la relación de salto.

hopRatio = (wlen-noverlapS)/(wlen-noverlapA); iyg = iy*hopRatio; Fp = Fs*hopRatio;   %To hear, type soundsc(iwg,Fs), pause(15), soundsc(iwg,Fp);

Trazar la señal original y la señal de tiempo extendido con ganancia fija.

plot((0:length(iyg)-1)/Fs,iyg,(0:length(y)-1)/Fs,y) xlabel('Time (s)') xlim([0 (length(iyg)-1)/Fs]) legend('Time Stretched Signal with Fixed Gain','Original Signal','Location','best')

Compare la señal de tiempo extendido y la señal de paso de tono en la misma gráfica.

plot((0:length(iy)-1)/Fs,iy,(0:length(iy)-1)/Fp,iy) xlabel('Time (s)') xlim([0 (length(iyg)-1)/Fs]) legend('Time Stretched Signal','Pitch Shifted Signal','Location','best') 

Para comprender mejor el efecto de los datos de cambio de tono, considere el siguiente sinusoides de frecuencia durante 2 segundos.Fs

t =  0:1/Fs:2; x = sin(2*pi*10*t);

Calcule la transformación de Fourier de corto plazo y la transformación inversa de Fourier de tiempo corto con longitudes de superposición 192 y 166 respectivamente.

Sx = stft(x,Fs,'Window',win,'OverlapLength',noverlapA); ix = istft(Sx,Fs,'Window',win,'OverlapLength',noverlapS);

Trazar la señal original en una gráfica y la señal estirada en el tiempo y el tono cambiado en otra.

subplot(2,1,1) plot((0:length(ix)-1)/Fs,ix,'LineWidth',2)  xlabel('Time (s)') ylabel('Signal Amplitude') xlim([0 (length(ix)-1)/Fs]) legend('Time Stretched Signal')     subplot(2,1,2) hold on plot((0:length(x)-1)/Fs,x) plot((0:length(ix)-1)/Fp,ix,'--','LineWidth',2) legend('Original Signal','Pitch Shifted Signal','Location','best') hold off xlabel('Time (s)') ylabel('Signal Amplitude') xlim([0 (length(ix)-1)/Fs])

Generar un sinusoides complejo de frecuencia 1 kHz y duración 2 segundos.

fs = 1e3; ts = 0:1/fs:2-1/fs;  x = exp(2j*pi*100*cos(2*pi*2*ts));

Diseñe una ventana periódica de Hann de longitud 100 y establezca el número de muestras superpuestas en 75. Compruebe la ventana y la longitud de solapamiento para el cumplimiento de COLA.

nwin = 100; win = hann(100,'periodic'); noverlap = 75;  tf = iscola(win,noverlap)
tf = logical
   1

Cero-pad la señal para eliminar los efectos de borde. Para evitar el truncamiento, acolche la señal de entrada con ceros de tal forma que

<math display="inline">
<mrow>
<mfrac>
<mrow>
<mrow>
<mo>(</mo>
<mrow>
<mi mathvariant="normal">length</mi>
<mrow>
<mo>(</mo>
<mrow>
<mi mathvariant="normal">xZero</mi>
</mrow>
<mo>)</mo>
</mrow>
<mo>-</mo>
<mi mathvariant="normal">noverlap</mi>
</mrow>
<mo>)</mo>
</mrow>
</mrow>
<mrow>
<mrow>
<mo>(</mo>
<mrow>
<mi mathvariant="normal">nwin</mi>
<mo>-</mo>
<mi mathvariant="normal">noverlap</mi>
</mrow>
<mo>)</mo>
</mrow>
</mrow>
</mfrac>
</mrow>
</math>
es un entero. Establezca la longitud FFT en 128. Calcula la transformación de Fourier de corto tiempo de la señal compleja.

xZero = [zeros(1,nwin) x zeros(1,nwin)]; fftlen = 128; s = stft(xZero,fs,'Window',win,'OverlapLength',noverlap,'FFTLength',fftlen);

Calcule la transformación inversa de corta distancia de Fourier y elimine los ceros para una reconstrucción perfecta.

[is,ti] = istft(s,fs,'Window',win,'OverlapLength',noverlap,'FFTLength',fftlen); is(1:nwin) = []; is(end-nwin+1:end) = []; ti = ti(1:end-2*nwin);

Trazar las partes reales de las señales originales y reconstruidas. La parte imaginaria de la señal también se reconstruye perfectamente.

plot(ts,real(x)) hold on plot(ti,real(is),'--') xlim([0 0.5]) xlabel('Time (s)') ylabel('Amplitude (V)') legend('Original Signal','Reconstructed Signal')  hold off

Genere un sinusoides muestreado a 2 kHz durante 1 segundo.

fs = 2e3; t = 0:1/fs:1-1/fs; x = 5*sin(2*pi*10*t);

Diseñe una ventana periódica de Hamming de longitud 120. Compruebe la restricción COLA para la ventana con una superposición de 80 muestras. La combinación de superposición de ventanas es compatible con COLA.

win = hamming(120,'periodic'); noverlap = 80; tf = iscola(win,noverlap)
tf = logical
   1

Establezca la longitud FFT en 512. Calcula la transformación de Fourier de poco tiempo.

fftlen = 512; s = stft(x,fs,'Window',win,'OverlapLength',noverlap,'FFTLength',fftlen);

Calcule la transformación inversa de Fourier de corto plazo.

[X,T] = istft(s,fs,'Window',win,'OverlapLength',noverlap,'FFTLength',fftlen,'Method','ola','ConjugateSymmetric',true);

Trazar las señales originales y reconstruidas.

plot(t,x,'b') hold on plot(T,X,'-.r') xlabel('Time (s)') ylabel('Amplitude (V)') title('Original and Reconstructed Signal') legend('Original Signal','Reconstructed Signal') hold off

Argumentos de entrada

contraer todo

Transformación de Fourier de tiempo corto, especificada como una matriz o una matriz 3D. Para las señales de un solo canal, especifique como una matriz con un aumento de tiempo en las columnas y la frecuencia aumentando las filas.s Para señales multicanal, especifique como una matriz 3D con la tercera dimensión correspondiente a los canales.s Los vectores de frecuencia y tiempo se obtienen como salidas de .stft

Nota

Si invierte utilizando y desea que el resultado tenga la misma longitud que , el valor de debe ser un entero.sistftx(length(x)-noverlap)/(length(window)-noverlap)

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

Frecuencia de muestreo en hercios, especificada como escalar positiva.

Tipos de datos: double | single

Tiempo de muestra, especificado como escalar.duration

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

Tipos de datos: duration

Argumentos de par nombre-valor

Especifique pares opcionales separados por comas de argumentos. es el nombre del argumento y es el valor correspondiente. deben aparecer entre comillas.Name,ValueNameValueName Puede especificar varios argumentos de par de nombre y valor en cualquier orden como .Name1,Value1,...,NameN,ValueN

Ejemplo: ventanas de los datos utilizando la ventana , con 50 muestras se superponen entre segmentos adyacentes y 128 puntos FFT.istft(s,'Window',win,'OverlapLength',50,'FFTLength',128)win

Función de ventana, especificada como el par separado por comas que consta de un vector y un vector.'Window' Si no especifica la ventana o la especifica como vacía, la función utiliza una ventana Hann periódica de longitud 128. La longitud de debe ser mayor o igual que 2.Window

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

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

Tipos de datos: double | single

Número de muestras superpuestas, especificada como el par separado por comas que consta de un entero positivo menor que la longitud de .OverlapLengthwindow Si lo omite o especifica como vacío, se establece en el entero más grande inferior al 75% de la longitud de la ventana, que resulta ser 96 muestras para la ventana Den predeterminada.'OverlapLength'

Tipos de datos: double | single

Número de puntos DFT, especificado como el par separado por comas que consta de y un entero positivo.FFTLength Para lograr una reconstrucción perfecta del dominio del tiempo, debe establecer la combinación con la utilizada en .FFTLengthstft

Tipos de datos: double | single

Método de superposición-add, especificado como el par separado por comas que consta de y uno de los siguientes:Method

  • — Superposición ponderada-añadir'wola'

  • — Superposición-añadir'ola'

Simetría conjugada de la señal original, especificada como el par separado por comas que consta de y o .ConjugateSymmetrictruefalse Si esta opción se establece en , supone que la entrada es simétrica, de lo contrario no se realiza ninguna suposición simétrica.trueistfts Cuando no es exactamente simétrico conjugado debido a un error de redondeo, establecer el par nombre-valor para garantizar que el STFT se trata como si fuera conjugado simétrico.strue Si es conjugado simétrico, el cálculo de la transformación inversa es más rápido y la salida es real.s

Rango de frecuencia, especificado como el par separado por comas que consta de y o .Centeredtruefalse Si esta opción se establece en , entonces el espectro se centra y se calcula en el intervalo -a .true De lo contrario, el espectro se calcula en el intervalo de 0 a 2o.

Dimensión de tiempo de entrada, especificada como el par separado por comas que consta de y o .InputTimeDimensionacrosscolumnsdownrows Si este valor se establece en , supone que la dimensión de tiempo de está abajo de las filas y la frecuencia está en las columnas.downrowsistfts Si este valor se establece en , la función supone que la dimensión de tiempo de está en las columnas y la dimensión de frecuencia está abajo en las filas.acrosscolumnsistfts

Argumentos de salida

contraer todo

Señal reconstruida en el dominio de tiempo, devuelta como un vector o una matriz.

Tipos de datos: single | double

Instantáneas de tiempo, devueltas como vector.

  • Si se proporciona una frecuencia de muestreo, contiene valores de tiempo en segundos.fst

  • Si se proporciona una duración, tiene el mismo formato de tiempo que la duración de entrada y es una matriz de duración.tst

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

Tipos de datos: double | single

Más acerca de

contraer todo

Inverso corto tiempo Fourier Transform

La transformación inversa de corta distancia de Fourier se calcula tomando el IFFT de cada vector DFT del STFT y superponiendo las señales invertidas. El ISTFT se calcula de la siguiente manera:

x(n)=1/21/2m=Xm(f)ej2πfndf=m=1/21/2Xm(f)ej2πfndf=m=xm(n)

Dónde R es el tamaño del salto entre los sucesivos DFT, Xm es el DFT de los datos en ventanas centrados en el tiempo mR Y xm(n)=x(n)g(nmR). El STFT inverso es una reconstrucción perfecta de la señal original siempre y cuando m=ga+1(nmR)=cn donde elventana de análisis g(n) se utilizó para ventanar la señal original y c es una constante. La siguiente figura muestra los pasos seguidos en la reconstrucción de la señal original.

Restricción de superposición constante (COLA)

Para garantizar la reconstrucción correcta de espectros no modificados, la ventana de análisis debe satisfacer la restricción COLA. En general, si la ventana de análisis satisface la condición m=ga+1(nmR)=cn, la ventana se considera compatible con COLA. Además, el cumplimiento de COLA se puede describir como débil o fuerte.

  • El débil cumplimiento de COLA implica que la transformación de Fourier de la ventana de análisis tiene ceros a ritmo de fotogramas armónicos, de modo que

    G(fk)=0,k=1,2,,R1,fkkR.

    La cancelación de alias se ve perturbada por las modificaciones espectrales. El cola débil se basa en la cancelación de alias en el dominio de frecuencia. Por lo tanto, la reconstrucción perfecta es posible utilizando ventanas débilmente compatibles con COLA, siempre y cuando la señal no haya sufrido ninguna modificación espectral.

  • Para un cumplimiento sólido de COLA, la transformación de Fourier de la ventana debe estar bandlimitada de forma consistente con la reducción de la frecuencia de fotogramas de tal manera que

    G(f)=0,f12R.

    Esta ecuación muestra que la restricción COLA fuerte no permite alias. Además, para el cumplimiento sólido de COLA, el valor de la c debe ser igual a 1. En general, si el espectro de corto plazo se modifica de alguna manera, se prefiere una ventana compatible con COLA más fuerte.

Puede utilizar la función para comprobar el cumplimiento débil de COLA.iscola El número de sumas utilizadas para comprobar el cumplimiento de COLA viene determinado por la longitud de la ventana y el tamaño del salto. En general, es común utilizar a=1 En m=ga+1(nmR)=cn para superposiciones ponderadas -add (WOLA), y a=0 para superposición-añadir (OLA). De forma predeterminada, utiliza el método WOLA, aplicando un antes de realizar el método overlap-add.istftventana de síntesis

En general, la ventana de síntesis es la misma que la ventana de análisis. Puede construir ventanas WOLA útiles tomando la raíz cuadrada de una ventana OLA fuerte. Puede utilizar este método para todas las ventanas de OLA no negativas. Por ejemplo, la ventana root-Hann es un buen ejemplo de una ventana WOLA.

Reconstrucción perfecta

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

  • Tamaño de entrada — Si invierte la salida de using y desea que el resultado tenga la misma longitud que la señal de entrada, el valor destftistftx k = (length(x)-noverlap)(length(window)-noverlap) debe ser un entero.

  • Cumplimiento de COLA: utilice las ventanas compatibles con COLA, suponiendo que no ha modificado la transformación de Fourier de la señal de corta distancia.

  • Relleno — Si la longitud de la señal de entrada es tal que el valor de no es un entero, cero-pad la señal antes de calcular la transformación de Fourier de corto tiempo.k Retire los ceros adicionales después de invertir la señal.

Referencias

[1] Crochiere, R. E. “A Weighted Overlap-Add Method of Short-Time Fourier Analysis/Synthesis.” IEEE Transactions on Acoustics, Speech and Signal Processing. Vol. 28, No. 1, Feb 1980, pp. 99–102.

[2] Griffin, D. W., and J. S. Lim. “Signal Estimation from Modified Short-Time Fourier Transform.” IEEE Transactions on Acoustics, Speech and Signal Processing. Vol. 32, No. 2, April 1984, pp. 236–243.

[3] Portnoff, M. R. “Time-Frequency Representation of Digital Signals and Systems Based on Short-Time Fourier analysis.” IEEE Transactions on Acoustics, Speech and Signal Processing. Vol. 28, No. 1, Feb 1980, pp. 55–69.

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

[5] A. D. Gotzen, N. Bernardini and D. Arfib, “Traditional Implementations of a Phase-Vocoder: The Tricks of the Trade”, Proceedings of the COST G-6 Conference on Digital Audio Effects (DAFX-00), Verona, Italy, Dec 7-9, 2000.

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

Capacidades ampliadas

Consulte también

Funciones

Introducido en R2019a