现代信号处理实验:MATLAB实现LD算法进行AR估计

MATLAB实现LD算法进行AR估计

利用给定的一组样本数据估计一个平稳随机信号的功率谱密度称为功率谱估计,又称谱估计。谱估计的方法可以分成经典谱估计和现代谱估计。

经典谱估计又称为非参数化的谱估计,分为直接法和间接法。直接法是指直接计算样本数据的傅里叶变换,即获取频谱,然后计算频谱和其共轭的乘积,就得到功率谱;间接法是指先计算样本数据的自相关函数,然后计算自相关函数的傅里叶变换,即得到功率谱。经典谱估计存在很多的缺陷,主要原因是对数据加窗时默认在窗外未观测到的数据的自相关系数为 0,这显然是不切实际的;此外样本数据是有限长的,而经典谱估计往往需要较长的数据才能获得较好性能,而且加窗函数也容易造成谱的模糊,因此我们需要参数化的谱估计,也就是现代谱估计。

现代谱估计中一类常用的模型是AR模型估计。

AR估计原理

AR 模型的表达式为:
在这里插入图片描述

上式两边同时作 Z 变换,得到:
在这里插入图片描述

AR 模型的原理就是根据观测到的数据x(n)来估计 a i {a_i} ai,从而估计输入信号的功率谱。具体来说就是将输入信号x(n)看成一个均值为 0,方差为 σ 2 \sigma^2 σ2的高斯噪声通过信道得到的;先通过观测数据估计信道参数 a i {a_i} ai,再结合 z 变换公式来计算输入信号的功率谱。

AR 过程的线性预测和 Levinson-Durbin 算法
在这里插入图片描述

求解上述Yule-Walker方程的常用算法是 Levinson-Durbin 算法,具体推导过程如下:p-1 阶的 Yule-Walker 方程如下:

在这里插入图片描述

代码实现

算法步骤:

根据 Levinson-Durbin 算法进行递推,来计算 AR 模型的各阶参数。采用最终预测误差 FPE 法来确定 AR 模型阶数 p。

  1. 初始化:

  2. 迭代计算:

  3. 若k>p或者误差小于阈值,返回各阶次参数

  4. 对比估计信号和实际信号,观察并分析结果

代码:

LD_AR function函数存放在LD_AR.m文件中:

function [R,order, params, var] = LD_AR(x)
N = length(x)-1;

%% 自相关矩阵
R = zeros(N, 1);
for n = 1:N
   R(n) = x(1:N-n+1) * (x(n:N))' /N;
end

%% LD 算法
a = zeros(N+1,N+1);
rho = zeros(1,N+1);
FPE = zeros(1,N+1);
rho(1) = R(1);
a(1,1) = -R(2)/R(1);
rho(2) = rho(1)*(1-abs(a(1,1))^2);
FPE(1) = (N+1)/(N-1) * rho(2);
for k=2:N-1
    S = 0;
    for m = 1:k-1
        S = S + a(k-1,m) * R(k-m+1);
    end
    a(k,k) = -(R(k+1)+S)/rho(k);
    for i = 1:k-1
        a(k,i) = a(k-1,i) + a(k,k) * a(k-1,k-i);
    end
    rho(k+1) = rho(k)*(1-a(k,k)^2);
    FPE(k) = (N+k)/(N-k) * rho(k+1);
end

%% 利用FPE确定AR模型阶数
min = FPE(1);
disp 'min:'
disp(min)
for k = 2:N-1
    if abs(FPE(k))<abs(min)
        min = FPE(k);
        order = k;
    end
end
params = [1, a(order,1:order)];
var = abs(rho(order+1));
end

main.m文件:

clear;
clc;

%% 产生一组样本点
awgn_noise = randn(1,1000); 
a_model = [1 -0.6 0.4 -0.3]; 
% a_model = [1 -0.4 0.2 -0.2 0.4]; 
x = filter(1, a_model, awgn_noise);

%% LD算法估计AR参数
[R,order, a, var] = LD_AR(x)

