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

La transformada de Fourier inversa a corto plazo

Descripción

x = istft(s) Devuelve la transformada de Fourier (ISTFT) inversa de tiempo corto.s

ejemplo

x = istft(s,fs) Devuelve el ISTFT del uso de 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

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

El vocoder de fase toma el STFT de una señal con una ventana de análisis del tamaño del 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 salto
<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 una señal de tiempo, la ventana de análisis utiliza un mayor número de muestras superpuestas 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 ajustar la escala de esta señal mediante la reproducción a una frecuencia de muestreo más alta, 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 "coro de Hallelujah" de Handel muestreado a 8192 Hz. Cree un archivo WAVE a partir del archivo de ejemplo y vuelva a leer el archivo en MATLAB®.handel.mat

load handel

Diseñe una ventana root-Hann de longitud 512. Establezca la longitud de superposición del 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 utilizando 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 superposición, 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íla para ajustar la ganancia de la señal reconstruida. Calcule también la frecuencia de los datos con desplazamiento de tono utilizando la relación de saltos.

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

Trace la señal original y la señal de tiempo estirada 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 desplazado en la misma parcela.

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 la siguiente sinusoide de frecuencia durante 2 segundos.Fs

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

Calcule la transformada de Fourier a corto plazo y la transformada inversa de Fourier a corto plazo 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);

Trace la señal original en una gráfica y la señal desplazada por el tiempo y el tono 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])

Genere una sinusoide compleja 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 Hann periódica de longitud 100 y establezca el número de muestras superpuestas en 75. Compruebe la ventana y la longitud de superposición para el cumplimiento de COLA.

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

Zero-Pad la señal para eliminar los efectos de borde. Para evitar el truncamiento, Pad la señal de entrada con ceros de tal 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. Fije la longitud FFT a 128. Calcule la transformada de Fourier a corto plazo 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 transformada inversa de Fourier a corto plazo y quite 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

Generar una sinusoide muestreada 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 de longitud de Hamming periódica de 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

Fije la longitud FFT a 512. Calcule la transformada de Fourier a corto plazo.

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

Calcule la transformada inversa de Fourier a 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

Transformada de Fourier a corto plazo, especificada como una matriz. El número de filas es igual a la longitud del vector de frecuencia, y el número de columnas es igual a la longitud del vector de tiempo.s Los vectores de frecuencia y tiempo se obtienen como salidas de.stft

Nota

Si invierte utilizando y desea que el resultado sea 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 Hertz, especificada como un escalar positivo.

Tipos de datos: double | single

Tiempo de muestra, especificado como un escalar.duration

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

Tipos de datos: double | single

Argumentos de par nombre-valor

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

Ejemplo: Windows los datos utilizando la ventana, con 50 muestras superpuestas entre segmentos adyacentes y 128 punto FFT.istft(s,'Window',win,'OverlapLength',50,'FFTLength',128)win

Función Windowing, especificada como el par separado por comas que consta de 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 Hann de longitud + 1.hann(N+1)(1-cos(2*pi*(0:N)'/N))/2N

Tipos de datos: double | single

Número de muestras superpuestas, especificadas como un entero positivo menor que la longitud de.window Si se omite o se especifica como vacío, se establece en el entero más grande menor que 75% de la longitud de la ventana, que resulta ser 96 muestras para la ventana de Hann predeterminada.'OverlapLength'

Tipos de datos: double | single

Número de puntos DFT, especificado como un entero positivo. Para lograr la reconstrucción perfecta del dominio del tiempo, debe establecer la coincidencia que se usa en.FFTLengthstft

Tipos de datos: double | single

Método de superposición-añadir, especificado como:

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

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

Conjugada de simetría de la señal original, especificada como o.truefalse Si esta opción está establecida en, asume que la entrada es simétrica, de lo contrario no se realiza ninguna suposición simétrica.trueistfts Cuando no es exactamente conjugada simétrica debido al error de redondeo, establecer el par nombre-valor para garantizar que el STFT se trata como si fuera simétrica conjugada.strue Si es simétrica conjugada, entonces el cálculo inverso de la transformada es más rápido, y la salida es real.s

Rango de frecuencias, especificado como o.truefalse Si esta opción está establecida en, entonces el espectro se centra y se calcula sobre el intervalo-π a π.true De lo contrario, el espectro se calcula en el intervalo 0 a 2 π.

Argumentos de salida

contraer todo

Señal reconstruida en el dominio del tiempo, devuelta como vector.

Tipos de datos: double | single

Instantes de tiempo, devueltos como un vector.

  • Si se proporciona una frecuencia de muestreo, entonces 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, entonces contiene números de muestra.t

Tipos de datos: double | single

Más acerca de

contraer todo

La transformada de Fourier inversa de tiempo corto

La transformada de Fourier inversa de tiempo corto se calcula tomando el IFFT de cada vector DFT del STFT y solapando-añadiendo 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 DFTs sucesivos, Xm es el DFT de los datos de ventana 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) fue utilizado para la ventana de la señal original y c es una constante. La figura siguiente muestra los pasos seguidos en la reconstrucción de la señal original.

Restricción de superposición-adición constante (COLA)

Para garantizar la reconstrucción exitosa de los 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, se considera que la ventana es compatible con COLA. Además, el cumplimiento de COLA puede describirse como débil o fuerte.

  • El cumplimiento débil de COLA implica que la transformada de Fourier de la ventana de análisis tiene ceros en armónicos de velocidad de fotogramas, de tal

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

    La cancelación de alias se ve perturbada por modificaciones espectrales. Débil COLA se basa en la cancelación de alias en el dominio de frecuencia. Por lo tanto, la reconstrucción perfecta es posible usando débiles ventanas que cumplen con COLA, siempre y cuando la señal no ha sufrido ninguna modificación espectral.

  • Para un fuerte cumplimiento de cola, la transformada de Fourier de la ventana debe ser bandlimitada consistentemente con resolución por la velocidad de fotogramas tal que

    G(f)=0,f12R.

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

Puede utilizar la función para comprobar la conformidad de COLA débil.iscola El número de sumas utilizadas para comprobar el cumplimiento de COLA está dictado 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 superposición ponderada-Añadir (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 solapamiento-agregar.istftventana de síntesis

En general, la ventana de síntesis es la misma que la ventana de análisis. Puede construir ventanas de WOLA útiles tomando la raíz cuadrada de una ventana de 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 de WOLA.

.

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.

Capacidades ampliadas

Consulte también

Funciones

Introducido en R2019a