基于卷积神经网络的信号解卷积(简单版,MATLAB)

简单演示一下基于卷积神经网络的信号解卷积,有个大致印象即可。

构造卷积滤波器

r = 0.9; % Define filter
om = 0.95;
a = [1 -2*r*cos(om) r^2];
b = [1 r*cos(om)];
h = filter(b, a, [zeros(1,38) 1 zeros(1,40)]);
N = 500;
K = 25;
sigma = 1;

绘制输入信号分量

set_plot_defaults('on')
hh = filter(b, a, [1 zeros(1,40)]);
groundtruth = zeros(1, N);
index_random = randperm(N);
index = index_random(1:K);
groundtruth(index) = 10*2*(rand(1,K) - 0.5);
after_conv = conv(groundtruth,h,'same');
noise = sigma * randn(1,N);
input = after_conv + noise;
figure(1)
subplot(2,2,1)
plot(1:N, groundtruth)
title('S[n]')
ylim([-10 10])
xlim([1,500])
box off
subplot(2,2,2)
plot(1:41, hh)
title('C[n]')
ylim([-1.2 1.8])
xlim([1,41])
box off
subplot(2,2,3)
plot(1:N, noise)
title('N[n]')
ylim([-10 10])
xlim([1,500])
box off
subplot(2,2,4)
plot(1:N, input)
title('x[n]')
ylim([-16 16])
xlim([1,500])
box off

加载3层解卷积CNN

load('sin2.mat');
deconvolver{1} = double(conv1);
deconvolver{2} = double(conv2);
deconvolver{3} = double(conv3);
% deconvolver{4} = double(conv4);
% deconvolver{5} = double(conv5);

绘制3层CNN的结构

set_plot_defaults('on')
figure(2)
[r,c,~] = size(deconvolver{1});
for i=1:1:r
for j=1:1:c
subplot(r,c,c*i-(c-j))
stem(flip(squeeze(deconvolver{1}(i,j,:))), 'filled', 'MarkerSize', 2)
hold on
plot(flip(squeeze(deconvolver{1}(i,j,:))))
hold off
xlim([0,18])
ylim([-1,1])
box off
end
end
sgtitle('layer1 (2x1)', 'FontSize', 10);

figure(3)
title('Layer 2')
[r,c,~] = size(deconvolver{2});
for i=1:1:r
for j=1:1:c
subplot(r,c,c*i-(c-j))
stem(flip(squeeze(deconvolver{2}(i,j,:))), 'filled', 'MarkerSize', 2)
hold on
plot(flip(squeeze(deconvolver{2}(i,j,:))))
hold off
xlim([0,38])
ylim([-0.25,inf])
box off
end
end
sgtitle('layer2 (2x2)', 'FontSize', 10);

figure(4)
title('Layer 3')
[r,c,~] = size(deconvolver{3});
for i=1:1:r
for j=1:1:c
subplot(r,c,c*i-(c-j))
stem(flip(squeeze(deconvolver{3}(i,j,:))), 'filled', 'MarkerSize', 2)
hold on
plot(flip(squeeze(deconvolver{3}(i,j,:))))
hold off
box off
end
end
sgtitle('layer3 (1x2)', 'FontSize', 10);

加载CNN

load('sin23_2.mat');
deconvolver{1} = double(conv1);
deconvolver{2} = double(conv2);
deconvolver{3} = double(conv3);
deconvolver{4} = double(conv4);
deconvolver{5} = double(conv5);

绘制CNN的第2层和第3层特征

set_plot_defaults('on')
figure(5)
[r,c,~] = size(deconvolver{2});
for i=1:1:r
for j=1:1:c
subplot(r,c,c*i-(c-j))
stem(flip(squeeze(deconvolver{2}(i,j,:))), 'filled', 'MarkerSize', 2)
hold on
plot(flip(squeeze(deconvolver{2}(i,j,:))))
hold off
xlim([1,17])
box off
end
end
sgtitle('layer2 (2x2)', 'FontSize', 10);