%% 原始信号 s
number=1000;
w = linspace(-pi,pi,number); 
s = zeros([1,number]);
for m = 1:number 
    c = w(m); 
    kk = [1: length(a_model)-1];
    s(m) = 1 /(abs(1+ a_model(2:end)* exp(-1i*c*kk')))^2; 
end  

%% 估计信号 s_hat
s_hat = zeros([1,number]);
for m = 1:number 
    c = w(m); 
    kk = [1: length(a)-1];
    s_hat(m) = 1 /(abs(1+ a(2:end)* exp(-1i*c*kk')))^2; 
end  

%% 绘制频谱
figure;
set(gcf,'position',[700, 200, 1400, 350])
subplot(1,3,1);
plot(w,s, 'b');
grid on
set(gca,'Xtick',[-pi,-pi/2,0, pi/2,pi]);
set(gca,'XTickLabel',{'-pi' '-pi/2' '0' 'pi/2' 'pi'});
title('原始信号功率谱','fontsize', 12); 
xlabel('频率','fontsize', 12);
ylabel('功率','fontsize', 12);
ylim([0,7]);

subplot(1,3,2);
plot(w,s_hat, 'r-'); 
grid on
set(gca,'Xtick',[-pi,-pi/2,0, pi/2,pi]);
set(gca,'XTickLabel',{'-pi' '-pi/2' '0' 'pi/2' 'pi'});
title('LD算法进行AR估计功率谱', 'fontsize', 12); 
xlabel('频率','fontsize', 12);
ylabel('功率','fontsize', 12);
ylim([0,7]);

subplot(1,3,3);
plot(w,s,'b'); 
hold on
plot(w,s_hat, 'r--');
hold off
grid on
set(gca,'Xtick',[-pi,-pi/2,0, pi/2,pi]);
set(gca,'XTickLabel',{'-pi' '-pi/2' '0' 'pi/2' 'pi'});
title('原始信号功率谱和LD算法进行AR估计比较', 'fontsize', 12); 
xlabel('频率','fontsize', 12);
ylabel('功率','fontsize', 12);
legend('原始信号','AR估计信号')
ylim([0,7]);


% clc;
% clear;
% 
% % 构造加入高斯白噪声的样本点函数
% f1=0.4;
% f2=0.2;
% N=input('产生的样本点个数N:');
% n=1:N;
% wn=randn(1,N);% 产生高斯白噪声
% xn=sin(2*pi*f1*n+pi/3)+10*sin(2*pi*f2*n+pi/4);
% yn=xn+wn;
% 
% Rx=xcorr(yn,'biased');
% 
% k=1:N;
% f=k/N;
% Sx=abs(fft(Rx,N));
% plot(f,Sx);
% title('功率谱');
% xlabel('f');
% ylabel('Sx');
% 
% % 根据自相关函数估计f1,f2
% sxk=zeros(1,N/2);
% for k=1:N/2
%     sxk(k)=Sx(k);
% end
% 
% [pks,locs]=findpeaks(sxk,'SortStr','descend');
% locs(1)
% locs(2)
% for i=1:2
%     fprintf('预测结果:f%d=%f\n',i,locs(i)/N);
% end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/240576.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# WPF上位机开发(增强版绘图软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们写过一个绘图软件&#xff0c;不过那个比较简单&#xff0c;主要就是用鼠标模拟pen进行绘图。实际应用中&#xff0c;另外一种使用比较多的…

MySQL笔记-第18章_MySQL8其它新特性

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第18章_MySQL8其它新特性1. MySQL8新特性概述1.1 MySQL8.0 新增特性1.2 MySQL8.0移除的旧特性 2. 新特性1&#xff1a;窗口函数2.1 使用窗口…

最新鸿蒙HarmonyOS4.0开发登陆的界面1

下载deveco-studio 说明一下&#xff0c;本人只是学习中&#xff0c;现在只是拿着vue及uniapp的经验在一点一点的折腾&#xff0c;不过现在看来&#xff0c;鸿蒙入门并不是很难。也许是自己没有深入下去。 https://developer.harmonyos.com/cn/develop/deveco-studio#download…

谈谈常用的分布式ID的设计方案?

典型回答 首先&#xff0c;我们需要明确通常的分布式ID定义&#xff0c;基本的要求包括&#xff1a; 全局唯一&#xff0c;区别于单点系统的唯一&#xff0c;全局是要求分布式系统内唯一。 有序性&#xff0c;通常都需要保证生成的ID是有序递增的。例如&#xff0c;在数据库存…

循环神经网络-RNN记忆能力实验 [HBU]

目录 一、循环神经网络 二、循环神经网络的记忆能力实验 三、数据集构建 数据集的构建函数 加载数据并进行数据划分 构造Dataset类 四、模型构建 嵌入层 SRN层 五、模型训练 训练指定长度的数字预测模型 多组训练 损失曲线展示 六、模型评价 参考《神经网络与深度…

SpringCloud系列(一)| SpringCloud简介

上个系列中&#xff0c;我们已经介绍完了SpringBoot的用法&#xff0c;简单概述 springBoot Spring X, 就是对于Spring和其他技术的融合 进行了简化开发&#xff0c;所以x可以代表任何技术&#xff0c;比如 mybtis, mybatisPlus, redis.... 对于集成这些常用框架&#xff0c;…

SpringBoot之请求的详细解析

1. 请求 在本章节呢&#xff0c;我们主要讲解&#xff0c;如何接收页面传递过来的请求数据。 1.1 Postman 之前我们课程中有提到当前最为主流的开发模式&#xff1a;前后端分离 在这种模式下&#xff0c;前端技术人员基于"接口文档"&#xff0c;开发前端程序&…

电流测量原理

由于直接测量电流信号是很难的&#xff0c;但是测试电压信号比较容易&#xff0c;因此通常都是先将电流信号转换为电压信号&#xff0c;将电压信号进行调理后送至 CPU&#xff0c;CPU 通过 AD 转换得到一个码值&#xff0c;软件读出该码值&#xff0c;先根据主控的硬件设计参数…

【送书活动】探究AIGC、AGI、GPT和人工智能大模型

文章目录 前言01 《ChatGPT 驱动软件开发》推荐语 02 《ChatGPT原理与实战》推荐语 03 《神经网络与深度学习》推荐语 04 《AIGC重塑教育》推荐语 05 《通用人工智能》推荐语 后记赠书活动 前言 人工智能技术在过去几年中发展迅猛&#xff0c;得益于大数据、云计算、深度学习等…

爬虫 scrapy (十一)

目录 一、scrapy shell 1.什么是scrapy shell&#xff1f; 2.安装 ipython 3.使用scrapy shell 二、当当网案例 1.在items.py中定义数据结构 2.在dang.py中解析数据 3.使用pipeline保存 4.多条管道的使用 5.多页下载 参考 一、scrapy shell 1.什么是scrapy shell&am…

设计模式(2)--对象创建(3)--工厂方法

1. 意图 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。 工厂方法使一个类的实例化延迟到其子类。 2. 四种角色 抽象产品、具体产品、抽象构造者、具体构造者 3. 优点 3.1 仅处理抽象产品(Product)接口 3.2 给子类一个钩子(hook)以提供对象的扩展版本(父…

C/C++ 快乐数: 编写一个算法来判断一个数n是不是快乐数

题目&#xff1a; 编写一个算法来判断一个数n是不是快乐数。 快乐数的定义&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 如果这个过…

面试必备的Linux常用命令

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 Linux常用命令 1、文件及内容2、网络3、进程服务4、…

C++寻找特殊年号 2023年3月C++一级 电子学会中小学生软件编程C++等级考试一级真题答案解析

目录 C/C寻找特殊年号 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C寻找特殊年号 2023年3月 C编程等级考试一级编程题 一、题目要求 1、编程实现 年号中的每个数之和为20的年号是特殊年号。例如: 2…

计算机操作系统-第十四天

目录 前言 线程 线程机制带来的变化 线程的属性 前言 在还没有引入进程的概念时&#xff0c;系统中的各个程序只能串行执行&#xff0c;即不能边听音乐边QQ聊天&#xff0c;在引入了进程的概念后&#xff0c;就可以实现边听音乐边QQ聊天。 但是我们在使用QQ时除了聊天还会进…

Python实现多种图像去噪方法

Python实现多种图像去噪方法&#xff1a;中值滤波&#xff0c;均值滤波&#xff0c;高通滤波&#xff0c;低通滤波&#xff0c;高斯滤波&#xff0c;同态滤波 图像和视频逐渐成为人们生活中信息获取的重要来源。人们准确地获取信源发出的图像和视频信息需要保证在传输过程中的…

性能优化 vue2/vue3 通过CDN 减少项目启动时间

其实更多可以通过压缩图片等文件大小 也会让项目运行快一些 以及尽量使用异步或者懒加载 使用CDN可以避免在项目中使用npm导入Vue的依赖项&#xff0c;从而减少项目启动时的加载时间 使用方法如下 <!-- Vue 2 --> <script src"https://cdn.jsdelivr.net/npm/vue…

[Linux] Tomcat

一、Tomcat相关知识 1.1 Tomcat的简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;是 Apache 软件基金会的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。 …

防职业掉坑必看,电商设计主要做什么?

今年双十一刚结束&#xff0c;各电商平台不公布总销售额的新闻就上了热搜。外行人乍一看可能觉得消费意愿下降&#xff0c;消费水平降级&#xff0c;电商行业不景气&#xff0c;但实际上电商领域在国内突飞猛进了10几年后&#xff0c;仍然还有很大的上升空间。很多人说&#xf…

shiro入门demo(二)授权

在前面认证的基础上&#xff0c;认证通过后一般还有个授权的操作。授权根据业务需求有两种维度&#xff0c;基于角色的授权和基于资源的授权。 一、授权-基于角色授权&#xff1a; shiro中授权实现方式&#xff1a;有三种 1、编程式 Subject subject SecurityUtils.getSubje…