В настоящее время я работаю над проектом, который требует от меня выбора аудиоклипов и сравнения их на основе результатов БПФ (т.е. спектрограммы). Все мои аудиоклипы имеют длину 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, который не допускает комплексных чисел. Несмотря на это, я не могу выполнить ни LDA (линейный дискриминантный анализ), ни PCA для этого массива БПФ аудиоклипов, поскольку некоторые из них имеют разную длину.
Код, который у меня есть для LDA, выглядит следующим образом, где метки даны для frequencyArr
длины 4:
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.
Я знаю, что эта ошибка связана с тем, что массив не имеет заданной двумерной формы, поскольку я не получаю эту ошибку, когда все элементы БПФ имеют одинаковую длину, а код работает по назначению.
Это как-то связано с аудиоклипами? После преобразования некоторые аудиоклипы имеют одинаковую длину, а другие — нет. Если бы кто-нибудь мог объяснить, почему эти аудиоклипы одинаковой длины могут возвращать БПФ разной длины, это было бы здорово!
Обратите внимание, что обычно они отличаются всего на несколько пунктов, скажем, для 3 аудиоклипов длина БПФ составляет 4410, а для 4-го — 4409. Я знаю, что, вероятно, могу просто сократить длину до наименьшей длины из группы, но я бы предпочел более чистый метод, который не пропускает никаких значений.