Contenido principal

medfreq

Frecuencia mediana

Descripción

freq = medfreq(x) estima la frecuencia mediana normalizada freq del espectro de potencia de una señal en el dominio de tiempo x. Para calcular el espectro de potencia, medfreq utiliza la función periodogram con una ventana rectangular y un número de puntos de la DFT igual a la longitud de x.

ejemplo

freq = medfreq(x,fs) estima la frecuencia mediana en función de la tasa de muestreo fs.

ejemplo

freq = medfreq(pxx,f) devuelve la frecuencia mediana de una estimación de densidad espectral de potencia (PSD) pxx. Las frecuencias f se corresponden con las estimaciones en pxx.

ejemplo

freq = medfreq(sxx,f,rbw) devuelve la frecuencia mediana de una estimación del espectro de potencia sxx con un ancho de banda de resolución rbw.

freq = medfreq(___,freqrange) especifica el rango de frecuencias sobre el que se calcula la frecuencia mediana. Esta sintaxis puede incluir cualquier combinación de argumentos de entrada de las sintaxis anteriores, siempre que el segundo argumento de entrada sea fs o f. Si la segunda entrada se pasa como vacía, medfreq asume una frecuencia normalizada. El valor predeterminado de freqrange es todo el ancho de banda de la señal de entrada.

ejemplo

[freq,power] = medfreq(___) también devuelve la potencia de banda power del espectro. Si se especifica freqrange, power contiene la potencia de banda dentro de freqrange.

ejemplo

medfreq(___) sin argumentos de salida representa la PSD o el espectro de potencia y anota la frecuencia mediana.

ejemplo

Ejemplos

contraer todo

Genere 1024 muestras de un chirp muestreado a 1024 kHz. Especifique el chirp de modo que presente una frecuencia inicial de 50 kHz y alcance los 100 kHz al finalizar el muestreo. Añada ruido blanco gaussiano hasta que la relación señal-ruido sea de 40 dB. Reinicie el generador de números aleatorios para obtener resultados reproducibles.

nSamp = 1024;
Fs = 1024e3;
SNR = 40;
rng default

t = (0:nSamp-1)'/Fs;

x = chirp(t,50e3,nSamp/Fs,100e3);
x = x+randn(size(x))*std(x)/db2mag(SNR);

Estime la frecuencia mediana del chirp. Represente la densidad espectral de potencia (PSD) y anote la frecuencia mediana.

medfreq(x,Fs)

Figure contains an axes object. The axes object with title Median Frequency Estimate: 74.998 kHz, xlabel Frequency (kHz), ylabel Power/frequency (dB/Hz) contains 2 objects of type line.

ans = 
7.4998e+04

Genere otro chirp. Especifique una frecuencia inicial de 200 kHz, una frecuencia final de 300 kHz y una amplitud que sea el doble que la de la primera señal. Añada ruido blanco gaussiano.

x2 = 2*chirp(t,200e3,nSamp/Fs,300e3);
x2 = x2+randn(size(x2))*std(x2)/db2mag(SNR);

Concatene los chirps para producir una señal de dos canales. Calcule la frecuencia mediana de cada canal.

y = medfreq([x x2],Fs)
y = 1×2
105 ×

    0.7500    2.4999

Represente las PSD de los dos canales y anote sus frecuencias medianas.

medfreq([x x2],Fs);

Figure contains an axes object. The axes object with title Median Frequency Estimate, xlabel Frequency (kHz), ylabel Power/frequency (dB/Hz) contains 4 objects of type line.

Añada los dos canales para formar una nueva señal. Represente la PSD y anote la frecuencia mediana.

medfreq(x+x2,Fs)

Figure contains an axes object. The axes object with title Median Frequency Estimate: 237.563 kHz, xlabel Frequency (kHz), ylabel Power/frequency (dB/Hz) contains 2 objects of type line.

ans = 
2.3756e+05

Genere 1024 muestras de una sinusoide de 100,123 kHz muestreada a 1024 kHz. Añada ruido blanco gaussiano hasta que la relación señal-ruido sea de 40 dB. Reinicie el generador de números aleatorios para obtener resultados reproducibles.

nSamp = 1024;
Fs = 1024e3;
SNR = 40;
rng default

t = (0:nSamp-1)'/Fs;

