Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Introducción práctica al análisis de frecuencia de tiempo

Este ejemplo muestra cómo realizar e interpretar el análisis básico de la señal de frecuencia de tiempo. En aplicaciones prácticas, muchas señales no son estacionarias. Esto significa que su representación de dominio de frecuencia (su espectro) cambia con el tiempo. En el ejemplo se describen las ventajas de utilizar técnicas de frecuencia de tiempo sobre representaciones de dominio de frecuencia o de dominio de tiempo de una señal. Responde a preguntas básicas, tales como: ¿Cuándo está presente un componente de frecuencia en particular en mi señal? ¿Cómo puedo aumentar el tiempo o la resolución de frecuencia? ¿Cómo puedo afindar el espectro de un componente o extraer un modo en particular? ¿Cómo mido la potencia en una representación de frecuencia de tiempo? ¿Cómo visualizo la información de frecuencia de tiempo de mi señal? ¿Cómo encuentro interferencia intermitente dentro del contenido de frecuencia de la señal de interés?

Uso del análisis de frecuencia de tiempo para identificar números en una señal DTMF

Puede dividir casi cualquier señal que varia el tiempo en intervalos de tiempo lo suficientemente cortos como para que la señal sea esencialmente estacionaria en cada sección. El análisis de frecuencia de tiempo se realiza con mayor frecuencia segmentando una señal en esos períodos cortos y estimando el espectro sobre ventanas deslizantes. La función utilizada con la opción calcula una estimación espectral basada en FFT en cada ventana deslizante y le permite visualizar cómo cambia el contenido de frecuencia de la señal con el tiempo.pspectrum'spectrogram'

Considere el sistema de señalización de un dial de teléfono digital. Las señales producidas por un sistema de este tipo se conocen como señales de multifrecuencia de tono doble (DTMF). El sonido generado por cada número marcado consiste en la suma de dos sinusoides

<math display="inline">
<mrow>
<mo>-</mo>
</mrow>
</math>
o tonos
<math display="inline">
<mrow>
<mo>-</mo>
</mrow>
</math>
con frecuencias tomadas de dos grupos mutuamente excluyentes. Cada par de tonos contiene una frecuencia del grupo bajo (697 Hz, 770 Hz, 852 Hz o 941 Hz) y una frecuencia del grupo alto (1209 Hz, 1336 Hz o 1477Hz) y representa un símbolo único. Las siguientes son las frecuencias asignadas a los botones de una almohadilla telefónica:

Genere una señal DTMF y escúchela.

[tones, Fs] = helperDTMFToneGenerator(); p = audioplayer(tones,Fs,16); play(p)

Al escuchar la señal, se puede decir que se marcó un número de tres dígitos. Sin embargo, no puede saber qué número era. A continuación, visualice la señal en el tiempo y en el dominio de frecuencia sobre la banda de 650 a 1500 Hz. Establezca el parámetro de la función en 1 para utilizar una ventana rectangular y mejorar la resolución de frecuencia.'Leakage'pspectrum

N = numel(tones); t = (0:N-1)/Fs;  subplot(2,1,1) plot(1e3*t,tones) xlabel('Time (ms)') ylabel('Amplitude') title('DTMF Signal') subplot(2,1,2) pspectrum(tones,Fs,'Leakage',1,'FrequencyLimits',[650, 1500])

La gráfica de dominio del tiempo de la señal confirma la presencia de tres ráfagas de energía, correspondientes a tres botones pulsados. Para medir la longitud de la ráfaga, puede tomar el ancho de pulso de la envolvente RMS.

env = envelope(tones,80,'rms'); pulsewidth(env,Fs)
ans = 3×1

    0.1041
    0.1042
    0.1047

title('Pulse Width of RMS Envelope')

Aquí puede ver tres pulsos, cada uno de aproximadamente 100 milisegundos de largo. Sin embargo, no puede saber qué números se marcaron. Una gráfica de dominio de frecuencia le ayuda a averiguar esto porque muestra las frecuencias presentes en la señal.

Localice los picos de frecuencia estimando la frecuencia media en cuatro bandas de frecuencia diferentes.

f = [meanfreq(tones,Fs,[700 800]), ...      meanfreq(tones,Fs,[800 900]), ...      meanfreq(tones,Fs,[900 1000]), ...      meanfreq(tones,Fs,[1300 1400])]; round(f)
ans = 1×4

         770         852         941        1336

