【发布时间】:2020-10-20 15:01:52
【问题描述】:
我正在尝试创建一个 Wiener 过滤器并检查从 2 到 20 的过滤器值。我根据需要得到 18 个图表,但即使我得到输出,我仍然会收到错误消息。我知道我的代码不是最干净的,几个月前我才开始使用 Python 作为 Lockdown 项目。任何和所有的帮助将不胜感激。代码是根据问题中提供的公式编写的。
import numpy as np
import scipy as sp
from scipy import linalg
from scipy import signal
import matplotlib.pyplot as plt
import scipy.io as sio
N = 109068
data = sio.loadmat('audiodata.mat')
y = data['audio']
y = np.reshape(y,(109068,1))
v2 = data['noise']
v2 = np.reshape(v2,(109068,1))
for t in range(1,18):
for n in range (t+1,20):
rv2 = np.zeros(t+1)
ryv2 = np.zeros(t+1)
rv2[t] += 1/(n-t)*v2[n]*v2[n-t]
ryv2[t] += 1/(n-t)*y[n]*v2[n-t]
Rv2 = sp.linalg.toeplitz(rv2)
Rv_2 = sp.linalg.inv(Rv2)
w_opt = np.matmul(Rv_2,ryv2)
v1 = sp.signal.lfilter(w_opt,1,v2)
y_filt = y-v1
ts = np.arange(0., y.shape[0]/22050, 1/22050)
fig, (ax1, ax2, ax3) = plt.subplots(3,sharex=True,figsize=(15,10))
ax1.plot(ts, y,'b')
ax1.plot(ts, y_filt,'g')
ax2.plot(ts, v1)
ax2.plot(ts, v2)
ax3.plot(ts, y_filt)
plt.xlabel('Time[s]')
plt.ylabel('PCM')
plt.show
得到的错误是这样的:
---------------------------------------------------------------------------
LinAlgError Traceback (most recent call last)
<ipython-input-244-7a0d629580e8> in <module>
19 ryv2[t] += 1/(n-t)*y[n]*v2[n-t]
20 Rv2 = sp.linalg.toeplitz(rv2)
---> 21 Rv_2 = sp.linalg.inv(Rv2)
22 w_opt = np.matmul(Rv_2,ryv2)
23 v1 = sp.signal.lfilter(w_opt,1,v2)
~\Anaconda3\lib\site-packages\scipy\linalg\basic.py in inv(a, overwrite_a, check_finite)
972 inv_a, info = getri(lu, piv, lwork=lwork, overwrite_lu=1)
973 if info > 0:
--> 974 raise LinAlgError("singular matrix")
975 if info < 0:
976 raise ValueError('illegal value in %d-th argument of internal '
LinAlgError: singular matrix
有什么想法吗?
【问题讨论】:
标签: python-3.x valueerror wiener-filter