Calcolo dell'entropia spettrale in MATLAB


9

Come posso calcolare l'entropia spettrale di un segnale in MATLAB? Conosco i passaggi di base ma sarebbe bello se qualcuno potesse aiutare,

  1. Calcola lo spettro di potenza del segnale usando il comando FFT in MATLAB.
  2. Calcola la densità spettrale di potenza usando lo spettro di potenza o usando qualsiasi altra tecnica.
  3. Normalizza la densità spettrale di potenza tra , in modo che possa essere trattata come una funzione di densità di probabilità .[0,1]pi
  4. Calcola l'EntropiaH(s)=pilog2(pi)

Per quanto riguarda il codice Matlab, prova a chiedere qui dsprelated.com/code.php
user13107

È la stessa cosa della piattezza spettrale o dell'entropia di Wiener? dsp.stackexchange.com/q/2045/29
endolith

Risposte:


9

Tecnicamente questo non è un forum di MATLAB, ma posso spiegare i passaggi in modo più dettagliato per te: supponi che il tuo segnale di input sia e che il suo DFT sia . Per segnali reali puoi usare il DFT unilaterale, poiché l'altra metà sarebbe ridondante quando guardi la sua densità spettrale di potenza. (PSD).x[n]X(f)

Una volta calcolato il DFT del segnale, il PSD è semplicemente . Cioè, è necessario prendere la grandezza assoluta del risultato DFT, al quadrato.|X(f)|2

Ora è necessario normalizzare il PSD in modo che possa essere visualizzato come una funzione di densità di probabilità (PDF). Pertanto, un PSD normalizzato, (chiamiamolo ) sarà semplicemente:PSDn

PSDn(f)=PSD(f)f=fs2f=fs2PSD(f)

Infine, la tua entropia spettrale sarà:

E=f=fs2f=fs2PSDn(f)log2[PSDn(f)]

5

Faccio solo qui

Il mio codice sorgente:

    [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

Questo codice sorgente esegue il calcolo dell'entropia spettrale da ogni blocco con cornice ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.