Al hacer coincidir las frecuencias estimadas con el diagrama de la almohadilla telefónica, puede decir que los botones marcados eran '5', '8' y '0'. Sin embargo, la gráfica de dominio de frecuencia no proporciona ningún tipo de información de tiempo que le permita averiguar el orden en el que se marcaron. La combinación podría ser '580','508','805','850', '085' o '058'. Para resolver este rompecabezas, utilice la función pspectrum para calcular el espectrograma y observar cómo el contenido de frecuencia de la señal varía con el tiempo.

Calcular el espectrograma sobre la banda de 650 a 1500 Hz y eliminar el contenido debajo de la

<math display="inline">
<mrow>
<mo>-</mo>
</mrow>
</math>
Nivel de potencia de 10 dB para visualizar solo los componentes de frecuencia principales. Para ver las duraciones del tono y sus ubicaciones en el tiempo, utilice 0% superposición.

pspectrum(tones,Fs,'spectrogram','Leakage',1,'OverlapPercent',0, ...     'MinThreshold',-10,'FrequencyLimits',[650, 1500]);

Los colores del espectrograma codifican los niveles de potencia de frecuencia. Los colores amarillos indican el contenido de frecuencia con mayor potencia; los colores azules indican el contenido de frecuencia con muy baja potencia. Una línea horizontal amarilla fuerte indica la existencia de un tono a una frecuencia determinada. La gráfica muestra claramente la presencia de un tono de 1336 Hz en los tres dígitos marcados, diciéndole que todos están en la segunda columna del teclado. Desde la gráfica se puede ver que la frecuencia más baja, 770 Hz, se marcó primero. La frecuencia más alta, 941 Hz, fue la siguiente. La frecuencia media, 852 Hz, fue la última. Por lo tanto, el número marcado era 508.

Trading fuera de tiempo y resolución de frecuencia para obtener la mejor representación de su señal

La función divide una señal en segmentos.pspectrum Los segmentos más largos proporcionan una mejor resolución de frecuencia; segmentos más cortos proporcionan una mejor resolución de tiempo. Las longitudes de segmento se pueden controlar utilizando los parámetros y.'FrequencyResolution''TimeResolution' Cuando no se especifican valores de resolución de frecuencia o de resolución de tiempo, intenta encontrar un buen equilibrio entre las resoluciones de tiempo y frecuencia en función de la longitud de la señal de entrada.pspectrum

Considere la siguiente señal, muestreada a 4 kHz, que consiste en la porción de trino de una canción de ballena azul del Pacífico:

load whaleTrill p = audioplayer(whaleTrill,Fs,16); play(p)

La señal del trino consiste en un tren de pulsos tonales. Observe la señal de tiempo y el espectrograma obtenidos cuando no se especifica ninguna resolución y cuando la resolución de tiempo se establece en 10 milisegundos.pspectrum Establezca el parámetro en 1 para utilizar ventanas rectangulares.'Leakage' Puesto que queremos localizar la posición de tiempo de los pulsos, establezca el porcentaje de superposición en 0. Por último, utilice un'MinThreshold'

<math display="inline">
<mrow>
<mo>-</mo>
</mrow>
</math>
60 dB para eliminar el ruido de fondo de la vista de espectrograma.

t = (0:length(whaleTrill)-1)/Fs; figure ax1 = subplot(3,1,1); plot(t,whaleTrill) ax2 = subplot(3,1,2); pspectrum(whaleTrill,Fs,'spectrogram','OverlapPercent',0, ...     'Leakage',1,'MinThreshold',-60) colorbar(ax2,'off') ax3 = subplot(3,1,3); pspectrum(whaleTrill,Fs,'spectrogram','OverlapPercent',0, ...     'Leakage',1,'MinThreshold',-60,'TimeResolution', 10e-3) colorbar(ax3,'off') linkaxes([ax1,ax2,ax3],'x')

La resolución de tiempo de 47 milisegundos elegida por no es lo suficientemente pequeña como para localizar todos los pulsos de trino en el espectrograma.pspectrum Por otro lado, una resolución de tiempo de 10 milisegundos es suficiente para localizar cada pulso de trino en el tiempo. Esto se vuelve aún más claro si nos acercamos a unos pocos pulsos:

xlim([0.3 0.55])

Ahora cargue una señal que consiste en un pulso de ecolocalización emitido por un gran murciélago marrón (Eptesicus fuscus). La señal se mide con un intervalo de muestreo de 7 microsegundos. Analice el espectrograma de la señal.

load batsignal Fs = 1/DT; figure pspectrum(batsignal,Fs,'spectrogram')

El espectrograma con valores de parámetro predeterminados muestra cuatro crestas gruesas de frecuencia de tiempo. Reduzca el valor de resolución de frecuencia a 3 kHz para obtener más detalles sobre la variación de frecuencia de cada cresta.

