MATLAB环境下一种贝叶斯稀疏盲反卷积算法

news2024/11/18 1:37:18

稀疏盲反卷积贝叶斯估计方法通常使用伯努利-高斯分布(BG)先验的稀疏序列建模,并利用马尔可夫链蒙特卡罗(MCMC)方法进行未知估计。然而,BG模型的离散性会有计算瓶颈。为了解决这个问题,提出一个替代方案,采用MCMC方法对稀疏序列进行建模(使用正反伽马先验)。除了稀疏性,还考虑了时间以及卷积序列的频域约束,通过广泛的模拟和表征计算增益相对于利用BG建模的现有方法证明了提出方法的有效性。

clear all;
close all;
addpath(strcat(pwd,'\solvers'));
addpath(strcat(pwd,'\datasets'))
% change file_name to the '.mat' file containing the data
file_name = strcat(pwd,'\datasets\mendel_sequence_data');
% load data | this function must be updated/changed according to the 
% structure of the input data file
data = get_data(file_name);
% get parameters
params = get_params(data);
% run the sampler and get the samples from the posterior distribution
[samples,diagnostics] = run_MCMC(data,params);
% get estimates from the samples
MMSE_estimates = get_estimates(samples,params);
% correct time-shift and scaling ambiguities to match the true sequences
if isfield(data,'x_true') && isfield(data,'h_true')
    [MMSE_estimates_corrected,samples_corrected] = correct_shift_and_scale(MMSE_estimates,samples,data,params);
    
    figure;plot(data.x_true);hold on;grid on;plot(MMSE_estimates_corrected.x);
    xlabel('n');ylabel('Amplitude');legend('True Sequence','Recovered Sequence');
    title('Recovered Sparse Sequence');

    figure;plot(data.h_true);hold on;grid on;plot(MMSE_estimates_corrected.h);
    xlabel('n');ylabel('Amplitude');legend('True Sequence','Recovered Sequence');
    title('Recovered Pulse Sequence');
else
    figure;plot(MMSE_estimates.x);grid on;
    xlabel('n');ylabel('Amplitude');title('Recovered Sparse Sequence');

    figure;plot(MMSE_estimates.h);grid on;
    xlabel('n');ylabel('Amplitude');title('Recovered Pulse Sequence');
end

function [MMSE_estimates] = get_estimates(samples,params)
    burn_in_ratio = params.burn_in_ratio;
    discarded_samples = burn_in_ratio*params.num_of_MCMC_iteration;
    
    if params.solver == "NIGS1" || params.solver == "NIGS2"
        MMSE_estimates.x = mean(samples.x(:,discarded_samples:end),2);
        MMSE_estimates.h = mean(samples.h(:,discarded_samples:end),2);
        MMSE_estimates.lambda_x = mean(samples.lambda_x(:,discarded_samples:end),2);
        MMSE_estimates.lambda_v = mean(samples.lambda_v(:,discarded_samples:end),2);
    else
        MMSE_estimates.x = mean(samples.x(:,discarded_samples:end),2);
        MMSE_estimates.h = mean(samples.h(:,discarded_samples:end),2);
        MMSE_estimates.s = mean(samples.s(:,discarded_samples:end),2);
        MMSE_estimates.lambda_v = mean(samples.lambda_v(:,discarded_samples:end),2);
    end
end

