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.

Encontrar una señal en los datos

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

Encontrar coincidencias exactas

Cuando desea encontrar coincidencias de una señal, puede utilizar para realizar la coincidencia.numerically exactstrfind

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 donde la señal existe 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.strfindnumerically exact Sin embargo, este enfoque falla cuando puede haber errores debido al ruido de cuantización u otros artefactos en la señal.

Por ejemplo, si tiene un SineWave:

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

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

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

no puede ubicar la sinusoide en los datos que empiezan 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, usted puede utilizar, que por abandono barre la señal a través de los datos y computa 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 producir 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 las coincidencias más cercanas 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 coincidencias ordenadas por orden 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])
  37    47     0   69    79     0   85    95     0    5    15     1.776357e-15   21    31     1.776357e-15   53    63     1.776357e-15 

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

El siguiente ejemplo muestra cómo utilizar para encontrar una señal que traza una trayectoria conocida.findsignal El archivo "cursiveex. MAT" contiene una grabación de la posición x e y de la punta de una pluma, ya que trazó la palabra "fosforescencia" en una hoja 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 trazó 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.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 de:findsignal Tiene un desplazamiento significativo pero constante de la primera letra, y partes de la letra fueron dibujadas a una velocidad diferente de la señal de la plantilla.

Si usted está interesado en sólo hacer coincidir la forma general de la letra, puede restar una media local de ventana de la señal y el elemento de datos. Esto le permite mitigar el efecto de los turnos constantes.

Para mitigar el efecto de las velocidades variables 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 mientras realiza la búsqueda:

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

Encontrar señales de potencia estiradas por tiempo

En el siguiente ejemplo se muestra cómo usar 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: "Acelerando 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 las palabras habladas individualmente en una frase o frase. El orador en este ejemplo pronuncia "ingeniería" de dos maneras diferentes: El orador tardó aproximadamente 0,5 segundos en pronunciar la palabra en la frase, subrayando la segunda síable ("en-GIN-EER-Ing"); el mismo orador tardó 0,75 segundos en pronunciar la palabra aisladamente, subrayando la tercera Síla ("en-Gin-EER-Ing").

Para compensar estas variaciones locales tanto en el tiempo como en el volumen, puede utilizar un espectrograma para notificar 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 difuminar deliberadamente los pulsos glotales de banda estrecha del tracto vocal, dejando sólo las resonancias de banda ancha de las cavidades orales y nasales sin perturbaciones. Esto le permite fijar en las vocales habladas de una palabra. Las consonantes (especialmente los plosivos y los fricatives) son considerablemente más difíciles de identificar mediante 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 tener en cuenta las variaciones en el poder mediante la normalización de potencia en conjunción con la distancia de Kullback-Liebler simétrica.

[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)