2012-01-03 10 views
39

Soy nuevo en MATLAB y estoy tratando de construir un sistema de transformación de voz con MATLAB.¿Cómo normalizar una señal a media cero y varianza unitaria?

Así que me gustaría saber cómo normalizar una señal a la media cero y la unidad de varianza con MATLAB?

+0

posible duplicado de [normalizar archivo estera en Matlab] (http://stackoverflow.com/questions/7729880/normalize-mat-file-in-matlab) – Jonas

Respuesta

64

si su señal está en la matriz X, que hacen de media cero mediante la eliminación de la media:

X=X-mean(X(:)); 

y varianza unitaria dividiendo por la desviación estándar:

X=X/std(X(:)); 
+2

una observación/pregunta @Oli, en su código , en realidad está calculando el 'std' de los datos alineados/de media cero (x-mu), es decir:' std (x-mu) ', pero debería ser:' std (x) ', ¿no? – Tin

+11

\ forall escalar a, std (x) == std (x + a) – Oli

6

Puede determinar la media de la señal y simplemente restar ese valor de todas las entradas. Eso te dará un resultado medio cero.

Para obtener la varianza de la unidad, determine la desviación estándar de la señal y divida todas las entradas por ese valor.

4

Parece como si estuvieras esencialmente buscando calcular el z-score o puntuación estándar de tus datos, que se calcula mediante la fórmula: z = (x-mean (x))/std (x)

Esto debería funcionar:

%% Original data (Normal with mean 1 and standard deviation 2) 
x = 1 + 2*randn(100,1); 
mean(x) 
var(x) 
std(x) 

%% Normalized data with mean 0 and variance 1 
z = (x-mean(x))/std(x); 
mean(z) 
var(z) 
std(z) 
10

Si usted tiene la caja de herramientas estadísticas, entonces se puede calcular

Z = zscore(S); 
0

Para evitar la división por cero!

function x = normalize(x, eps) 
    % Normalize vector `x` (zero mean, unit variance) 

    % default values 
    if (~exist('eps', 'var')) 
     eps = 1e-6; 
    end 

    mu = mean(x(:)); 

    sigma = std(x(:)); 
    if sigma < eps 
     sigma = 1; 
    end 

    x = (x - mu)/sigma; 
end