Сброс до нуля и / или значащих цифр в поплавках Python

Я пытаюсь использовать приложение 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? Они называют эту проблему «денормальными» и предлагают сброс до нуля.

http://blog.audio-tk.com/2016/09/20/audio-toolkit-handling-denormals/?utm_source=feedburner&utm_medium = подача&utm_campaign = Подача% 3A + eifelle% 2FCPPV +% 28Matt% 27s + блог% 29

И было бы также разумно знать, является ли ноль единственным числом, к которому следует относиться с осторожностью. Может быть, я должен установить значимые цифры для всех чисел? Будет ли это иметь значение в аудио приложениях? Если так, как это будет выглядеть в 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) как быстрое и грязное решение при работе с большими / простыми числами.

0

Решение

Как уже прокомментировал 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
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]