Cálculo de entropía espectral en MATLAB

9

¿Cómo calculo la entropía espectral de una señal en MATLAB? Conozco los pasos básicos, pero sería bueno si alguien puede ayudar,

  1. Calcule el espectro de potencia de la señal utilizando el comando FFT en MATLAB.
  2. Calcule la densidad espectral de potencia utilizando el espectro de potencia o cualquier otra técnica.
  3. Normalice la densidad espectral de potencia entre , de modo que pueda tratarse como una función de densidad de probabilidad .[0 0,1]pagsyo
  4. Calcule la entropíaH(s)=pilog2(pi)
RRelan
fuente
En cuanto al código de Matlab, intente preguntar aquí dsprelated.com/code.php
user13107
¿Es esto lo mismo que la planitud espectral o la entropía de Wiener? dsp.stackexchange.com/q/2045/29
endolith el

Respuestas:

9

Técnicamente, este no es un foro de MATLAB, pero puedo explicarle los pasos con más detalle: suponga que su señal de entrada es , y su DFT es X ( f ) . Para señales reales, puede usar el DFT unilateral, ya que la otra mitad sería redundante si observa su densidad espectral de potencia. (PSD)X[norte]X(F)

Una vez que calcula el DFT de su señal, el PSD es simplemente . Es decir, debe tomar la magnitud absoluta de su resultado DFT, al cuadrado.El |X(F)El |2

Ahora debe normalizar el PSD de modo que pueda verse como una función de densidad de probabilidad (PDF). Por lo tanto, una PSD normalizada, (llamémosla ) simplemente será:PAGSSrenorte

PAGSSrenorte(F)=PAGSSre(F)F=-Fs2F=Fs2PAGSSre(F)

Finalmente, su entropía espectral será:

mi=-F=-Fs2F=Fs2PAGSSrenorte(F)losol2[PAGSSrenorte(F)]
Tarin Ziyaee
fuente
5

Acabo de hacer aquí

Mi código fuente:

    [x, Fs, nbits] = wavread('ederwander.wav'); 


    winSize = 2048;

    n_samples = length(x);


    %50% overlap or 0 to not use overlap
    OverlapStep = 50;

    if OverlapStep > 0

        Overlap = floor((OverlapStep*winSize) / 100); 
        nFrames=floor(n_samples/Overlap)-1; 
    else
        Overlap= winSize;
        nFrames=floor(n_samples/Overlap)-1;
    end

    Entropy = zeros(nFrames,1);

    k=1;
    inc=1;

    while ( (k+winSize-1) <= n_samples )

        FrameSignal = x(k:k+winSize-1);

        v = FrameSignal .* hann(length(FrameSignal));           

        N = length(v);

        Y=fft(v);

        % Compute the Power Spectrum
        sqrtPyy = ((sqrt(abs(Y).*abs(Y)) * 2 )/N);
        sqrtPyy = sqrtPyy(1:winSize/2);



       %Normalization
       d=sqrtPyy(:);
       d=d/sum(d+ 1e-12);

       %Entropy Calculation
       logd = log2(d + 1e-12);
       Entropy(inc) = -sum(d.*logd)/log2(length(d));


       k=k+Overlap;
       inc=inc+1;
end

Este código fuente hace el cálculo de la entropía espectral de cada bloque enmarcado ...

ederwander
fuente