function [MMSE_estimates_corrected,samples_corrected] = correct_shift_and_scale(MMSE_estimates,samples,data,params)
    h_true = data.h_true;
    
    h_est = MMSE_estimates.h;
    x_est = MMSE_estimates.x;
    if params.solver == "NIGS1" || params.solver == "NIGS2"
        lambda_x_est = MMSE_estimates.lambda_x;
    else
        s_est = MMSE_estimates.s;
    end
    lambda_v_est = MMSE_estimates.lambda_v;
    T = length(h_est);
    
    delay_array = -round(T/2):round(T/2);
    error = zeros(length(delay_array),1);
    alpha = zeros(length(delay_array),1);
    for n = 1:length(delay_array)
        h_shifted = circshift(h_est,delay_array(n));
        alpha(n) = (h_shifted'*h_true)/(h_shifted'*h_shifted);
        h_shifted_scaled = alpha(n)*h_shifted;
        error(n) = sum(abs(h_shifted_scaled - h_true).^2);
    end
    [~,min_idx] = min(error);
    MMSE_estimates_corrected.h = circshift(h_est,delay_array(min_idx))*alpha(min_idx);
    MMSE_estimates_corrected.x = circshift(x_est,-delay_array(min_idx))/alpha(min_idx);
    if params.solver == "NIGS1" || params.solver == "NIGS2"
        MMSE_estimates_corrected.lambda_x = circshift(lambda_x_est,-delay_array(min_idx),1)*(alpha(min_idx)^2);
    else
        MMSE_estimates_corrected.s = circshift(s_est,-delay_array(min_idx),1)*(alpha(min_idx)^2);
    end
    MMSE_estimates_corrected.lambda_v = lambda_v_est;
    
    samples_corrected.h = circshift(samples.h,delay_array(min_idx))*alpha(min_idx);
    samples_corrected.x = circshift(samples.x,-delay_array(min_idx))/alpha(min_idx);
    if params.solver == "NIGS1" || params.solver == "NIGS2"
        samples_corrected.lambda_x = circshift(samples.lambda_x,-delay_array(min_idx),1)*(alpha(min_idx)^2);
    else
        samples_corrected.s = circshift(samples.s,-delay_array(min_idx),1);
    end
end

工学博士,担任《Mechanical System and Signal Processing》审稿专家,担任
《中国电机工程学报》优秀审稿专家,《控制与决策》,《系统工程与电子技术》,《电力系统保护与控制》,《宇航学报》等EI期刊审稿专家。
擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac下查看、配置和使用环境变量

Mac下查看、配置和使用环境变量 一:Mac怎么查看环境变量命令 printenv一:这个命令会一次性列出所有环境变量的键值对,输出格式为: VAR1value1 VAR2value2 ...二: 也可以通过给这个命令加上环境变量名参数&#xff0…

Linux CPU 负载说明

一、背景 工作中我们经常遇到CPU 负载高,CPU负载高意味着什么? CPU的负载是怎么计算的? top指令中的各个指标代表什么含义? 二、CPU 负载计算方法 在系统出现负载问题,通常会使用uptime和top确认负载,这两…

云微呼云呼叫中心:颠覆传统客户服务模式的数字化创新

1. 引言 随着云计算技术的不断成熟和普及,云呼叫中心作为一种全新的客户服务解决方案,正在以其高效、灵活和智能的特点,逐渐颠覆传统的客户服务模式。本文将深入探讨云呼叫中心的定义、特点、优势以及对企业的重要意义。 2. 云呼叫中心的定…

龙行龘龘•前程朤朤 | 联诚发2023年度述职大会与年会圆满举行

1月27日上午,以“不忘初心・砥砺前行”为主题的2023年度述职大会在联诚发深圳总部隆重举行,本次大会总结了过去一年的成就与不足,展望了未来一年的方向和目标。联诚发创始人兼总裁龙平芳、董秘毛强军、各部门负责人以及深圳总部全体职工出席了…

JSP概述和基本使用

1,JSP 概述 JSP(全称:Java Server Pages):Java 服务端页面。是一种动态的网页技术,其中既可以定义 HTML、JS、CSS等静态内容,还可以定义 Java代码的动态内容,也就是 JSP HTML Jav…

LabVIEW探测器CAN总线系统

介绍了一个基于FPGA和LabVIEW的CAN总线通信系统,该系统专为与各单机进行系统联调测试而设计。通过设计FPGA的CAN总线功能模块和USB功能模块,以及利用LabVIEW开发的上位机程序,系统成功实现了CAN总线信息的收发、存储、解析及显示功能。测试结…

【更新】省级产业结构合理化+高度化+高级化数据(2000-2022年)

数据指标测算: (1)参考袁航等人(2018)的测算方法,采用泰尔指数来衡量产业结构合理化指标,用产业结构层次系数来表示产业结构高度化指标: (2)参考张欣艳等人&…

免费分享一套微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) ,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的微信小程序外卖跑腿点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现) ,分享下哈。 项目视频演示 【免费】微信小程序外卖跑腿点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现)…

解锁亚马逊鲲鹏系统奥秘:自动生成AI角色,随心定制养号计划

