【问题标题】:Why should I discard half of what a FFT returns?为什么我要丢弃 FFT 返回的一半?
【发布时间】:2015-10-18 05:09:23
【问题描述】:

看看这个答案: Python Scipy FFT wav files

技术部分很明显并且有效,但我有两个理论问题(提到的代码如下):

1) 为什么我必须标准化 (b=...) 帧?如果我使用原始数据会怎样?

2) 为什么我应该只使用 FFT 结果的一半 (d=...)?

3) 我为什么要abs(c) FFT 结果?

也许由于对 WAV 格式或 FFT 的理解不足,我遗漏了一些东西,但是虽然这段代码工作得很好,但我很高兴了解它为什么工作以及如何充分利用它。

编辑:回应@Trilarion 的评论:

我正在尝试编写一个简单的,不是 100% 准确但更像是 Python 中的概念验证Speaker Diarisation。这意味着获取一个 wav 文件(现在我正在使用 this one 进行测试)并在每一秒(或任何其他分辨率)中说明说话者是第 1 个人还是第 2 个人。我事先知道这是 2 个人,我不想将他们与任何已知的语音签名联系起来,只是为了分开。现在每秒对其进行 FFT(从而得到频率列表),并使用 KMeans 对它们进行聚类,聚类数在 2 到 4 之间(A, B [,Silence [,A+B]])。

我对分析 wav 文件和音频还是很陌生。

import matplotlib.pyplot as plt
from scipy.io import wavfile # get the api
fs, data = wavfile.read('test.wav') # load the data
a = data.T[0] # this is a two channel soundtrack, I get the first track
b=[(ele/2**8.)*2-1 for ele in a] # this is 8-bit track, b is now normalized on [-1,1)
c = sfft.fft(b) # create a list of complex number
d = len(c)/2  # you only need half of the fft list
plt.plot(abs(c[:(d-1)]),'r') 
plt.show()

【问题讨论】:

  • 对于初学者,您可以阅读this
  • 至于(2):看起来像原始答案削减了负频率项,只使用了正频率项。对于音频信号,这些应该是多余的。
  • 请提出一个真正的问题。为什么你应该做某事显然取决于你想要达到的目标。因为这个问题不清楚,因此除了你之外没有用。答案在解释傅立叶变换背后的知识方面非常慷慨,但他们永远无法回答您为什么要这样做。
  • @Trilarion 相反,这个问题归结为 FFT 本身的性质,对于第一次涉足它的任何人来说,答案都会非常有用。我唯一担心的是,它可能已经在网站的其他地方得到了回答。
  • @MarkRansom 当然 FFT 很有趣。但是这个问题不是很有帮助。至少现在我们知道提问者想要达到什么目的。语音显然是一个真正有价值的信号。我确信有一些变体可以计算实值信号的 FFT,您不必丢弃一半的输出,但从一开始就只计算一半的输出。简而言之,我更喜欢更清晰、更精确的问题。如果一个人想了解更多关于 FFT 的真实性质的信息,而不是确切地要求这一点。问得越好,答案和问题对每个人的帮助就越大。

标签: python fft wav


【解决方案1】:

按顺序解决:

1)您不需要规范化,但输入归一化接近数字化波形的原始结构,以便数字是不完整的。例如,值为67的大声?将其标准化为-1至1的范围更容易,以解释值。 (但如果您想要实现过滤器,例如,在您执行FFT的位置,修改了FFT值,然后修改了IFFT,归一化为不必要的麻烦。)

2)和3)与它们都必须与主要在复杂数字空间中的数学有关。也就是说,FFT将复数的波形(例如,[.5 + .1j,.4 + .7jj,.4 + .6j,...])到另一个复杂数字序列。

详细介绍:

2)事实证明,如果输入波形是真实的而不是复杂,则FFT具有约0的对称性,因此仅具有频率> = 0的值是唯一的兴趣。

3)FFT输出的值是复杂的,因此它们具有RE和IM部分,但这也可以表示为幅度和相位。对于音频信号,通常是最有趣的幅度,因为这主要是我们听到的。因此人们经常使用abs(这是幅度),但相位对不同的问题也很重要。

【讨论】:

    【解决方案2】:

    这取决于你想要做什么。看起来您只是想绘制光谱密度,然后就可以这样做了。

    一般来说,DFT 中的系数取决于每个频率的相位,因此如果要保留相位信息,则必须保留复数的参数。

    只有当输入是实数序列 (IIRC) 时,才能保证您看到的对称性。如果您的频率高于奈奎斯特频率(采样频率的一半),则会出现镜像失真,原始频率会显示在 DFT 中,但镜像频率也会出现。

    如果要逆 DFT,则应保留完整数据并保留 DFT 系数的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-27
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 2021-08-23
      • 2019-07-18
      相关资源
      最近更新 更多