我试图将注意力集中在线性预测上,并发现我将用Python编写一个基本示例来测试我的理解。线性预测编码背后的思想是基于过去采样的线性组合来估计信号的未来采样。
我在scikits.talkbox中使用了lpc模块,因此我不必自己编写任何算法。这是我的代码:
$users = User::whereDate('created_at', Carbon::today())->count();
输出为
import math
import numpy as np
from scikits.talkbox.linpred.levinson_lpc import levinson, acorr_lpc, lpc
x = np.linspace(0,11,12)
order = 5
"""
a = solution of the inversion
e = prediction error
k = reflection coefficients
"""
(a,e,k) = lpc(x,order,axis=-1)
recon = []
for i in range(order,len(x)):
sum = 0
for j in range(order):
sum += -k[j]*x[i-j-1]
sum += math.sqrt(e)
recon.append(sum)
print(recon)
print(x[order:len(x)])
我担心的是我以某种方式错误地实现了此功能,因为我发现如果我的输入数组是线性信号,那么根据过去的值预测将来的值应该没有问题。但是,它似乎确实有一个特别高的误差,尤其是对于前几个值。谁能告诉我我是否正确实现了这一点,或者指出了一些用Python完成此操作的示例?非常感谢您的帮助!
答案 0 :(得分:0)
线性预测算法在两个方向上用无限数量的零扩展原始序列。因此,除非您的输入信号恒定为零,否则扩展序列不是线性的,因此您应该预期到非零误差。 这是我的Python实现:
def lpc(y, m):
"Return m linear predictive coefficients for sequence y using Levinson-Durbin prediction algorithm"
#step 1: compute autoregression coefficients R_0, ..., R_m
R = [y.dot(y)]
if R[0] == 0:
return [1] + [0] * (m-2) + [-1]
else:
for i in range(1, m + 1):
r = y[i:].dot(y[:-i])
R.append(r)
R = np.array(R)
#step 2:
A = np.array([1, -R[1] / R[0]])
E = R[0] + R[1] * A[1]
for k in range(1, m):
if (E == 0):
E = 10e-17
alpha = - A[:k+1].dot(R[k+1:0:-1]) / E
A = np.hstack([A,0])
A = A + alpha * A[::-1]
E *= (1 - alpha**2)
return A