Main Content

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

Encontrar una señal en los datos

Este ejemplo muestra cómo utilizar para encontrar una señal que varia el tiempo en los datos.findsignal Incluye ejemplos de cómo encontrar señales exactas y estrechamente coincidentes mediante una métrica de distancia, cómo compensar un desplazamiento que varía lentamente y el uso de la deformación dinámica del tiempo para permitir variaciones en el muestreo.

Encontrar coincidencias exactas

Cuando desee encontrar coincidencias de una señal, puede utilizar para realizar la coincidencia.numéricamente exactosstrfind

Por ejemplo, si tenemos un vector de datos:

data = [1 4 3 2 55 2 3 1 5 2 55 2 3 1 6 4 2 55 2 3 1 6 4 2];

y queremos encontrar la ubicación de la señal:

signal = [55 2 3 1];

podemos utilizar para encontrar los índices iniciales de dónde existe la señal en los datos, siempre y cuando la señal y los datos sean numéricamente exactos.strfind

iStart = strfind(data,signal)
iStart = 1×3

     5    11    18

Encontrar la señal de coincidencia más cercana

funciona bien para los partidos.strfindnuméricamente exactos Sin embargo, este enfoque falla cuando puede haber errores debido al ruido de cuantificación u otros artefactos en la señal.

Por ejemplo, si tiene una onda sinusoidal:

data = sin(2*pi*(0:25)/16);

y desea encontrar la ubicación de la señal:

signal = cos(2*pi*(0:10)/16);

es incapaz de localizar el sinusoides en los datos que comienzan en la quinta muestra:strfind

iStart = strfind(data,signal)
iStart =       [] 

no puede encontrar la señal en los datos porque, debido al error de redondeo, no todos los valores son numéricamente iguales.strfind Para ver esto, reste los datos de la señal en la región coincidente.

data(5:15) - signal
ans = 1×11
10-15 ×

         0         0         0    0.0555    0.0612    0.0555         0    0.2220         0    0.2220         0

Hay diferencias numéricas en el orden de 1e-15.

Para remediar esto, puede utilizar , que de forma predeterminada barre la señal a través de los datos y calcula la suma de las diferencias cuadradas entre la señal y los datos localmente en cada ubicación, buscando la suma más baja.findsignal

Para generar una gráfica de la señal y los datos donde se resalta la mejor ubicación coincidente, puede llamar de la siguiente manera:findsignal

findsignal(data,signal)

Encontrar los partidos más cercanos bajo un umbral

De forma predeterminada, siempre devuelve la coincidencia más cercana de la señal con los datos.findsignal Para devolver varias coincidencias, puede especificar un límite en la diferencia cuadrada de suma máxima.

data = sin(2*pi*(0:100)/16); signal = cos(2*pi*(0:10)/16);  findsignal(data,signal,'MaxDistance',1e-14)

devuelve las coincidencias en orden ordenado de cercaníafindsignal

[iStart, iStop, distance] = findsignal(data,signal,'MaxDistance',1e-14); fprintf('iStart iStop  total squared distance\n')
iStart iStop  total squared distance 
fprintf('%4i %5i     %.7g\n',[iStart; iStop; distance])
  53    63     0   69    79     0   85    95     0    5    15     1.776357e-15   21    31     1.776357e-15   37    47     1.776357e-15 

Búsqueda de una trayectoria de señal compleja con un desplazamiento variable

Este siguiente ejemplo muestra cómo utilizar para encontrar una señal que rastree una trayectoria conocida.findsignal El archivo "cursiveex.mat" contiene una grabación de la posición x e y de la punta de un bolígrafo mientras trazaba la palabra "fosforescencia" en un pedazo de papel. Los datos x,y se codifican como los componentes reales e imaginarios de una señal compleja, respectivamente.

load cursiveex plot(data) xlabel('real') ylabel('imag')

El mismo escritor rastreó una letra "p" como una señal de plantilla.