figure(6)
[r,c,~] = size(deconvolver{3});
for i=1:1:r
for j=1:1:c
subplot(r,c,c*i-(c-j))
stem(flip(squeeze(deconvolver{3}(i,j,:))), 'filled', 'MarkerSize', 2)
hold on
plot(flip(squeeze(deconvolver{3}(i,j,:))))
hold off
xlim([1,17])
box off
end
end
sgtitle('layer3 (2x2)', 'FontSize', 10);

绘制每一层的输出

groundtruth = zeros(1, N);
index_random = randperm(N);
index = index_random(1:K);
groundtruth(index) = 10*2*(rand(1,K) - 0.5);
after_conv = conv(groundtruth,h,'same');
noise = sigma * randn(1,N);
input = after_conv + noise;
figure(7)
plot(1:N, groundtruth)
title('The original sparse signal')
xlim([1,500])
ylim([-10,10])
box off

figure(8)
plot(1:N, input)
title('The input signal')
xlim([1,500])
ylim([-20,20])
box off

set_plot_defaults('on')
l1 = layer(input,deconvolver{1});
l2 = layer(l1,deconvolver{2});
l3 = layer(l2,deconvolver{3});
l4 = layer(l3,deconvolver{4});
output = CNN(input,deconvolver);
figure(9)
subplot(2,1,1)
plot(1:N, l1(1,:))
title('x_{1,1}[n]')
xlim([1,500])
ylim([-1,10])
box off
subplot(2,1,2)
plot(1:N, l1(2,:))
title('x_{1,2}[n]')
xlim([1,500])
ylim([-1,10])
box off

figure(10)
subplot(2,1,1)
plot(1:N, l3(1,:))
title('x_{3,1}[n]')
xlim([1,500])
ylim([-1,10])
box off
subplot(2,1,2)
plot(1:N, l3(2,:))
title('x_{3,2}[n]')
xlim([1,500])
ylim([-1,10])
box off

figure(11)
subplot(2,1,1)
plot(1:N, l4(1,:))
title('c_1[n]')
xlim([1,500])
ylim([-1,20])
box off
subplot(2,1,2)
plot(1:N, l4(2,:))
title('c_2[n]')
xlim([1,500])
ylim([-1,20])
box off

figure(12)
plot(1:N, output)
title('y[n]')
xlim([1,500])
ylim([-10,10])
box off

构造卷积滤波器并加载所提出的CNN

clc;
clear
r = 0.9; % Define filter
om = 0.95;
a = [1 -2*r*cos(om) r^2];
b = [1 r*cos(om)];
h = filter(b, a, [zeros(1,38) 1 zeros(1,40)]);
hh = filter(b, a, [1 zeros(1,40)]);
inverse = filter(1,hh,[zeros(1,36) 1 zeros(1,34)]);
load('sin23_2.mat');
deconvolver{1} = double(conv1);
deconvolver{2} = double(conv2);
deconvolver{3} = double(conv3);
deconvolver{4} = double(conv4);
deconvolver{5} = double(conv5);

构造测试信号

K = 25;
N = 500;
sigma = 0.5;
groundtruth = zeros(1, N);
index_random = randperm(N);
index = index_random(1:K);
groundtruth(index) = 10*2*(rand(1,K) - 0.5);
after_conv = conv(groundtruth,h,'same');
noise = sigma*randn(1,N);
input = after_conv + noise;

%% Plot input v.s. output in pure signal case
set_plot_defaults('on')
figure(13)
output = CNN(after_conv,deconvolver);
subplot(4,1,1)
plot(1:N, groundtruth)
xlim([1,500])
ylim([-10,10])
title('pure signal')
box off
subplot(4,1,2)
plot(1:N, after_conv)
xlim([1,500])
ylim([-15,15])
title('signal after convolution')
box off
subplot(4,1,3)
plot(1:N, after_conv)
xlim([1,500])
ylim([-15,15])
title('input signal')
box off
subplot(4,1,4)
plot(1:N, output)
xlim([1,500])
ylim([-10,10])
title('output signal')
box off

figure(14)
output1 = conv(after_conv,inverse,'same');
stem(1:N, groundtruth, 'b', 'MarkerSize', 4)
hold on
plot(1:N, output, 'ro', 'MarkerSize', 4)
hold on
plot(1:N, output1, 'gv', 'MarkerSize', 4)
hold off
legend('pure sparse signal', 'output of CNN','output of inverse filter')
box off

