¿Cómo funciona este código de Matlab?

2

Encontré este código de Matlab sin comentarios, excepto el encabezado:

*************************************
function y=movingvar(X,N)
% y=movingvar(X,N)
% Calculates N-point moving variance of Vector X
% Highly recommend that N be odd (no error checking)
% Note: first and last N/2 points will be unreliable.
% Output will be a column vector.
% Authors: Scott Seidman ([email protected]) 1/23/99

X=X(:);
XSQR=X.*X;
convsig=ones(1,N);
y=(conv(convsig,XSQR)-(conv(convsig,X).^2)/N)/(N-1);

y=y(ceil(N/2):length(X)+floor(N/2));
****************************************************

(de enlace )

De acuerdo con los comentarios aquí, también se puede utilizar como una calculadora de RMS en tiempo real: enlace

Puedo ver que es útil, pero no entiendo a Matlab. ¿Podría alguien explicar qué está pasando?

Estoy familiarizado académicamente con la convolución, y conozco a C.

    
pregunta AaronD

1 respuesta

1

Comenzando con la fórmula para la varianza de la muestra $$ s ^ {2} = \ frac {\ sum_ {i = 1} ^ {N} \ left (X_ {i} - \ bar {X} \ right) ^ 2} {N-1} $$

se multiplica para obtener $$ s ^ {2} = \ frac {\ sum_ {i = 1} ^ {N} \ left ({X_i} ^ 2-2X_i \ bar {X} + \ bar {X} ^ 2 \ derecha)} {N-1} $$

Distribuye las sumas. Usando el hecho de que \ $ \ bar {X} \ $ es una constante, entonces $$ \ sum 2X_i \ bar {X} = 2 \ bar {X} \ sum {X_i}, $$ y $$ \ sum {X_i } = N \ bar {X}, $$

Entonces, $$ 2 \ bar {X} \ sum {X_i} = 2N \ bar {X} ^ 2. $$

Luego, usando $$ \ sum_ {i = 1} ^ {N} \ bar {X} ^ 2 = N \ bar {X} ^ 2, $$ y $$ N \ bar {X} ^ 2 = \ frac {N \ left (\ sum {X} \ right) ^ 2} {N ^ 2} $$

la ecuación general para varancia se reduce a una fórmula computacional conveniente para varianza: $$ \ frac {\ sum_ {i-1} ^ {N} \ left (X_ {i} ^ 2 \ right) - \ frac {\ left (\ sum_ {i = 1} ^ {N} X_i \ right) ^ 2} {N}} {N-1} $$

XSQR = X. * X; \ Simplemente elemento por elemento ajusta la matriz de columnas, X

Sin explicar por completo la convolución, la convolución con una cadena de longitud N (es decir, convsig) es simplemente una suma de los N puntos anteriores en cada paso de tiempo.

La última línea del código simplemente elimina la basura en cualquiera de los extremos de la matriz asociada con el principio y el final de la convolución.

Por último, debe comprender que la mayoría de las operaciones en arreglos en Matlab operan en todo el arreglo al mismo tiempo: la mayoría de las operaciones en el programa que usted muestra, absolutamente necesitan recorrer cada elemento del arreglo en un idioma. como C, que probablemente sea muy confuso para las personas que no están acostumbradas a trabajar en Matlab.

La conclusión es que no es muy diferente a la implementación real de la suma, pero la convolución es algo que se escribe directamente en matlab, y generalmente hay bibliotecas que manejan la convolución directamente en los DSP, por lo que es una forma conveniente de implementar un filtro de varianza móvil sin Necesito hacer el trabajo duro.

    
respondido por el Scott Seidman

Lea otras preguntas en las etiquetas