带有两个.wav文件的Python adaptfilt-echo canceller示例

时间:2016-08-26 05:19:27

标签: python numpy audio wave pyaudio

此代码是对adaptfilt2.0 echo canceller

示例的修改
  u(n) ------->->------+----------->->-----------
                       |                        |
              +-----------------+      +------------------+
          +->-| Adaptive filter |      |    John's Room   |
          |   +-----------------+      +------------------+
          |            | -y(n)                  |
          |            |           d(n)         |
  e(n) ---+---<-<------+-----------<-<----------+----<-<---- v(n)

我需要阅读两个wave音频文件audio1.wav喜欢emily的信号和audio2.wav喜欢john的信号,问题是代码只使用audio1.wav而不读audio2.wav在这个过程中,所以当代码运行时,只使用audio1.wav表示u(n)和v(n),而不是将audio2.wav赋值给变量v(n)。

import numpy as np
import matplotlib.pyplot as plt
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 =callback
                        )

#Read U
wf1 = wave.open("audio1.wav", 'r')

data= wf1.readframes(1024)
u = np.fromstring(data, np.int16)
u = np.float64(u)

#read V
wf2= wave.open("audio2.wav", 'r')
data2= wf2.readframes(1024)
v= np.fromstring(data2, np.int16)
v = np.float64(u)

#both signals
d = u+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)

plt.figure()
plt.title('Em u(n)')
plt.plot(u)
plt.grid()
plt.xlabel('Samples')

plt.figure()
plt.title('john v(n)')
plt.plot(v)
plt.grid()
plt.xlabel('Samples')


plt.show()

图像显示我的问题

Emily

John's signal

代码中有什么问题不能让我同时使用这两种信号?

1 个答案:

答案 0 :(得分:0)

看起来你有一个&#34;复制并粘贴&#34;错误。阅读audio2.wav后,这一行

v = np.float64(u)

应该是

v = np.float64(v)

(现在您发现这是一个微不足道的错误,请随时删除您的问题!)

P.S。使用np.float64有效,但用numpy执行此操作的惯用方法是:

v = v.astype(np.float64)