如何从 FFT 计算光谱平坦度?

信息处理 fft 频谱 功率谱密度
2022-01-02 01:35:48

好的,光谱平坦度(也称为维纳熵)定义为光谱的几何平均值与其算术平均值的比率。

维基百科和其他参考资料说功率谱。这不是傅里叶变换的平方吗?FFT 产生一个“幅度谱”,然后您将其平方以获得“功率谱”?

基本上我想知道的是,如果spectrum = abs(fft(signal))这些是正确的?

  • spectral_flatness = gmean(spectrum)/mean(spectrum)
  • spectral_flatness = gmean(spectrum^2)/mean(spectrum^2)

维基百科的定义似乎直接使用了幅度:

Flatness=n=0N1x(n)Nn=0N1x(n)N=exp(1Nn=0N1lnx(n))1Nn=0N1x(n)
其中表示bin 编号的大小。x(n)n

SciPy 文档将功率谱定义为:

当输入 a 是时域信号时A = fft(a)np.abs(A)是其幅度谱,np.abs(A)**2是其功率谱。

该来源同意“功率谱”的定义,并将其称为Sf(ω)

我们可以定义是周期 T 中信号的傅里叶变换,并定义功率谱如下: FT(ω)Sf(ω)=limT1TFT(ω)2.

该来源根据S(f)定义维纳熵S(f)

但我没有看到像这样的方程中的平方,这似乎是基于幅度谱

Sflatness=exp(1Nklog(ak))1Nkak

同样,另一个来源根据功率谱定义频谱平坦度,但随后直接使用 FFT 箱的幅度,这似乎与上述“功率谱”定义相冲突。

“功率谱”对不同的人意味着不同的东西吗?

4个回答

如果平坦度的定义要求您使用功率谱,那么是的,您应该将幅度平方,如 SciPy 文档中的参考所示。在您没有看到平方的地方引用的等式中,我认为您无法阅读太多内容。它说

Sflatness=exp(1Nklog(ak))1Nkak

但我在任何地方都没有看到的定义。如果您希望频谱与每个 bin 中的功率成正比,则需要平方。ak

定义各不相同,不是吗?首先要解决的是我们是否同意功率谱密度等于功率谱,或者定义我们所说的两者的意思。Proakis 和 Salehi将它们作为同义词使用继续前进,我认为差异是由于对具有功率谱的信号的不同定义造成的。通常的定义是傅里叶变换数据的幅度平方Wiener-Khinchin 定理通过自相关的傅里​​叶变换为 WSS 信号的功率谱提供了另一种途径。根据您是否用正方形定义功率谱,您会在频谱平坦度中得到一个正方形。

其他人使用傅里叶变换的幅度有人称其为“功率谱”,并将“功率谱密度”的名称保留为“功率谱”的导数,而其他人将术语“功率谱”保留为自相关的傅里​​叶变换的积分(其他人称之为功率谱)。如您所见,定义比比皆是。随意发明你自己的 :) 或坚持 Wiener-Khinchin 标准。

相关问题功率谱密度、谱功率和功率比之间的区别?

我能想到的最权威的参考资料来自 Jayant & Noll, Digital Coding Of Waveforms , (c) Bell Telephone Laboratories, Incorporated 1984, 由 P​​rentice-Hall, Inc. 出版。

在第 57 页,他们定义了光谱平坦度:

光谱平坦度

并且,以前,在第 55 页上,他们定义了Sxx

功率谱的定义

所以 FFT 平方版本是您想要的版本。

它看起来像Makhoul & Wolf,Linear Prediction and the Spectral Analysis of Speech,Bolt,Beranek 和 Newman, Inc. 技术报告,1972 年。

它具有相同的定义:

在此处输入图像描述

在此处输入图像描述

这是一个很好的问题,我自己也想知道。光谱平坦度(也称为 Weiner Entropy)只是衡量向量“峰度”的一种方式。

来源似乎表明正在考虑的矢量是功率谱密度,在这种情况下您必须平方。如果你对幅度谱进行平方,你会在你没有明显平方的情况下突出峰值,我认为这也更直观。