差分黑白光谱熵和平坦度测量

信息处理 频谱
2022-02-06 11:03:39

光谱熵光谱平坦度有什么区别据我了解,这两个术语都可以从功率(或安培)光谱中计算出来,并描述光谱的平坦度(白度)。

如果您想使用这两种方法中的任何一种来区分浊音活动和清音活动,您会使用哪一种,为什么?

1个回答

假设您根据我添加到问题的第一个链接计算功率谱熵:

PSE=i=1Npilnpi

那么光谱平坦度(使用相同的符号)将是

Flatness=exp(1Ni=1Nlnpi)
因为被归一化为单位和,所以第二个与问题相关的是一个。pi

正如您所看到的,两者在形式上相似,只是 Flatness 出现在 a) 取幂和 b) 假设是均匀的。pi

至于使用哪一个,我可能会选择 PSE 而不是 Flatness。它似乎更多地利用了光谱信息。


为了测试我的理论,我编写了一个比较,从纯谐波信号开始,到纯白噪声信号,并计算每个混合的两个测量值。

从底部图中红色和蓝色曲线的接近程度可以看出,这两种度量之间的差异很小。

请注意,我已经对两条曲线进行了归一化,因此它们介于 0 和 1 之间,只是为了更容易比较它们。

底线:选择最简单的;对于此示例,两者之间似乎几乎没有区别。

在此处输入图像描述


下面的R代码

#30534
T <- 1000
white_noise <- rnorm(T,0,1)

K <- array(seq(1,5),c(5,1)) %*% array(1,c(1,T))
omega <- 2*pi*0.053492384
t <- array(seq(0,T-1), dim=c(1,T))
t <- array(1,c(5,1)) %*% t
harmonic <- colSums(sin(omega*K*t))

spectral_entropy <- function(signal)
{
  psd <- abs(fft(signal))^2
  psd <- psd/sum(psd)

  pse <- 0
  for (ix in seq(1,length(psd)))
  {
    pse <- pse - psd[ix]*log(psd[ix])
  }

  return(pse)
}

flatness <- function(signal)
{
  psd <- abs(fft(signal))^2
  psd <- psd/sum(psd)

  flatness <- 0
  for (ix in seq(1,length(psd)))
  {
    flatness <- flatness + log(psd[ix])/length(psd)
  }
  return (exp(flatness))
}


P <- 100
pse <- rep(0,P)
flt <- rep(0,P)
for (alpha in seq(0,P))
{
  signal <- white_noise*(alpha/P) + (1-alpha/P)*harmonic
  pse[alpha+1] <- spectral_entropy(signal)
  flt[alpha+1] <- flatness(signal)
}

normalize <- function(signal)
{
 return( (signal - min(signal))/(max(signal) - min(signal)))
}

layout(matrix(c(1,2,3,3), 2, 2, byrow = TRUE))
plot(abs(fft(harmonic)), type="l", col="blue")
title("Harmonic Spectrum")
plot(abs(fft(white_noise)), type="l", col="blue")
title("White Noise Spectrum")

plot(seq(0,P)/P, normalize(pse), type="l", col="blue")
lines(seq(0,P)/P, normalize(flt), type="l", col="red")
title('Comparison of PSE vs Flatness')