Расчет спектральной энтропии в MATLAB

9

Как рассчитать спектральную энтропию сигнала в MATLAB? Я знаю основные шаги, но было бы хорошо, если кто-то может помочь,

  1. Рассчитайте спектр мощности сигнала, используя команду FFT в MATLAB.
  2. Рассчитайте спектральную плотность мощности, используя спектр мощности или используя любой другой метод.
  3. Нормализовать спектральную плотность мощности между , чтобы ее можно было рассматривать как функцию плотности вероятности p i .[0,1]пя
  4. Вычислить энтропию ЧАС(s)знак равно-Σпяжурнал2(пя)
RRelan
источник
Что касается кода Matlab, попробуйте спросить здесь dsprelated.com/code.php
user13107
Это то же самое, что спектральная плоскость или энтропия Винера? dsp.stackexchange.com/q/2045/29
эндолиты

Ответы:

9

Икс[N]Икс(е) . Для реальных сигналов вы можете использовать односторонний ДПФ, поскольку другая половина будет избыточной, если вы посмотрите на ее спектральную плотность мощности. (PSD).

|Икс(е)|2

пSDN

пSDN(е)знак равнопSD(е)Σезнак равно-еs2езнак равноеs2пSD(е)

Наконец, ваша спектральная энтропия будет:

Езнак равно-Σезнак равно-еs2езнак равноеs2пSDN(е)Lог2[пSDN(е)]
Тарин Зияе
источник
5

Я просто делаю здесь

Мой исходный код:

    [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

Этот исходный код выполняет вычисление спектральной энтропии для каждого блока в кадре ...

ederwander
источник