Python 为什么我要放弃FFT返回的一半?

Python 为什么我要放弃FFT返回的一半?,python,fft,wav,Python,Fft,Wav,看看这个答案: 技术部分是显而易见的,但我有两个理论问题(下面提到的代码): 1) 为什么我必须规范化(b=…)帧?如果我使用原始数据会发生什么 2) 为什么我应该只使用FFT结果的一半(d=…) 3) 为什么我要abs(c)FFT结果 也许由于对WAV格式或FFT的理解不足,我遗漏了一些东西,但是虽然这段代码工作得很好,但我很高兴理解它为什么工作以及如何最好地利用它 编辑:回应@Trilarion的评论: 我试图用Python编写一个简单的、不是100%准确的、更像概念证明的程序。这意味着获

看看这个答案:

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

1) 为什么我必须规范化(
b=…
)帧?如果我使用原始数据会发生什么

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

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

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

编辑:回应@Trilarion的评论:

我试图用Python编写一个简单的、不是100%准确的、更像概念证明的程序。这意味着获取一个wav文件(目前我正在使用它进行测试),并在每秒钟(或任何其他分辨率)说出说话人是1人还是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()

这取决于你想做什么。看起来你只是想画出光谱密度,然后就可以了

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

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


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

要按顺序解决这些问题:

1) 您不需要规格化,但输入规格化接近数字化波形的原始结构,因此数字是不直观的。例如,值67的音量有多大?更容易将其规格化为-1到1的范围来解释值。(但是,如果您想实现一个过滤器,例如,在进行FFT时,修改FFT值,然后执行IFFT,那么规范化将是一个不必要的麻烦。)

2) 和3)的相似之处在于,它们都与主要生活在复数空间中的数学有关。也就是说,FFT将复数波形(例如,[.5+.1j、.4+.7j、.4+.6j,…])转换为另一个复数序列

因此,具体而言:

2) 结果表明,如果输入波形是实波形而不是复数波形,那么FFT的对称性约为0,因此只有频率>=0的值才是唯一有趣的


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

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