x = sin(2*pi*t*100.123e3);
x = x + randn(size(x))*std(x)/db2mag(SNR);

Utilice la función periodogram para calcular la densidad espectral de potencia (PSD) de la señal. Especifique una ventana de Kaiser con la misma longitud que la señal y un factor de forma de 38. Estime la frecuencia mediana de la señal y anótela en una gráfica de la PSD.

[Pxx,f] = periodogram(x,kaiser(nSamp,38),[],Fs);

medfreq(Pxx,f);

Figure contains an axes object. The axes object with title Median Frequency Estimate: 100.117 kHz, xlabel Frequency (kHz), ylabel Power/frequency (dB/Hz) contains 2 objects of type line.

Genere otra sinusoide, esta vez con una frecuencia de 257,321 kHz y que tenga el doble de amplitud que la primera. Añada ruido blanco.

x2 = 2*sin(2*pi*t*257.321e3);
x2 = x2 + randn(size(x2))*std(x2)/db2mag(SNR);

Concatene las sinusoides para producir una señal de dos canales. Estime la PSD de cada canal y utilice el resultado para determinar la frecuencia mediana.

[Pyy,f] = periodogram([x x2],kaiser(nSamp,38),[],Fs);

y = medfreq(Pyy,f)
y = 1×2
105 ×

    1.0012    2.5731

Anote las frecuencias medianas de los dos canales en una gráfica de las PSD.

medfreq(Pyy,f);

Figure contains an axes object. The axes object with title Median Frequency Estimate, xlabel Frequency (kHz), ylabel Power/frequency (dB/Hz) contains 4 objects of type line.

Añada los dos canales para formar una nueva señal. Estime la PSD y anote la frecuencia mediana.

[Pzz,f] = periodogram(x+x2,kaiser(nSamp,38),[],Fs);

medfreq(Pzz,f);

Figure contains an axes object. The axes object with title Median Frequency Estimate: 256.859 kHz, xlabel Frequency (kHz), ylabel Power/frequency (dB/Hz) contains 2 objects of type line.

Genere una señal cuya PSD se asemeje a la respuesta en frecuencia de un filtro FIR paso banda de 88.º orden con frecuencias de corte normalizadas de 0.25π rad/muestra y de 0.45π rad/muestra.

d = fir1(88,[0.25 0.45]);

Calcule la frecuencia mediana de la señal entre 0.3π rad/muestra y 0.6π rad/muestra. Represente la PSD y anote la frecuencia mediana y el intervalo de medición.

medfreq(d,[],[0.3 0.6]*pi);

Figure contains an axes object. The axes object with title Median Frequency Estimate: blank 0 . 371 blank times blank pi blank rad/sample, xlabel Normalized Frequency ( times pi blank mrad/sample), ylabel Power/frequency (dB/(rad/sample)) contains 4 objects of type line, patch.

Obtenga como salida la frecuencia mediana y la potencia de banda del intervalo de medición. Especificar una tasa de muestreo de 2π equivale a dejar la tasa sin ajustar.

[mdf,power] = medfreq(d,2*pi,[0.3 0.6]*pi);

fprintf('Mean = %.3f*pi, power = %.1f%% of total \n', ...
    mdf/pi,power/bandpower(d)*100)
Mean = 0.371*pi, power = 77.4% of total 

Añada un segundo canal con frecuencias de corte normalizadas de 0.5π rad/muestra y de 0.8π rad/muestra y con una amplitud que sea la décima parte de la del primer canal.

d = [d;fir1(88,[0.5 0.8])/10]';

Calcule la frecuencia mediana de la señal entre 0.3π rad/muestra y 0.9π rad/muestra. Represente la PSD y anote la frecuencia mediana de cada canal y el intervalo de medición.

medfreq(d,[],[0.3 0.9]*pi);

Figure contains an axes object. The axes object with title Median Frequency Estimate, xlabel Normalized Frequency ( times pi blank mrad/sample), ylabel Power/frequency (dB/(rad/sample)) contains 6 objects of type line, patch.

Obtenga como salida la frecuencia mediana de cada canal. Divídala por π.

mdf = medfreq(d,[],[0.3 0.9]*pi)/pi
mdf = 1×2

    0.3706    0.6500

Argumentos de entrada

contraer todo

