自回归(AR)模型的功率谱估计(实现)

这篇具有很好参考价值的文章主要介绍了自回归(AR)模型的功率谱估计(实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一部分介绍了AR模型的理论知识,这一部分将介绍AR模型的各种估计方法。点击这里,快速查看理论知识。在这些实验中,均假设N=1024,P=512。

Yule-Walker法

流程图

ar谱估计,脑机接口,回归,ar,python

python 代码

import scipy
import numpy as np
from matplotlib import pyplot as plt


# 自相关函数
def x_corr(x):
    x_inv = x[::-1]
    # r_x = np.correlate(x, x)
    r_x = np.convolve(x, x_inv)
    r_x /= len(x)
    return r_x


if __name__ == "__main__":
    N = int(input("采样点数N:"))
    P = int(input("模型阶数P:"))
    # a_N [0, 1, ..., N-1]
    a_N = np.arange(0, N, 1)

    # 信号频率
    f1 = 0.1
    f2 = 0.13
    a_X = 2 * np.sin(2 * np.pi * f1 * a_N + np.pi / 3) + 10 * np.sin(2 * np.pi * f2 * a_N + np.pi / 4)

    # 自相关函数Rxx
    # Rxx(0), Rxx(1), ..., Rxx(N-1)
    Rxx = x_corr(a_X)[N-1:]
    # 取前P+1个
    # Rxx(0), Rxx(1), Rxx(P-1), Rxx(P)
    Rxx = Rxx[: P+1]

    # 自相关矩阵a_Rxx
    # [Rxx(0)   Rxx(1)   ... Rxx(p-1)]
    # [Rxx(-1)  Rxx(0)   ... Rxx(p-2)]
    # ...
    # [Rxx(1-p) Rxx(2-p) ... Rxx(0)  ]
    a_Rxx = np.zeros([P, P])
    for i in range(P):
        for j in range(P):
            a_Rxx[i, j] = Rxx[abs(i-j)]

    # 结果矩阵a_rx
    # [-Rxx(1)]
    # [-Rxx(2)]
    # ...
    # [-Rxx(p)]
    a_rx = np.zeros([P, 1])
    for i in range(P):
        a_rx[i, 0] = -Rxx[i + 1]

    # 系数矩阵a_apk
    # [a_p1]
    # [a_p2]
    # ...
    # [a_pp]
    a_Rxx_inv = np.linalg.inv(a_Rxx)
    a_apk = np.matmul(a_Rxx_inv, a_rx)

    # 标准差sigma
    sigma = Rxx[0]
    for i in range(P):
        sigma += a_apk[i, 0] * Rxx[i + 1]
    sigma = np.sqrt(sigma)

    # [ap1, ..., app]->[1, ap1, ..., app]
    a_ap = np.insert(a_apk, 0, [1])
    w, h = scipy.signal.freqz(sigma, a_ap, worN=N)

    Hf = abs(h)
    psd = Hf**2
    f = w / (2 * np.pi)

    plt.figure(1)
    plt.subplot(211)
    plt.plot(f, Hf)
    plt.xlabel("f/hz")
    plt.ylabel("Hf")

    plt.subplot(212)
    plt.plot(f, psd)
    plt.xlabel("f/hz")
    plt.ylabel("psd")
    plt.show()

实验结果

ar谱估计,脑机接口,回归,ar,python

Levinson-Durbin法

流程图

ar谱估计,脑机接口,回归,ar,python

python代码

import numpy as np
import scipy
from matplotlib import pyplot as plt


def x_corr(a_x):
    a_x_inv = a_x[::-1]
    a_rx = np.convolve(a_x, a_x_inv)
    a_rx /= len(a_x)
    return a_rx


if __name__ == "__main__":
    N = int(input("采样点数N:"))
    P = int(input("模型阶数P:"))

    a_N = np.arange(N)
    # 信号频率
    f1 = 0.1
    f2 = 0.3
    # 信号
    a_X = 2 * np.sin(2 * np.pi * f1 * a_N + np.pi / 3) + 10 * np.sin(2 * np.pi * f2 * a_N + np.pi / 4)

    # 自相关函数Rx
    Rxx = x_corr(a_X)[N - 1:]
    Rxx = Rxx[: P + 1]

    # 初始化参数apk, sigma
    # p=1
    a_apk = np.zeros([P + 1, P + 1])
    a_apk[1, 1] = -Rxx[1] / Rxx[0]
    a_sigma = np.zeros(P + 1)
    a_sigma[1] = (1 - np.square(a_apk[1, 1])) * Rxx[0]

    # p>1
    for p in range(2, P + 1):
        kp_sum = 0
        for i in range(1, p):
            kp_sum += a_apk[p - 1, i] * Rxx[p - i]
        a_apk[p, p] = - (Rxx[p] + kp_sum) / a_sigma[p - 1]
        for k in range(1, p):
            a_apk[p, k] = a_apk[p - 1, k] + a_apk[p, p] * a_apk[p - 1, p - k]
        a_sigma[p] = (1 - np.square(a_apk[p, p])) * a_sigma[p - 1]
    
    a_ap = a_apk[- 1][1:]

    # a_apk = np.zeros([P, P])
    # a_apk[0, 0] = -Rxx[1] / Rxx[0]
    # a_sigma = np.zeros(P)
    # a_sigma[0] = (1 - np.square(a_apk[0, 0])) * Rxx[0]
    #
    # for p in range(1, P):
    #     kp_sum = 0
    #     for i in range(0, p):
    #         kp_sum += a_apk[p - 1, i] * Rxx[p - i]
    #     a_apk[p, p] = - (Rxx[p + 1] + kp_sum) / a_sigma[p - 1]
    #     for k in range(p):
    #         a_apk[p, k] = a_apk[p - 1, k] + a_apk[p, p] * a_apk[p - 1, p - k - 1]
    #     a_sigma[p] = a_sigma[p - 1] * (1 - np.square(a_apk[p, p]))

    # a_ap = a_apk[- 1]
    
    sigma = a_sigma[- 1]
    sigma = np.sqrt(sigma)
    a_ap = np.insert(a_ap, 0, [1])
    w, h = scipy.signal.freqz(sigma, a_ap, worN=N)

    Hf = abs(h)
    psd = Hf**2
    f = w / (2 * np.pi)

    plt.figure(1)
    plt.subplot(211)
    plt.plot(f, Hf)
    plt.xlabel("f/hz")
    plt.ylabel("Hf")

    plt.subplot(212)
    plt.plot(f, psd)
    plt.xlabel("f/hz")
    plt.ylabel("psd")
    plt.show()

实验结果

ar谱估计,脑机接口,回归,ar,python

Burg法

流程图

ar谱估计,脑机接口,回归,ar,python

python代码

import numpy as np
import scipy
from matplotlib import pyplot as plt


def x_corr(a_x):
    a_x_inv = a_x[::-1]
    a_rx = np.convolve(a_x, a_x_inv)
    a_rx /= len(a_x)
    return a_rx


if __name__ == "__main__":
    N = int(input("采样点数N:"))  # 1024
    P = int(input("模型阶数P:"))  # 512
    a_N = np.arange(N)
    # 信号频率
    f1 = 0.1
    f2 = 0.13
    a_X = 2 * np.sin(2 * np.pi * f1 * a_N + np.pi / 3) + 10 * np.sin(2 * np.pi * f2 * a_N + np.pi / 4)

    a_epn = np.zeros([P+1, N])
    a_bpn = np.zeros([P+1, N])

    # 初始化e0n, b0n
    a_epn[0] = a_X
    a_bpn[0] = a_X
    # for i in range(N):
    #     a_epn[0, i] = a_X[i]
    #     a_bpn[0, i] = a_X[i]

    a_Kp = np.zeros(P+1)
    a_apk = np.zeros([P+1, P+1])
    a_sigma = np.zeros(P+1)

    # 初始化sigma1
    # a_sigma[0] = x_corr(a_X)[N-1:][0]
    sum1 = 0
    for n in range(N):
        sum1 += np.square(a_X[n])
    a_sigma[0] = sum1 / N

    for p in range(1, P+1):
        Kp_sum1 = 0
        Kp_sum2 = 0
        for n in range(p, N):
            Kp_sum1 += a_epn[p-1, n] * a_bpn[p-1, n-1]
            Kp_sum2 += np.square(a_epn[p-1, n]) + np.square(a_bpn[p-1, n-1])
        a_Kp[p] = -(2 * Kp_sum1) / Kp_sum2

        for n in range(p, N):
            a_epn[p, n] = a_epn[p-1, n] + a_Kp[p] * a_bpn[p-1, n-1]
            a_bpn[p, n] = a_bpn[p-1, n-1] + a_Kp[p] * a_epn[p-1, n]

    a_apk[1, 1] = a_Kp[1]
    a_sigma[1] = (1 - np.square(a_Kp[1])) * a_sigma[0]
    for p in range(2, P+1):
        a_apk[p, p] = a_Kp[p]
        for i in range(1, p):
            a_apk[p, i] = a_apk[p-1, i] + a_apk[p, p] * a_apk[p-1, p-i]
        a_sigma[p] = (1 - np.square(a_Kp[p])) * a_sigma[p - 1]

    a_ap = a_apk[-1][1:]
    sigma = np.sqrt(a_sigma[-1])
    a_ap = np.insert(a_ap, 0, [1])
    w, h = scipy.signal.freqz(sigma, a_ap, worN=N)
    Hf = abs(h)
    psd = Hf ** 2
    f = w / (2 * np.pi)

    plt.figure(1)
    plt.subplot(211)
    plt.plot(f, Hf)
    plt.xlabel("f/hz")
    plt.ylabel("Hf")

    plt.subplot(212)
    plt.plot(f, psd)
    plt.xlabel("f/hz")
    plt.ylabel("psd")
    plt.show()

实验结果

ar谱估计,脑机接口,回归,ar,python

协方差法

ar谱估计,脑机接口,回归,ar,python

python代码

个人感觉代码有点问题,但是又不知道哪里有问题,麻烦各位老哥知道的赐教一下。

import numpy as np
import scipy
from matplotlib import pyplot as plt


if __name__ == "__main__":
    N = int(input("采样点数N:"))
    P = int(input("模型阶数P:"))
    a_N = np.arange(N)
    # 信号频率
    f1 = 0.1
    f2 = 0.13
    a_X = 2 * np.sin(2 * np.pi * f1 * a_N + np.pi / 3) + 10 * np.sin(2 * np.pi * f2 * a_N + np.pi / 4)

    Cxx = np.zeros([P+1, P+1])
    for i in range(P+1):
        for k in range(P+1):
            sum_c = 0
            for n in range(P, N):
                sum_c += a_X[n-k] * a_X[n-i]
            Cxx[i, k] = sum_c / (N - P)

    a_Cxx = Cxx[1:, 1:]
    a_Cxx_inv = np.linalg.inv(a_Cxx)

    a_cx = Cxx[:, 0][1:]
    a_apk = np.matmul(a_Cxx_inv, -a_cx[:, None])

    sigma = Cxx[0, 0]
    for k in range(P):
        sigma += a_apk[k, 0] * Cxx[0, k + 1]
    sigma = np.sqrt(sigma)

    # [ap1, ..., app]->[1, ap1, ..., app]
    a_ap = np.insert(a_apk, 0, [1])
    w, h = scipy.signal.freqz(1, a_ap, worN=N)

    Hf = abs(h)
    psd = Hf**2
    f = w / (2 * np.pi)

    plt.figure(1)
    plt.subplot(211)
    plt.plot(f, Hf)
    plt.xlabel("f/hz")
    plt.ylabel("Hf")

    plt.subplot(212)
    plt.plot(f, psd)
    plt.xlabel("f/hz")
    plt.ylabel("psd")
    plt.show()

实验结果

ar谱估计,脑机接口,回归,ar,python

修正协方差法

流程图

ar谱估计,脑机接口,回归,ar,python

python代码

这个代码也感觉有问题,当设置p=512,N=1024时,程序一直报错。没办法只有改成p=512才能正常运行。有会的兄弟姐妹私信我一下,谢谢啦!

import numpy as np
import scipy
from matplotlib import pyplot as plt


if __name__ == "__main__":
    N = int(input("采样点数N:"))
    P = int(input("模型阶数P:"))
    a_N = np.arange(N)
    # 信号频率
    f1 = 0.1
    f2 = 0.13
    a_X = 2 * np.sin(2 * np.pi * f1 * a_N + np.pi / 3) + 10 * np.sin(2 * np.pi * f2 * a_N + np.pi / 4)

    Cxx = np.zeros([P+1, P+1])
    for i in range(P+1):
        for k in range(P+1):
            sum1 = 0
            sum2 = 0
            for n in range(P, N):
                sum1 += a_X[n-k] * a_X[n-i]
            for m in range(0, N-P):
                sum2 += a_X[m+k] * a_X[m+i]
            Cxx[i, k] = (sum1 + sum2) / (2 * (N - P))

    a_Cxx = Cxx[1:, 1:]
    a_Cxx_inv = np.linalg.inv(a_Cxx)

    a_cx = Cxx[:, 0][1:]
    a_apk = np.matmul(a_Cxx_inv, -a_cx[:, None])

    sigma = Cxx[0, 0]
    for k in range(P):
        sigma += a_apk[k, 0] * Cxx[0, k + 1]
    sigma = np.sqrt(sigma)

    # [ap1, ..., app]->[1, ap1, ..., app]
    a_ap = np.insert(a_apk, 0, [1])
    w, h = scipy.signal.freqz(sigma, a_ap, worN=N)

    Hf = abs(h)
    psd = Hf**2
    f = w / (2 * np.pi)

    plt.figure(1)
    plt.subplot(211)
    plt.plot(f, Hf)
    plt.xlabel("f/hz")
    plt.ylabel("Hf")

    plt.subplot(212)
    plt.plot(f, psd)
    plt.xlabel("f/hz")
    plt.ylabel("psd")
    plt.show()

实验结果

ar谱估计,脑机接口,回归,ar,python文章来源地址https://www.toymoban.com/news/detail-531950.html

到了这里,关于自回归(AR)模型的功率谱估计(实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【AI】自回归 (AR) 模型使预测和深度学习变得简单

    自回归 (AR) 模型是统计和时间序列模型,用于根据数据点的先前值进行分析和预测。这些模型广泛应用于各个领域,包括经济、金融、信号处理和自然语言处理。 自回归模型假设给定时间变量的值与其过去的值线性相关,这使得它们可用于建模和预测时间相关数据。 自回归

    2024年02月05日
    浏览(33)
  • 现代信号处理实验:MATLAB实现LD算法进行AR估计

    利用给定的一组样本数据估计一个平稳随机信号的功率谱密度称为功率谱估计,又称谱估计。谱估计的方法可以分成经典谱估计和现代谱估计。 经典谱估计又称为非参数化的谱估计,分为直接法和间接法。直接法是指直接计算样本数据的傅里叶变换,即获取频谱,然后计算频

    2024年02月03日
    浏览(43)
  • AR参数谱估计(含MATLAB代码)

    自回归模型(AR模型):现在的输出是现在的输入和过去p个输出的加权和,即 AR模型的参数 与 的自相关函数 的关系: 写成矩阵形式: (上面两式为AR模型的正则方程或Yule-Walker方程) 参数说明: 为p阶AR模型在阶次为m时的第k个系数, 为m阶的前向预测的最小误差功率,km(即 )

    2024年02月10日
    浏览(33)
  • 从娱乐产品到效率工具,ARknovv首款AR眼镜回归“AR本质”

    如果说2022年是AR的元年,2023年则有望成为消费级AR眼镜的新拐点。 今年AR眼镜行业发展明显加快,且不断有大厂入局:今年2月小米发布无线AR眼镜探索版;3月荣耀也推出了一款全新的观影眼镜;而苹果在6月发布的MR头显Vision Pro更是为业界投下了一颗重磅炸弹,加速了AR的迅猛

    2024年02月15日
    浏览(42)
  • 时序预测 | MATLAB实现AR、ARMA、ARIMA时间序列预测模型答疑

    基本介绍 AR 自回归模型(Autoregressive Model),通常简称为AR模型,是一种用于时间序列分析和预测的统计模型。它基于时间序列自身的历史值来预测未来值,通过将当前时刻的观测值与前一时刻的观测值之间的关系进行建模。 AR模型的基本思想是,当前时刻的值可以由之前时

    2024年02月09日
    浏览(48)
  • 时间序列基础操作:使用python与eviews对AR与ARMA模型进行定阶与预报

    一般处理时间序列的基本过程:(无季节趋势) 处理时间序列的简单过程(无季节趋势) 注:上图中LB检验的统计量纠正:n*(n+2),而不是n*(n-2)  几种基础时间序列模型(模型的具体形式补充见文末): 目录 一、Python处理 1.1.step1:平稳性检验与白噪音检验 1.1.1平稳性检验:

    2024年02月07日
    浏览(40)
  • 时序预测 | Python实现AR、ARMA、ARIMA时间序列预测

    预测效果 基本介绍 Python实现AR、ARMA、ARIMA时间序列预测 模型原理 AR、ARMA、ARIMA都是常用的时间序列预测方法,它们的主要区别在于模型中包含的自回归项和移动平均项的数量和阶数不同。 AR模型(Autoregressive Model)是一种仅包含自回归项的模型,它的基本思想是将当前时刻的

    2024年02月10日
    浏览(41)
  • ARToolKitPlus是一个开源的Python库,用于实现增强现实(AR)应用程序

    ARToolKitPlus是一个开源的Python库,用于实现增强现实(AR)应用程序。它提供了一组工具和API,使开发人员能够轻松地创建AR应用程序,并与各种AR硬件设备集成。 要开始使用ARToolKitPlus,您需要安装它。您可以使用pip来安装ARToolKitPlus: ```shell pip install artoolkitplus ``` 一旦安装完成,

    2024年02月04日
    浏览(36)
  • AR模型及其平稳性

    具有如下结构的模型称为p阶自回归模型,简记为AR§: x t = ϕ 0 + ϕ 1 x t − 1 + ϕ 2 x t − 2 + ϕ 3 x t − 3 . . . + + ϕ p x t − p + ϵ t x_t=phi_0+phi_1x_{t-1}+phi_2x_{t-2}+phi_3x_{t-3}...++phi_p x_{t-p}+epsilon_t x t ​ = ϕ 0 ​ + ϕ 1 ​ x t − 1 ​ + ϕ 2 ​ x t − 2 ​ + ϕ 3 ​ x t − 3 ​ . . . + + ϕ p ​

    2024年02月02日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包