Я пытаюсь выполнить приложение 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? Они называют эту проблему «денормалами», и они предлагают флеш к нулю.
И было бы также душевное спокойствие, чтобы знать, является ли или не ноль является единственным числом, быть осторожными. Может быть, я должен установить значимые цифры для всех чисел? Будет ли это иметь значение в аудио-приложениях? Если да, то как это будет выглядеть на 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)
в качестве быстрого и грязного решения при работе с большими/простыми числами.
Какое значение 'LEN (данные) * ratio'? – AndyG
для моего конкретного .wav его 441263. Это «большое» число, но опять же это не астрономическое, поэтому он задает вопрос, является ли это путешествие или пункт назначения, который вредит вычислительной выполнимости. –
Не могли бы вы показать свой импорт, пожалуйста. Откуда взялась «перевыборка»? Из 'scipy.signal'? –