figure(15)
output = CNN(noise,deconvolver);
subplot(4,1,1)
plot(1:N, zeros(1,N))
xlim([1,500])
ylim([-2,2])
title('pure signal')
box off
subplot(4,1,2)
plot(1:N, zeros(1,N))
xlim([1,500])
ylim([-2,2])
title('signal after convolution')
box off
subplot(4,1,3)
plot(1:N, noise)
xlim([1,500])
ylim([-2,2])
title('input signal')
box off
subplot(4,1,4)
plot(1:N, output)
xlim([1,500])
ylim([-2,2])
title('output signal')
box off
%

figure(16)
output1 = conv(noise,inverse,'same');
stem(1:N, zeros(1,N), 'b', 'MarkerSize', 4)
hold on
plot(1:N, output, 'ro', 'MarkerSize', 4)
hold on
plot(1:N, output1, 'gv', 'MarkerSize', 4)
hold off
legend('pure sparse signal', 'output of CNN','output of inverse filter')
box off

figure(17)
output = CNN(input,deconvolver);
subplot(4,1,1)
plot(1:N, groundtruth)
xlim([1,500])
ylim([-10,10])
title('pure signal')
box off
subplot(4,1,2)
plot(1:N, after_conv)
xlim([1,500])
ylim([-15,15])
title('signal after convolution')
box off
subplot(4,1,3)
plot(1:N, input)
xlim([1,500])
ylim([-15,15])
title('input signal')
box off
subplot(4,1,4)
plot(1:N, output)
xlim([1,500])
ylim([-10,10])
title('output signal')
box off

figure(18)
output1 = conv(input,inverse,'same');
stem(1:N, groundtruth, 'b', 'MarkerSize', 4)
hold on
plot(1:N, output, 'ro', 'MarkerSize', 4)
hold on
plot(1:N, output1, 'gv', 'MarkerSize', 4)
hold off
legend('pure sparse signal', 'output of CNN','output of inverse filter')
box off

%% Create input signal (noisy signal) and ground truth (pure signal) for the performance part.
% N is the total length of the pure sparse signal.
% K is the number of non-zeros in the pure sparse signal.
% As a result, 1-K/N determines the sparsity of the pure signal.
N = 500;
num = 2000;
sigma_set = logspace(log10(0.1), log10(2), 20);
% sigma_set = 0.1:0.1:2;
MSE_output_ave = zeros(3,length(sigma_set));
SNR_output_ave = zeros(3,length(sigma_set));
for m = 1:1:3
K = 25 * m;
for i = 1:1:length(sigma_set)
sigma = sigma_set(i);
SNR_output = zeros(1,num);
SNR_input = zeros(1,num);
MSE_output = zeros(1,num);
for j = 1:1:num
groundtruth = zeros(1, N);
index_random = randperm(N);
index = index_random(1:K);
groundtruth(index) = 10*2*(rand(1,K) - 0.5);
% groundtruth(index) = 10*randn(1,K);
after_conv = conv(groundtruth,h,'same');
input_noise = sigma*randn(1,N);
input = after_conv + input_noise;
output = CNN(input, deconvolver);
noise = output - groundtruth;
MSE_output(j) = mean(noise.^2);
SNR_output(j) = 10*log10(mean(groundtruth.^2)/MSE_output(j));
end
SNR_output_ave(m,i) = mean(SNR_output);
% MSE_output_ave(m,i) = mean(MSE_output);
MSE_output_ave(m,i) = sqrt(mean(MSE_output));
end
end

%% Plot the performance v.s. sparsity and noise level
set_plot_defaults('on')
figure(19)
semilogx(sigma_set,SNR_output_ave(1,:),'r.-',sigma_set,SNR_output_ave(2,:),'k.-',sigma_set,SNR_output_ave(3,:),'g.-')
legend('Sparsity = 95%','Sparsity = 90%','Sparsity = 85%')
xlabel('σ')
ylabel('SNR in dB')
set(gca, 'xtick', [0.1 0.2 0.5 1 2.0])
xlim([min(sigma_set) max(sigma_set)])
box off