pspectrum(batsignal,Fs,'spectrogram','FrequencyResolution',3e3)

Observe que ahora las crestas de frecuencia están mejor localizadas en frecuencia. Sin embargo, dado que la frecuencia y la resolución de tiempo son inversamente proporcionales, la resolución de tiempo del espectrograma es considerablemente menor. Establezca una superposición del 99% para suavizar las ventanas de tiempo. Utilice un'MinThreshold'

<math display="inline">
<mrow>
<mo>-</mo>
</mrow>
</math>
60 dB para eliminar contenido de fondo no deseado.

pspectrum(batsignal,Fs,'spectrogram','FrequencyResolution',3e3, ...     'OverlapPercent',99,'MinTHreshold',-60)

Los nuevos ajustes producen un espectrograma que muestra claramente las cuatro crestas de frecuencia de la señal de ecolocalización.

Reasignación de frecuencia de tiempo

A pesar de que hemos sido capaces de identificar cuatro crestas de frecuencia, todavía podemos ver que cada cresta se extiende sobre varios contenedores de frecuencia adyacentes. Esto se debe a la fuga del método de ventanas utilizado tanto en tiempo como en frecuencia.

La función es capaz de estimar el centro de energía para cada estimación espectral tanto en tiempo como en frecuencia.pspectrum Si reasigna la energía de cada estimación a la ubicación más cercana a los nuevos centros de tiempo y frecuencia, puede corregir parte de la fuga de la ventana. Puede hacerlo mediante el parámetro.'Reassign' Al establecer este parámetro en computación, se calcula el espectrograma reasignado de la señal.true

pspectrum(batsignal,Fs,'spectrogram','FrequencyResolution',3e3, ...     'OverlapPercent',99,'MinTHreshold',-60,'Reassign',true)

Ahora las crestas de frecuencia son mucho más nítidas y mejor localizadas en el tiempo. También puede localizar la energía de la señal utilizando la función, que se describe en la siguiente sección.fsst

Reconstruyendo una cresta de frecuencia de tiempo

Considere la siguiente grabación, que consiste en una señal de chirp cuya frecuencia disminuye con el tiempo y un sonido de splat final.

load splat p = audioplayer(y,Fs,16); play(p) pspectrum(y,Fs,'spectrogram')

Vamos a reconstruir una parte del sonido "splat" extrayendo una cresta en el plano de frecuencia de tiempo. Usamos para afilar el espectro de una versión ruidosa la señal splat, para identificar la cresta del sonido chirp, y para reconstruir el chirp.fssttfridgeifsst El proceso despercibe la señal reconstruida.

Agregue ruido gaussiano a la parte chirp del sonido "splat". El ruido añadido simula una grabación de audio tomada con un micrófono barato. Examine el contenido espectral de frecuencia de tiempo.

rng('default') t = (0:length(y)-1)/Fs; yNoise = y + 0.1*randn(size(y)); yChirp = yNoise(t<0.35); pspectrum(yChirp,Fs,'spectrogram','MinThreshold',-70)

Enfoque el espectro utilizando la transformación sincronizada de Fourier, . localiza la energía en el plano de frecuencia de tiempo reasignando energía en frecuencia durante un tiempo fijo.fsstfsst Calcular y trazar la transformación sincronizada del chirp ruidoso.

fsst(yChirp,Fs,'yaxis')

El chirp aparece como una cresta localizada en el plano de frecuencia de tiempo. Identifique la cresta usando .tfridge Traza la cresta junto con la transformación.

[sst,f] = fsst(yChirp,Fs);  [fridge, iridge] = tfridge(sst,f,10); helperPlotRidge(yChirp,Fs,fridge);

A continuación, reconstruya la señal de chirp utilizando el vector de índice de cresta.iridge Incluya un contenedor a cada lado de la cresta. Trazar el espectrograma de la señal reconstruida.

yrec = ifsst(sst,kaiser(256,10),iridge,'NumFrequencyBins',1); pspectrum(yrec,Fs,'spectrogram','MinThreshold',-70)

Reconstruir la cresta ha eliminado el ruido de la señal. Reproduce las ruidosas y las señales deruido consecutivas para escuchar la diferencia.

p = audioplayer([yChirp;zeros(size(yChirp));yrec],Fs,16); play(p);

Potencia de medición

Considere un pulso de frecuencia lineal modulada (LFM) complejo, que es una forma de onda de radar común. Calcular el espectrograma de la señal utilizando una resolución de tiempo de 1,27 microsegundos y un 90% de superposición.

