2016-09-21 5 views
0

Я пытаюсь выполнить приложение ICA с использованием аудиофайлов (.wavs). При использовании scipy wavfile я заметил из использования cprofile, что моя функция load_wav работает очень плохо. Требуется 30 минут для обработки файла .wav с разрешением 44100 со скоростью процессора 4,5 ГГц. Имейте в виду, что .wav-файл длится всего 10 секунд. Вот моя функция для справки:Сброс до нуля и/или значащих цифр в поплавках python

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? Они называют эту проблему «денормалами», и они предлагают флеш к нулю.

http://blog.audio-tk.com/2016/09/20/audio-toolkit-handling-denormals/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+eifelle%2FCPPV+%28Matt%27s+blog%29

И было бы также душевное спокойствие, чтобы знать, является ли или не ноль является единственным числом, быть осторожными. Может быть, я должен установить значимые цифры для всех чисел? Будет ли это иметь значение в аудио-приложениях? Если да, то как это будет выглядеть на Python? Очевидно, что мы, возможно, захотим избежать выхода за борт, например, только с использованием целых чисел, что, вероятно, приведет к значительному ухудшению звука.

Во всяком случае, я думаю, вы поняли мой вопрос, я хочу, чтобы скорость вычислений была в пределах разумного, но все же быть в состоянии иметь половину достойного numpy-представления .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, поэтому все может немного отличаться.

--Edit

Хорошо. извините за путаницу. Ответ на вопрос о том, почему изменилась форма 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) в качестве быстрого и грязного решения при работе с большими/простыми числами.

+0

Какое значение 'LEN (данные) * ratio'? – AndyG

+0

для моего конкретного .wav его 441263. Это «большое» число, но опять же это не астрономическое, поэтому он задает вопрос, является ли это путешествие или пункт назначения, который вредит вычислительной выполнимости. –

+0

Не могли бы вы показать свой импорт, пожалуйста. Откуда взялась «перевыборка»? Из 'scipy.signal'? –

ответ

1

Как AndyG уже комментировал, the documentation for 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 
+0

Я попробую этот полифазный метод, я сейчас оптимистичен. У меня есть вопрос, может, нулевой флеш или значимые цифры по-прежнему влияют на производительность для такого рода вычислений? Будет ли resample_poly и resample обе выгоды? Или это аспект большого/простого числа, заглушающий «денормалы». Просто интересно, являются ли «денормалы» все еще фактором. –

+0

Пожалуйста, не помещайте код в комментарии. Если вам нужно добавить разъяснение, вы должны изменить свой вопрос. –