Я пытаюсь использовать «Эхо отменить» пример в 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.
Hello hiro главный герой. Вы - бот?? Думаю, я предоставил здесь ценную информацию, и этот ответ кажется законченным. Если нет, можете ли вы предоставить более подробную информацию о том, почему это не «дает ответ на вопрос»? Хотелось бы верить, что я реплицирую решение другого комментатора и добавляю к нему некоторую ценность. Попытка получить достаточную репутацию, чтобы комментировать всюду, но это сложно для сутенера;) – user2348114
рад, что вы спросили: я не бот. я просто не видел, как этот ответ может помочь OP (как он может обойти ошибку?). но я согласен, это было немного сыпь. я удалил комментарий. –
По-прежнему вычислять SO из. Спасибо за изменения! – user2348114