基本线性预测

2024-09-27 02:18:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用线性预测来思考,并想用Python编写一个基本的示例来测试我的理解能力。线性预测编码的思想是基于过去样本的线性组合来估计信号的未来样本。在

我正在使用中的lpc模块scikits.对讲机所以我不需要自己写任何算法。我的代码是:

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)])

其输出为

^{pr2}$

我担心的是,我在某种程度上实现了这个错误,因为我认为,如果我的输入数组是一个线性信号,那么根据过去的值来预测未来的值应该没有问题。然而,它似乎有一个特别高的误差,特别是对于前几个值。有人能告诉我是否正确地实现了这一点,或者给我举几个用Python实现的例子?非常感谢您的帮助,谢谢!在


Tags: inimportfor信号nporderrange线性
1条回答
网友
1楼 · 发布于 2024-09-27 02:18:11

线性预测算法在两个方向上扩展了原始序列的无穷多个零点。所以,除非你的输入信号是恒定的零,否则扩展序列不是线性的,你应该期待一个非零误差。 下面是我的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

相关问题 更多 >

    热门问题