Señal de entrada, especificada como vector o matriz. Si x es un vector, se trata como un solo canal. Si x es una matriz, entonces medfreq calcula la frecuencia mediana de cada columna de x independientemente. x debe ser un valor finito.

Ejemplo: cos(pi/4*(0:159))+randn(1,160) es una señal de vector fila monocanal.

Ejemplo: cos(pi./[4;2]*(0:159))'+randn(160,2) es una señal de dos canales.

Tipos de datos: single | double

Tasa de muestreo, especificada como un escalar real positivo. La tasa de muestreo es el número de muestras por unidad de tiempo. Si el tiempo se mide en segundos, la tasa de muestreo está en hercios.

Tipos de datos: single | double

Densidad espectral de potencia (PSD), especificada como vector o matriz. Si pxx es una matriz, entonces medfreq calcula la frecuencia mediana de cada columna de pxx independientemente.

La densidad espectral de potencia debe expresarse en unidades lineales, no en decibelios. Utilice db2pow para convertir los valores de decibelios en valores de potencia.

Ejemplo: [pxx,f] = periodogram(cos(pi./[4;2]*(0:159))'+randn(160,2)) especifica la estimación del periodograma PSD de una sinusoide ruidosa de dos canales muestreada a 2π Hz y las frecuencias a las que se calcula.

Tipos de datos: single | double

Frecuencias, especificadas como vector.

Tipos de datos: single | double

Estimación del espectro de potencia, especificada como vector o matriz. Si sxx es una matriz, entonces medfreq calcula la frecuencia mediana de cada columna de sxx independientemente.

El espectro de potencia debe expresarse en unidades lineales, no en decibelios. Utilice db2pow para convertir los valores de decibelios en valores de potencia.

Ejemplo: [sxx,w] = periodogram(cos(pi./[4;2]*(0:159))'+randn(160,2),"power") especifica la estimación del espectro de potencia del periodograma de una sinusoide de dos canales integrada en ruido blanco gaussiano y las frecuencias normalizadas a las que se calcula.

Tipos de datos: single | double

Ancho de banda de la resolución, especificado como un escalar positivo. El ancho de banda de la resolución es el producto de dos valores: la resolución de frecuencia de la transformada discreta de Fourier y el ancho de banda de ruido equivalente de la ventana utilizada para calcular la PSD.

Tipos de datos: single | double

Rango de frecuencia, especificado como vector de dos elementos de valores reales. Si no se especifica freqrange, medfreq utiliza todo el ancho de banda de la señal de entrada.

Tipos de datos: single | double

Argumentos de salida

contraer todo

Frecuencia mediana, especificada como un escalar o vector.

  • Si se especifica una tasa de muestreo, freq tiene las mismas unidades que fs.

  • Si no se especifica una tasa de muestreo, freq tiene unidades de rad/muestra.

Potencia de banda, devuelta como un escalar o un vector.

Algoritmos

Para determinar la frecuencia mediana, medfreq calcula una estimación del espectro de potencia del periodograma utilizando una ventana rectangular.

Puede obtener el mismo valor de frecuencia mediana, medFrq, a partir de una señal x con una tasa de muestreo fs de estas tres maneras.

Directamente desde la señal
medFrq = medfreq(x,fs)
A partir del periodograma de la señal
[P,F] = periodogram(x,[],[],fs);
medFrq = medfreq(P,F)
A partir de la estimación espectral de potencia (PSD de Welch) de la señal
[P,F] = pwelch(x,rectwin(length(x)),[],[],fs);
medFrq = medfreq(P,F)

Nota

Dado que medfreq utiliza una representación intermedia para transformar la señal de entrada del dominio del tiempo al dominio de la frecuencia, la frecuencia mediana devuelta podría variar, dependiendo del método de transformación de la señal, el número de puntos DFT y el tamaño de la ventana.

Referencias

[1] Phinyomark, Angkoon, Sirinee Thongpanja, Huosheng Hu, Pornchai Phukpattaranont, and Chusak Limsakul. "The Usefulness of Mean and Median Frequencies in Electromyography Analysis." In Computational Intelligence in Electromyography Analysis – A Perspective on Current Applications and Future Challenges, edited by Ganesh R. Naik. London: IntechOpen, 2012. https://doi.org/10.5772/50639.

Capacidades ampliadas

expandir todo

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Historial de versiones

Introducido en R2015a

expandir todo

Consulte también

| | | |