Я пытаюсь использовать приложение ICA с использованием аудиофайлов (.wavs). При использовании scipy wavfile я заметил, что при использовании cprofile моя функция load_wav работает очень плохо. Обработка 4400 стереофонического файла WAV со скоростью процессора 4,5 ГГц занимает 30 минут. Помните, что файл .wav длится всего 10 секунд. Вот моя функция для справки:
def load_wav(filename,samplerate=44100):
# load file
rate, data = wavfile.read(filename)
# convert stereo to mono
if len(data.shape) > 1:
data = data[:,0]/2 + data[:,1]/2
# re-interpolate samplerate
ratio = float(samplerate) / float(rate)
data = resample(data, len(data) * ratio)
return samplerate, data.astype(np.int16)
это в первую очередь повторная интерполяция, которая занимает вечность. Я исследовал все, что мог на нем, и, похоже, не все компьютеры имеют большой опыт работы с многочисленными поплавками. Некоторые поплавки могут быть близки к нулю, но не совсем. В моем аудио примере это может быть результатом паузы в речи человека, или может произойти в начале или конце файла, и этот список можно продолжить.
Итак, чтобы перейти к этому, кто-то может поделиться чем-то вроде этого обходного пути C ++ в Python? Они называют эту проблему «денормальными» и предлагают сброс до нуля.
И было бы также разумно знать, является ли ноль единственным числом, к которому следует относиться с осторожностью. Может быть, я должен установить значимые цифры для всех чисел? Будет ли это иметь значение в аудио приложениях? Если так, как это будет выглядеть в Python? Очевидно, что мы можем захотеть избежать чрезмерного использования, например использовать только целые числа, что, вероятно, приведет к значительному ухудшению качества звука.
В любом случае, я думаю, что вы поняли мой вопрос, я хочу, чтобы скорость вычислений была в пределах разумного, но все же была бы возможность иметь половинное приличное представление о .wav.
Пожалуйста, помогите, если можете,
Спасибо
Импорт следующие:
import numpy as np
from scipy.io import wavfile
from scipy.signal import resample
Также, если вы хотите просмотреть блокнот jupyter, чтобы увидеть приложение ICA в полном объеме, вы можете сделать это здесь:
http://web.archive.org/web/20150314223948/http://shogun-toolbox.org/static/notebook/current/bss_audio.html
** ссылка использует Python 2.7, я использую Python 3.5, поэтому все может немного отличаться.
—редактировать
Что ж. извините за путаницу. Ответ на вопрос о том, почему форма X изменилась, связан с тем фактом, что тетрадь для примера восприняла точечный продукт иначе, чем я привык. Они использовали S=(np.c_[s1,s2,s3]).T
затем np.dot(A,S)
, Я обычно использую S=np.c_[s1,s2,s3]
затем np.dot(S,A.T)
, Так что все, что мне нужно было сделать, это преобразовать несколько вещей, чтобы получить желаемую форму X. Классический случай не смотреть, прежде чем я прыгнул. Я был неправ, чтобы обвинить np.delete(data,-1)
для того, чтобы вызвать эту форму неудачу. Он доказал свою работоспособность для обработки простых чисел, гарантируя, что данные будут четным числом. Я удалю некоторые из моих ненужных комментариев, чтобы восстановить ясность в своем посте.
Вердикт все еще не принят в отношении порогов до нуля / значащих цифр с точки зрения эффективности кода обработки звука. Я надеюсь, что этот конкретный аспект моего вопроса вновь будет рассмотрен в ближайшее время. До тех пор я буду использовать np.delete(data,-1)
как быстрое и грязное решение при работе с большими / простыми числами.
Как уже прокомментировал AndyG, документация для scipy.signal.resample
предупреждает вас, что
… Resample использует преобразования FFT, которые могут быть очень медленными, если число входных выборок велико и простое, см.
scipy.fftpack.fft
,
441263 большой и простой.
Если у вас есть версия scipy> = 0.18.0, вы можете попробовать resample_poly
вместо:
Этот многофазный метод, вероятно, будет быстрее, чем метод Фурье в scipy.signal.resample, когда число выборок велико и простое, или когда число выборок велико, а вверх и вниз имеют большой наибольший общий знаменатель.
Например:
import numpy
from scipy.signal import resample, resample_poly
x = np.random.randn(441263)
%timeit resample(x, x.shape[0] // 4)
# 1 loop, best of 3: 2min 18s per loop
%timeit resample_poly(x, 10, 40)
# 100 loops, best of 3: 9.05 ms per loop
Других решений пока нет …