figure(20)
semilogx(sigma_set,MSE_output_ave(1,:),'r.-',sigma_set,MSE_output_ave(2,:),'k.-',sigma_set,MSE_output_ave(3,:),'g.-')
legend('Output RMSE, sparsity = 95%','Output RMSE, sparsity = 90%','Output RMSE, sparsity = 85%', 'Location','NorthWest')
xlabel('σ')
ylabel('RMSE')
set(gca, 'xtick', [0.1 0.2 0.5 1 2.0])
xlim([min(sigma_set) max(sigma_set)])
box off

工学博士,担任《Mechanical System and Signal Processing》《中国电机工程学报》等期刊审稿专家,擅长领域:现代信号处理,机器学习/深度学习,时间序列分析/预测,设备智能故障诊断与健康管理PHM等。

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

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

相关文章

LabelImg下载及目标检测数据标注

为什么这一部分内容这么少会单独拎出来呢,因为后期会接着介绍YOLOv8中的其他任务,会使用其他软件进行标注,所以就单独区分开来每一个任务的标注方式了。 这一部分就介绍目标检测任务的标注,数据集是我从COCO2017Val中抽出来两类&a…

移动端自动化测试工具 Appium 之元素操作小技巧

文章目录 一、背景二、TestNG常用注解三、实战3.1、集成启动类3.2、采用xpath定位元素3.3、编写通用判断类3.4、编写测试类3.5、遍历实现 四、总结 一、背景 appium自动化工作中,元素操作最常用的就是Id/xpath,因为【appium1.5.0后,不支持使…

解决在Outlook中预定Teams会议不显示入会链接的问题

今天遇到一个很蛋疼的teams问题,花了点时间才解决。本来以为是很简单的问题,随便网上冲浪一下就能找到答案的,结果根本就没有好的解决方案,所以我分享出来希望后来的老哥少走点弯路。 问题描述 简单来说,就是在Outlo…

IST——In-System-Test

