2015-02-28 2 views
0

Я пытаюсь использовать «Эхо отменить» пример в Python 3.4 из библиотеки adaptfilt 2.0, которая выглядит следующим образом:Python adaptfilt 2.0 FloatingPointError: недопустимое значение встречается в многосвязной

import numpy as np 
import adaptfilt as adf 

# Get u(n) - this is available on github or pypi in the examples folder 
u = np.load('speech.npy') 

# Generate received signal d(n) using randomly chosen coefficients 
coeffs = np.concatenate(([0.8], np.zeros(8), [-0.7], np.zeros(9), 
         [0.5], np.zeros(11), [-0.3], np.zeros(3), 
         [0.1], np.zeros(20), [-0.05])) 

d = np.convolve(u, coeffs) 

# Add background noise 
v = np.random.randn(len(d)) * np.sqrt(5000) 
d += v 

# Apply adaptive filter 
M = 100 # Number of filter taps in adaptive filter 
step = 0.1 # Step size 
y, e, w = adf.nlms(u, d, M, step, returnCoeffs=True) 

# Calculate mean square weight error 
mswe = adf.mswe(w, coeffs) 

Он работает, как ожидалось. Но тогда я хотел бы сделать то же самое с некоторыми реальными данными из музыкального файла, и я получаю сообщение об ошибке:

Traceback (most recent call last): 
    File "C:/Python34/Lib/site-packages/adaptfilt/echocancel.py", line 86, in <module> 
    y, e, w = adf.nlms(u, d, M, step, returnCoeffs=True) 
    File "C:\Python34\Lib\site-packages\adaptfilt\nlms.py", line 149, in nlms 
    w = leakstep * w + step * normFactor * x * e[n] 
FloatingPointError: invalid value encountered in multiply 

Код я использовал это:

import numpy as np 
import adaptfilt as adf 
import pyaudio 
import wave 

np.seterr(all='raise') 
p = pyaudio.PyAudio() 
stream = p.open(format = p.get_format_from_width(2), 
         channels = 1, 
         rate = 44100, 
         input = True, 
         output = True, 
         #stream_callback = self.callback 
         ) 
wf = wave.open("XXX.wav", 'rb') 
while u != " ": 
    data = wf.readframes(1024) 
    u = np.fromstring(data, np.int16) 

    # Generate received signal d(n) using randomly chosen coefficients 
    coeffs = np.concatenate(([0.8], np.zeros(8), [-0.7], np.zeros(9), 
          [0.5], np.zeros(11), [-0.3], np.zeros(3), 
          [0.1], np.zeros(20), [-0.05])) 

    coeffs.dtype = np.int16 

    d = np.convolve(u, coeffs) 

    # Add background noise 
    v = np.random.randn(len(d)) * np.sqrt(5000) 
    d += v 

    # Apply adaptive filter 
    M = 100 # Number of filter taps in adaptive filter 
    step = 0.1 # Step size 
    y, e, w = adf.nlms(u, d, M, step, returnCoeffs=True) 

    # Calculate mean square weight error 
    mswe = adf.mswe(w, coeffs) 

    stream.write(y.astype(np.int16).tostring()) 

Единственное различие, которое я вижу, что массив из «speech.npy» является типом float64, а мой массив из wav-файла является типом int16.

ответ

0

Эта ошибка возникает из-за числовых проблем при использовании типа int16 для вычислений где-то внутри модуля. Используя ваш пример и вводя данные в тип с плавающей точкой, такие как

u = np.fromstring(data, np.int16) 
u = np.float64(u) 

решает проблему для меня.

1

Я также смог получить «adaptfilt 2.0» для работы с музыкальными данными (монофонический .wav-файл с частотой дискретизации 44,1 кГц) путем литья «данных» в float64.

Адаптивный фильтр занимал больше времени, чтобы сходиться, но он работал нормально. Ниже приведен график среднего квадрата ошибки квадрата, показывающий, что фильтр сходится.

http://i.imgur.com/xcpFUn2.png

Я хотел бы также добавить, что применять эту музыку, вам, вероятно, потребуется более длинный фильтр кран (M). Массив 'speech.npy', используемый в исходном скрипте, представляет собой массив без информации о частоте дискретизации, но мы можем предположить, что частота дискретизации в речевом файле ниже 44.1 кГц.

Я играл речевой.png с разной частотой дискретизации, и, просто слушая, что звучит естественно, я предполагаю, что он находится в диапазоне 10-12 кГц. Это означает, что «импульсная характеристика», хранящаяся в «coeffs», составляет ~ 5,7 мс (при условии, что частота дискретизации 10 кГц). При 44,1 кГц импульсная характеристика составляет всего ~ 1,3 мс. Это очень короткое и маловероятное моделирование импульсной характеристики для реальных сигналов.

+0

Hello hiro главный герой. Вы - бот?? Думаю, я предоставил здесь ценную информацию, и этот ответ кажется законченным. Если нет, можете ли вы предоставить более подробную информацию о том, почему это не «дает ответ на вопрос»? Хотелось бы верить, что я реплицирую решение другого комментатора и добавляю к нему некоторую ценность. Попытка получить достаточную репутацию, чтобы комментировать всюду, но это сложно для сутенера;) – user2348114

+0

рад, что вы спросили: я не бот. я просто не видел, как этот ответ может помочь OP (как он может обойти ошибку?). но я согласен, это было немного сыпь. я удалил комментарий. –

+0

По-прежнему вычислять SO из. Спасибо за изменения! – user2348114

Смежные вопросы