【发布时间】:2019-12-07 11:12:32
【问题描述】:
目前我正在开展一个项目,该项目需要我挑选音频片段并根据它们的 FFT 结果(即频谱图)进行比较。我所有的音频剪辑都是 0.200 秒长,但是当我通过变换处理它们时,它们不再是相同的长度。我用于转换的代码使用 numpy 和 librosa 库:
def extractFFT(audioArr):
fourierArr = []
fourierComplex = []
for x in range(len(audioArr)):
y, sr = lb.load(audioArr[x])
fourier = np.fft.fft(y)
fourier = fourier.real
fourierArr.append(fourier)
return fourierArr
我只取转换的实数部分,因为我还想通过 PCA 传递它,它不允许复数。无论如何,我不能对这个 FFT 音频剪辑数组执行 LDA(线性判别分析)或 PCA,因为有些长度不同。
我为 LDA 提供的代码如下,其中为长度为 4 的 frequencyArr 给出了标签:
def LDA(frequencyArr):
splitMark = int(len(frequencyArr)*0.8)
trainingData = frequencyArr[:splitMark]
validationData = frequencyArr[splitMark:]
labels = [1,1,2,2]
lda = LinearDiscriminantAnalysis()
lda.fit(trainingData,labels[:splitMark])
print(f"prediction: {lda.predict(validationData)}")
这会引发以下值错误,来自lda.fit(trainingData,labels[:splitMark]) 行:
ValueError: setting an array element with a sequence.
我知道这个错误源于数组不是一组二维形状,因为当 FFT 元素长度相同并且代码按预期工作时我没有收到这个错误。
这与音频剪辑有关吗?转换后,一些音频片段的长度相等,而另一些则不然。如果有人能解释为什么这些相同长度的音频片段可以返回不同长度的 FFT,那就太好了!
请注意,它们通常仅相差几个点,例如,对于 3 个音频剪辑,FFT 长度为 4410,但第 4 个为 4409。我知道我可能只是将长度修剪到最小长度组,但我更喜欢一种不会遗漏任何值的更简洁的方法。
【问题讨论】:
标签: python scikit-learn fft audio-processing librosa