为什么我要舍弃FFT返回结果的一半?

11

查看此答案:Python Scipy FFT wav files

技术部分显而易见且有效,但我有两个理论问题(下面提到的代码):

1)为什么要对帧进行归一化(b = ...)?如果使用原始数据会发生什么?

2)为仅应使用FFT结果的一半(d = ...)?

3)为什么应该使FFT结果 abs(c)

也许由于不足的WAV格式或FFT的了解,我可能会错过一些东西,但是虽然这段代码完全正常工作,但我很高兴了解它为什么起作用以及如何最好地利用它。

编辑:响应@Trilarion的评论:

我试图编写一个简单的,不是100%准确但更像是概念证明说话人分离程序,使用Python。这意味着获取一个wav文件(目前我正在使用此文件 进行测试),并在每秒钟(或任何其他分辨率)中判断说话人是第一人还是第二人。我预先知道这些是2个人,而且我不试图将它们链接到任何已知的语音签名,只是为了分离。现在取每秒,FFT它(从而获得频率列表),并使用KMeans对它们进行聚类,聚类数介于2和4之间(A,B [,静音[,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()

1
首先,您可以阅读这个 - mkrieger1
1
关于(2):看起来原始答案截断了负频率项,只使用正频率项。对于音频信号来说,这些应该是多余的。 - dhke
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Trilarion
1
相反,这个问题归结于FFT本身的性质,答案对于任何第一次涉足它的人都非常有用。我唯一担心的是它可能已经在网站上的其他地方得到了回答。 - Mark Ransom
@MarkRansom 确实,FFT很有趣。但是这个问题并没有太大的帮助。至少现在我们知道提问者想要实现什么。语音显然是一个实值信号。我相信有一些变体可以计算实值信号的FFT,你不需要丢弃输出的一半,而只有从一开始就计算一半的输出。简而言之,我更喜欢更清晰、更精确的问题。如果想了解FFT的真实本质,那么应该准确地询问。提问得越好,对于每个人来说答案和问题就越有帮助。 - Trilarion
2个回答

8
为了依次解决这些问题:
1) 你并不需要进行归一化,但是输入的归一化接近数字化波形的原始结构,因此数字不直观。例如,数值67代表什么意思?将其归一化为在-1到1范围内更易于解释这些值。(但是如果您想要实现一个过滤器,例如进行FFT、修改FFT值,然后进行IFFT,那么进行归一化将是不必要的麻烦。)
2)和3)类似,它们都与主要存在于复数空间的数学有关。也就是说,FFT将一个复数波形(例如,[.5+.1j, .4+.7j, .4+.6j,...])转换为另一个复数序列。
详细来说:
2)实际上,如果输入的波形是实数而不是复数,则FFT关于0具有对称性,因此只有频率>=0的值是唯一有趣的。
3)FFT输出的值是复数,因此它们具有实部和虚部,但是这也可以表示为幅度和相位。对于音频信号,通常最有趣的是幅度,因为这基本上是我们听到的内容。因此人们经常使用abs(这是幅度),但是相位对于不同的问题也可能很重要。

0

这取决于你想做什么。看起来你只想绘制谱密度,那么这样做是可以的。

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

您看到的对称性仅在输入为实数序列(如果我没记错的话)时才得到保证。它与镜像失真有关,如果您的频率超过奈奎斯特频率(采样频率的一半),则原始频率会出现在DFT中,但也会出现镜像频率。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接