plot(signal) title('signal') xlabel('real') ylabel('imag')

Puede encontrar la primera "p" en los datos con bastante facilidad utilizando .findsignal Esto se debe a que los valores de la señal se alinean bastante bien al principio de los datos.

findsignal(data,signal)

Sin embargo, la segunda "p" tiene dos características que dificultan la identificación:findsignal Tiene un desplazamiento significativo pero constante de la primera letra, y partes de la letra se dibujaron a una velocidad diferente a la señal de la plantilla.

Si está interesado en hacer coincidir la forma general de la letra, puede restar una media local con ventanas tanto de la señal como del elemento de datos. Esto le permite mitigar el efecto de los cambios constantes.

Para mitigar el efecto de las diferentes velocidades a las que se dibujan las letras, puede utilizar la deformación dinámica del tiempo, que estirará la señal o los datos a una base de tiempo común a medida que realiza la búsqueda:

findsignal(data,signal,'TimeAlignment','dtw', ...                'Normalization','center', ...                'NormalizationLength',600, ...                'MaxNumSegments',2)

Búsqueda de señales de alimentación estiradas en el tiempo

En el siguiente ejemplo se muestra cómo utilizar para buscar la ubicación de una palabra hablada en una frase.findsignal

El siguiente archivo contiene una grabación de audio de la frase: "Acelerar el ritmo de la ingeniería y la ciencia" y una grabación de audio separada de "ingeniería" hablada por el mismo orador.

load slogan soundsc(phrase,fs) soundsc(hotword,fs)

Es común que el mismo orador varíe la pronunciación de palabras habladas individuales en una oración o frase. El orador en este ejemplo pronunció "ingeniería" de dos maneras diferentes: El orador tardó aproximadamente 0,5 segundos en pronunciar la palabra en la frase, haciendo hincapié en la segunda sílaba ("en-GIN-eer-ing"); el mismo orador tardó 0,75 segundos en pronunciar la palabra de forma aislada, haciendo hincapié en la tercera sílaba ("en-gin-EER-ing").

Para compensar estas variaciones locales tanto en tiempo como en volumen, puede utilizar un espectrograma para informar de la distribución de potencia espectral a medida que evoluciona a lo largo del tiempo.

Para empezar, utilice un espectrograma con una resolución de frecuencia bastante gruesa. Esto se hace para desenfocar deliberadamente los pulsos glotales de banda estrecha del tracto vocal, dejando sólo las resonancias de banda más ancha de las cavidades oral y nasal sin perturbaciones. Esto le permite fijarse en las vocales habladas de una palabra. Las consonantes (especialmente plosivos y fricativos) son considerablemente más difíciles de identificar utilizando espectrogramas. El código siguiente calcula un espectrograma

Nwindow = 64; Nstride = 8; Beta = 64;  Noverlap = Nwindow - Nstride; [~,~,~,PxxPhrase] = spectrogram(phrase, kaiser(Nwindow,Beta), Noverlap); [~,~,~,PxxHotWord] = spectrogram(hotword, kaiser(Nwindow,Beta), Noverlap);

Ahora que tiene el espectrograma de la frase y la palabra de búsqueda, puede usar la deformación dinámica del tiempo para tener en cuenta las variaciones locales en la longitud de la palabra. Del mismo modo, puede explicar las variaciones de potencia mediante la normalización de potencia junto con la distancia simétrica de Kullback-Liebler.

[istart,istop] = findsignal(PxxPhrase, PxxHotWord, ...     'Normalization','power','TimeAlignment','dtw','Metric','symmkl')
istart = 1144 
istop = 1575 

Trazar y reproducir la palabra identificada.

findsignal(PxxPhrase, PxxHotWord, 'Normalization','power', ...     'TimeAlignment','dtw','Metric','symmkl')

soundsc(phrase(Nstride*istart-Nwindow/2 : Nstride*istop+Nwindow/2),fs)