相同长度音频夹的不同FFT信号长度



当前我正在研究一个项目,该项目要求我挑选音频剪辑并根据其FFT结果(即频谱图(进行比较。我所有的音频夹长0.200,但是当我通过转换处理它们时,它们的长度不再相同。我用于转换的代码使用numpy和libreosa库:

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将其传递,而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.

我知道此错误源于数组不是集合2维形状的,因为当FFT元素全度相等,并且代码按预期工作时,我不会收到此错误。

这与音频剪辑有关吗?转换后,某些音频剪辑的长度相等,其他音频剪辑则不相等。如果有人可以解释为什么这些相同长度的音频剪辑可以返回不同的fft,那将很棒!

请注意,它们通常只有几个点,例如,对于3个音频剪辑,FFT长度为4410,但对于第4个是4409。我知道我可能只能将长度缩小到最小的长度。小组,但我更喜欢一种不会忽略任何值的清洁方法。

首先:不仅取得了转换结果的实际部分。它不会对您有任何好处。使用功率(r^2+i^2(或大小(sqrt(power)(获得频率箱的信号强度。

这与音频剪辑有关吗?转换后,某些音频剪辑的长度相等,其他音频剪辑则不相等。如果有人可以解释为什么这些相同长度的音频剪辑可以返回不同的fft,那将很棒!

它们根本不是相同的长度。我敢打赌您的剪辑的样本号并不完全相同。

y, sr = lb.load(audioArr[x])print('sample count = {}'.format(len(y)))之后,您很可能会看到不同的值(您已经说了很多(。

正如您已经指出的那样,当然,您可以简单地在min(len(y))处剪切信号,然后将其输入FFT。但是通常,您要解决的问题是使用离散的STFT,该STFT具有固定的窗口大小。这样可以确保与FFT相同的长度输入大小。您可以将Libresa的实现用作简单的起点。文档还解释了如何获得幅度/功率。

所以:

y, sr = lb.load(audioArr[x])
fourier = np.fft.fft(y)
fourier = fourier.real
fourierArr.append(fourier)

你做:

y, sr = lb.load(audioArr[x])
# get the magnitudes
D = np.abs(librosa.stft(y, n_fft=4096))  # use 4096 as window length
fourierArr.append(D[0])                  # only use the first frame of the STFT

本质上,如果您使用具有不同长度输入的傅立叶变换,则在使用此输出作为培训数据时,您将获得不同的长度输出,这是LDA不原谅的。因此,您必须确保输入的长度相同。最简单的方法是使用STFT(或简单地将所有输入切成min(。imo,如果您缺少几个样本,则没有任何不干净,不会影响结果。

最新更新