【发布时间】: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 的真实性质的信息,而不是确切地要求这一点。问得越好,答案和问题对每个人的帮助就越大。