Fs = 1e8; bw = 60e6; t = 0:1/Fs:10e-6; IComp = chirp(t,-bw/2,t(end), bw/2,'linear',90)+0.15*randn(size(t)); QComp = chirp(t,-bw/2,t(end), bw/2,'linear',0) +0.15*randn(size(t)); IQData = IComp + 1i*QComp;  segmentLength = 128; pspectrum(IQData,Fs,'spectrogram','TimeResolution',1.27e-6,'OverlapPercent',90)

Los parámetros utilizados para calcular el espectrograma proporcionan una clara representación de frecuencia de tiempo de la señal LFM. calcula un espectrograma de potencia, esto significa que los valores de color corresponden a los niveles de potencia reales en dB.pspectrum La barra de color muestra que el nivel de potencia de la señal está alrededor

<math display="inline">
<mrow>
<mo>-</mo>
</mrow>
</math>
4 dB.

Visualización de escala de frecuencia logarítmica

En ciertas aplicaciones, puede ser preferible visualizar el espectrograma de una señal en una escala de frecuencia logarítmica. Puede lograr esto cambiando la propiedad del eje .YScaley Por ejemplo, considere un chirp logarítmico muestreado a 1 kHz. La frecuencia del chirrido aumenta de 10 Hz a 400 Hz en 10 segundos.

Fs = 1e3;                     t = 0:1/Fs:10;                fo = 10;                      f1 = 400;                     y = chirp(t,fo,10,f1,'logarithmic'); pspectrum(y,Fs,'spectrogram','FrequencyResolution',1, ...     'OverlapPercent',90,'Leakage',0.85,'FrequencyLimits',[1 Fs/2])

El espectrograma del chirrido se convierte en una línea recta cuando la escala de frecuencia es logarítmica.

ax = gca; ax.YScale = 'log';

Visualización de cascada tridimensional

Con el comando, puede visualizar el espectrograma de una señal como una gráfica de cascada tridimensional.view También puede cambiar los colores de visualización con la función.colormap

Fs = 10e3; t = 0:1/Fs:2; x1 = vco(sawtooth(2*pi*t,0.5),[0.1 0.4]*Fs,Fs); pspectrum(x1,Fs,'spectrogram','Leakage',0.8)

view(-45,65) colormap bone

Búsqueda de interferencias mediante el espectro de persistencia

El espectro de persistencia de una señal es una vista de frecuencia de tiempo que muestra el porcentaje del tiempo que una frecuencia dada está presente en una señal. El espectro de persistencia es un histograma en el espacio de frecuencia de potencia. Cuanto más larga sea una frecuencia particular persista en una señal a medida que la señal evoluciona, mayor será su porcentaje de tiempo y, por lo tanto, más brillante o "más caliente" será su color en la pantalla. Utilice el espectro de persistencia para identificar señales ocultas en otras señales.

Considere una señal de banda estrecha de interferencia incrustada dentro de una señal de banda ancha. Genere un chirrido muestreado a 1 kHz durante 500 segundos. La frecuencia del chirrido aumenta de 180 Hz a 220 Hz durante la medición.

fs = 1000; t = (0:1/fs:500)';  x = chirp(t,180,t(end),220) + 0.15*randn(size(t));

La señal también contiene una interferencia de 210 Hz, con una amplitud de 0,05, que está presente sólo para 1/6 de la duración total de la señal.

idx = floor(length(x)/6); x(1:idx) = x(1:idx) + 0.05*cos(2*pi*t(1:idx)*210);

Calcular el espectro de potencia de la señal durante el intervalo de 100 a 290 Hz. El sinusoides débil está oscurecido por el chirrido.

pspectrum(x,fs,'FrequencyLimits',[100 290])

Calcular el espectro de persistencia de la señal. Ahora ambos componentes de señal son claramente visibles.

figure colormap parula pspectrum(x,fs,'persistence','FrequencyLimits',[100 290],'TimeResolution',1)

Conclusiones

En este ejemplo, aprendió a realizar análisis de frecuencia de tiempo mediante la función pspectrum y a interpretar los datos de espectrograma y los niveles de potencia. Aprendiste a cambiar la resolución de tiempo y frecuencia para mejorar tu comprensión de la señal y cómo afilar espectros y extraer crestas de frecuencia de tiempo usando , , y .fsstifssttfridge Aprendió a configurar la gráfica de espectrograma para obtener una escala de frecuencia logarítmica y una visualización tridimensional. Por último, aprendió a encontrar señales de interferencia calculando un espectro de persistencia.

Apéndice

En este ejemplo se utilizan las siguientes funciones auxiliares.