MATLAB 中的谱熵计算

信息处理 功率谱密度
2021-12-21 14:54:16

如何在 MATLAB 中计算信号的谱熵?我知道基本步骤,但如果有人可以提供帮助,那就太好了,

  1. 在 MATLAB 中使用 FFT 命令计算信号的功率谱。
  2. 使用功率谱或任何其他技术计算功率谱密度。
  3. 之间的功率谱密度归一化,以便可以将其视为概率密度函数[0,1]pi
  4. 计算熵H(s)=pilog2(pi)
2个回答

从技术上讲,这不是一个 MATLAB 式的论坛,但我可以为您更详细地解释这些步骤:假设您的输入信号是,它的 DFT 是对于真实信号,您可以使用一侧的 DFT,因为当您查看其功率谱密度时,另一半将是多余的。(PSD)。x[n]X(f)

计算信号的 DFT 后,PSD 就是也就是说,您需要将 DFT 结果的绝对幅度取平方。|X(f)|2

您现在需要对 PSD 进行归一化,以便将其视为概率密度函数 (PDF)。因此,归一化的 PSD(让我们称之为)将简单地为:PSDn

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

最后,您的谱熵将是:

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

我只是在这里

我的源代码:

    [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

此源代码从每个帧块进行光谱熵计算...