1、背景 安全性是自动驾驶平台的关键特性之一,而这些架构中使用的半导体芯片必须保证ISO 26262标准所要求的功能安全方面。为了监控由于现场缺陷导致的故障,在启动和/或关闭期间会自动运行系统内结构测试。当系统内测试(IST,In-Sy…

【声明ACL权限】

声明ACL权限 当应用在申请权限来访问必要的资源时,发现部分权限的等级比应用APL等级高,开发者可以选择通过ACL方式来解决等级不匹配的问题。 举例说明,如果应用需要使用全局悬浮窗,需要申请 ohos.permission.SYSTEM_FLOAT_WINDO…

shell脚本脚本变量

shell脚本的概念: 1.讲要执行的命令按顺序保存到一个文本文件 2.给文件可执行权限 3.可以结合各种shell控制语句以完成更复杂的操作 linux中包含shell的文件有 [rootlocalhost ~]# cat /etc/shells /bin/sh #UNIX最初使用的 shell,已经被…

正点原子i.MX 93开发板,双核A55+M33+NPU,双路RS485FDCAN千兆网,异核/AI/工业开发!

正点原子i.MX 93开发板新品上市!双核A55M33NPU,双路RS485&FDCAN&千兆网,异核/AI/工业开发! NXP的i.MX系列是一系列面向多媒体和工业应用的ARM架构微处理器。从i.MX6U到i.MX93,这一系列经历了显著的发展&#x…

Vue框架学习记录

概览 前置知识 准备工作 安装环境准备 #安装node.js #安装npm #安装vue cli基于脚手架创建前端工程 方式一 #创建一个保存vue项目的目录,如vue_project #在vue_project下进入cmd vue create vue-demo-1方式二 #在cmd下输入 vue ui选择vue2#成功之后的界面#打开…

[oeasy]python0015_键盘改造_将esc和capslock对调_hjkl_移动_双手正位

键盘改造 &#x1f94b; 回忆上次内容 上次练习了复制粘贴 按键 作用 <kbd>y</kbd><kbd>y</kbd> 复制光标行代码 到剪贴板 <kbd>p</kbd> 粘贴剪贴板中的内容 <kbd>i</kbd> 切换到 插入模式 <kbd>h</kbd>…

DC-DC电路中电感的下方该不该挖空

DC-DC电路中的电感下方该不该挖空&#xff1f; 在回答这个问题之前&#xff0c;先来了解一下DC-DC电路中常见的功率电感类型 一&#xff0e;DC-DC电路常用功率电感类型 图1 DC-DC电路常用电感类型 这四种类型电感&#xff0c;按照无屏蔽电感→磁封胶半屏蔽电感→组装式全屏蔽…

DDM-MIMO-FMCW雷达MATLAB仿真

本文在前期TDM和BPM体制的基础上&#xff0c;仿真DDM体制下的调制解调和信号处理测距、测速、测角流程。 TDM和BPM相关可以看这两篇博文TDM(BPM)-MIMO-FMCW雷达仿真-CSDN博客&#xff0c;确定性最大似然&#xff08;DML&#xff09;估计测角-CSDN博客TDM(BPM)-MIMO-FMCW雷达仿真…

Gartner发布应对动荡、复杂和模糊世界的威胁形势指南:当前需要应对的12种不稳定性、不确定性、复杂和模糊的安全威胁

当今世界是动荡&#xff08;Volatile&#xff09;、复杂&#xff08;Complex&#xff09;和模糊&#xff08;Ambiguous&#xff09;的&#xff0c;随着组织追求数字化转型以及犯罪分子不断发展技术&#xff0c;由此产生的安全威胁也是波动性、不确定性、复杂性和模糊性的&#…

【LeetCode刷题记录】简单篇-108-将有序数组转换为二叉搜索树

【题目描述】 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 【测试用例】 示例1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,…

【功耗问题排查】

一、如何处理具体功耗case 在手机功耗测试中&#xff0c;因为我们在功耗测试中&#xff08;电源电压&#xff09;为固定值&#xff08;老手机一般为3.8V左右&#xff0c;现在的大多项目采用4V左右&#xff09;&#xff0c;那么的大小直接由决定&#xff0c;所以&#xff0c;在沟…

webassembly入门详解(C++)

一、环境配置 环境说明,操作系统为window操作系统。 1.1 下载和安装python 下载 需要python版本至少3.6版本 python下载地址:https://www.python.org/getit/ 安装 检测安装结果 win+R组合键->cmd->输入python->回车 1.2 下载和安装emsdk 下载 下载地址:https://gi…

vs2019 - 替换vs2019自带的cmake

文章目录 vs2019 - 替换vs2019自带的cmake概述笔记启动vs2019本地x64命令行的脚本查看vs2019自带的cmake的位置删掉旧版cmake将新版cmake的安装目录内容替换过来。查看vs2019本地x64命令行中的cmake版本配置为vs2019x64工程END vs2019 - 替换vs2019自带的cmake 概述 在看一个…

项目启动后 数据库表结构会被自动修改 删除字段

问题还原 我这表是有warehouse_code这个字段的 然后我启动项目后&#xff0c;发现这个字段被删除了 解决办法 看你的配置中是否有下面的配置 把这个配置删除就行了&#xff0c;这配置是根据Java实体来来创建修改数据库结构的

LINUX 入门 4

LINUX 入门 4 day6 7 20240429 20240504 耗时&#xff1a;240min 课程链接地址 第4章 LINUX环境编程——实现线程池 C基础 第3节 #define里面的行不能乱空行&#xff0c;要换行就打\ typedef 是 C 和 C 中的一个关键字&#xff0c;用于为已有的数据类型定义一个新的名字。…

SpringBoot 自定义 HandlerMethodArgumentResolver 搞定xml泛型参数解析

文章目录 介绍一、解析简单 xml 数据案例引入 Jackson 的 xml 支持定义 Message 对象&MessageHeader 对象定义 Controller 方法调用结果 二、解析带泛型的 XML 数据案例2.1 直接给 Message 加上泛型 T2.2 无法直接解析泛型参数了 三、自定义 MVC 的参数解析器实现泛型参数解…

OCR文本识别模型CRNN

CRNN网络结构 论文地址&#xff1a;https://arxiv.org/pdf/1507.05717 参考&#xff1a;https://blog.csdn.net/xiaosongshine/article/details/112198145 git:https://github.com/shuyeah2356/crnn.pytorch CRNN文本识别实现端到端的不定长文本识别。 CRNN网络把包含三部分&…