亚马逊鲲鹏系统是一款强大的软件,是一款可以批量注册亚马逊买家账号并能自动化养号的软件。其独特的功能和操作流程使得用户能够轻松管理多个账号,实现高效的运营和管理。 首先,该软件提供了AI智能养号功能,用户可以自动生成具有真…

TensorFlow2实战-系列教程4:数据增强:keras工具包/Data Augmentation

🧡💛💚TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 对于图像数据,将其进行翻转、放缩、平移、旋转操作就可以得到一组新的数据…

【JavaScript基础入门】05 JavaScript基础语法(三)

JavaScript基础语法(三) 目录 JavaScript基础语法(三)数组概述数组语法多维数组 操作数组修改数组获取数组长度数组和字符串之间的转换添加和删除数组项 Null 和 Undefined字符串连接字符串字符串转换获取字符串的长度在字符串中查…

Python之代码覆盖率框架coverage使用介绍

Python代码覆盖率工具coverage.py其实是一个第三方的包,同时支持Python2和Python3版本。 安装也非常简单,直接运行: pip install coverage 安装完成后,会在Python环境下的\Scripts下看到coverage.exe; 首先我们编写…

Linux(4)——Linux用户和用户组管理

Linux用户和用户组管理 插播!插播!插播!亲爱的朋友们,我们的Cmake/Makefile/Shell这三个课程上线啦!感兴趣的小伙伴可以去下面的链接学习哦~ 构建工具大师-CSDN程序员研修院 Linux用户和用户组管理是系统管理中非常重…

SharedPreferences卡顿分析

SP的使用及存在的问题 SharedPreferences(以下简称SP)是Android本地存储的一种方式,是以key-value的形式存储在/data/data/项目包名/shared_prefs/sp_name.xml里,SP的使用示例及源码解析参见:Android本地存储之SharedPreferences源码解析。以…

条件变量、线程池以及线程的GDB调试学习笔记

目录 一、条件变量 二、线程池概念和实现 三、线程的GDB调试 一、条件变量 应用场景:生产者消费者问题,是线程同步的一种手段。 必要性:为了实现等待某个资源,让线程休眠,提高运行效率 使用步骤: 初始…

【ArcGIS微课1000例】0096:dem三维块状表达(层次地形模型)

文章目录 一、DEM表达方式二、层次模型表达三、注意事项一、DEM表达方式 DEM数字高程模型的表达方式通常有以下4种: 1. 规则格网 2. 不规则三角网 3. 等高线 4. 层次地形模型 作为栅格地理数据,DEM 数据具有2.5维的特征,能够以三维表面的形式进行三维空间表达。但受其数…

幻兽帕鲁Linux私服搭建备份迁移指南

幻兽帕鲁Linux私服搭建指南 文档参考 !!!说明:不只是幻兽帕鲁,后续大家想自己搭私服玩别的Steam游戏,大部分内容都可以做一个参考 Linux安装steamcmd Linux开服步骤 游戏配置修改 Youtobe视频教程 配…

Linux中禅道12.5一键部署安装过程笔记

1. Linux中禅道12.5一键部署安装过程笔记 文章目录 1. Linux中禅道12.5一键部署安装过程笔记1. 安装1.将安装包直接解压到/opt目录下2. Apache和Mysql常用命令3. 访问和登录禅道4. 其他 2. 访问数据库1. 网页登录数据库2. 命令行连接数据库 3. 9.2.stable版本起Linux一键安装包…

vue3前端开发,vue-router路由的配置和解释

vue3前端开发,vue-router路由的配置和解释!为了实现本次springbootvue3.测试支付宝在线支付沙盒测试的效果,我们现在已经开始搭建了一个基础的vue3项目。今天这篇文章是为大家提前普及一下,vue-router的一些基础内容。 如图,我们在…

从零开始:CentOS系统下搭建DNS服务器的详细教程

前言 如果你希望在CentOS系统上建立自己的DNS服务器,那么这篇文章绝对是你不容错过的宝藏指南。我们提供了详尽的步骤和实用技巧,让你能够轻松完成搭建过程。从安装必要的软件到配置区域文件,我们都将一一为你呈现。无论你的身份是运维人员,还是程序员,抑或是对网络基础设…