matlab循环卷积函数,一维卷积与循环卷积的使用(离散数据+具体例子)
前言
本人在对野外仪器数据采集的信号做一些列数字信号处理的过程中,经常遇到卷积与循环卷积。现实中,野外仪器记录到的数据都是离散的!所以我们在对数据进行FFT变换时,都默认使用的是DFT(离散傅里叶变换)。
本文目标并非介绍卷积与循环卷积的详细内容与公式,而是侧重如何编写自己的程序实现这两种操作,并简要介绍两者在使用和结果上的区别。
卷积与循环卷积区别
明确说明一点:虽然这两种操作都是对"两个信号"的处理,但两者不是同一操作!
区别1:卷积可以处理连续信号和离散信号,循环卷积只用于处理离散信号(现实中都可用);
区别2:卷积对a和b这两个信号的长度没有要求,循环卷积要求a和b信号长度一致;
区别3:设操作后的信号为c,卷积操作后c的长度为a+b-1,循环卷积长度为a(a=b)。
卷积如何使用
卷积的操作就是"循环乘积与加和"。下面结合一个具体的例子进行说明:
信号a:a = [1 3 4 9 8 7]
信号b:b = [2 4 6 3]
卷积:a*b
操作流程图如下:
离散卷积计算流程图.png
对应的Matlab语句是conv(a,b)。但是用edit conv命令查看conv的源代码时候,感觉写的很复杂,不如根据上面计算的流程图(计算原理)写自己的代码:
a = [1 3 4 9 8 7];
b = [2 4 6 3]; % a*b a在前b在后
a_length = length(a);
b_length = length(b);
r = zeros(1,a_length+b_length-1); % 记录卷积结果,总长度是a+b-1
for k = 1:a_length % a做循环总长 因为a在前所以是a在移动!
c = a(k)*b; % a所有的数都会和b数组所有元素乘一遍,但各自在r中起作用的位置不同
d = r(k:k+b_length-1); % r(k:k+wb-1)很妙!提取当前a(k)元素会影响的r的区间
d = d+c; % 把当前a(k)影响的范围"对应"加进去
r(k:k+b_length-1) = d; % 把r当前受影响的区域更新(加进去)
end
fprintf('卷积结果为:');
r
注意:进行卷积计算的两个信号谁在前谁在后结果都是一样的,即a*b = b*a;但是上面的程序还是要区分一下"谁在前"的问题(小细节,注意一下即可)。
循环卷积如何使用
循环卷积的操作一般用"傅里叶逆变换"来计算。下面结合一个具体的例子进行说明:
信号a:a = [2,1,2,1,6,2,8,9]
信号b:b = [3,4,2,4,3,5,1,8]
循环卷积:a*b
注意:两个信号的长度一样
用自己编的DFT与IDFT进行循环卷积的Matlab程序:
clc; clear;
% 手动输入的信号:
fprintf('原始信号为:\n');
a = [2,1,2,1,6,2,8,9]
b = [3,4,2,4,3,5,1,8]
N = length(a);
WN = exp(-i*2*pi/N); % 常数
WN_nk_a = zeros(N)+WN; % a的WN_kn
WN_nk_b = zeros(N)+WN; % b的WN_kn
xk_a = a'; % a时域信号振幅(列矩阵)
xk_b = b'; % b时域信号振幅(列矩阵)
E_a = zeros(N); % a的辅助的E(WN_kn的幂,单独拿出来算)
E_b = zeros(N); % a的辅助的E(WN_kn的幂,单独拿出来算)
%%% a,b信号傅里叶正变换即结果 %%%
for row = 0:N-1
for cow = 0:N-1
E_a(row+1,cow+1) = row*cow;
E_b(row+1,cow+1) = row*cow;
WN_nk_a(row+1,cow+1) = WN_nk_a(row+1,cow+1)^E_a(row+1,cow+1);
WN_nk_b(row+1,cow+1) = WN_nk_b(row+1,cow+1)^E_b(row+1,cow+1);
end
end
Xk_a = WN_nk_a * xk_a;
Xk_b = WN_nk_b * xk_b;
Xk_t = Xk_a.*Xk_b;
%%% T信号(循环卷积)傅里叶逆变换即结果 %%%
WN_nk_t = zeros(N)+WN; % t的WN_kn
E_t = zeros(N); % t的辅助的E(WN_kn的幂,单独拿出来算)
for row = 0:N-1
for cow = 0:N-1
E_t(row+1,cow+1) = -row*cow;
WN_nk_t(row+1,cow+1) = WN_nk_t(row+1,cow+1)^E_t(row+1,cow+1);
end
end
fprintf('a,b信号的循环卷积结果为:\n');
xk_t = real((WN_nk_t * Xk_t)/N)'
优势1:信号可用是任意长度(不用像FFT那种必须是2^N的长度);
优势2:完全理解其内涵。
当然,全部用Matlab自带函数写就是下面:
fprintf('原始信号为:\n');
a = [2,1,2,1,6,2,8,9]
b = [3,4,2,4,3,5,1,8]
a_tmp = fft(a);
b_tmp = fft(b); % 用FFT计算a与b信号的频域信号
r_tmp = a_tmp.*b_tmp; % 对应元素相乘(点乘)
r = ifft(r_tmp) % 反变换回去,就是a,b信号循环卷积结果(时域)
matlab循环卷积函数,一维卷积与循环卷积的使用(离散数据+具体例子)相关推荐
- 分类预测 | MATLAB实现1-DCNN一维卷积神经网络分类预测
分类预测 | MATLAB实现1-DCNN一维卷积神经网络分类预测 目录 分类预测 | MATLAB实现1-DCNN一维卷积神经网络分类预测 基本介绍 程序设计 学习总结 参考资料 基本介绍 使用卷积 ...
- matlab damp函数返回的值为什么有两行相同数据?
代码如下,普通的一阶系统,为什么工作区damp返回的值有两行一样的呢?求大佬解答 k=[2,5,10];t=0.625; gg=[];wwn=[];zz=[]; for i=1:length(k) ...
- 基于FPGA的一维卷积神经网络CNN的实现(一)框架
理论建立与效果展示 环境:Vivado2019.2. Part:xcku040-ffva1156-2-i,内嵌DSP个数 1920个,BRAM 600个也就是21.1Mb. 说明:通过识别加高斯白噪声 ...
- 矩阵一维卷积c++_深度神经网络卷积层计算加速与优化
01 传统卷积层计算 首先我们定义符号F()函数为卷积函数 一维卷积:F(n,m) n代表输出的维度,m代表滤波器的维度 二维卷积:F(n*m,r*s) n*m代表输出的维度,r*s代表滤波器的维度 ...
- keras从入门到放弃(二十二)一维卷积处理 RNN文本分类
什么是一维卷积 一维卷积 • 图中的输入的数据维度为8,过滤器的维度为5.与二维卷积类似,卷积后输出的数据维度为8−5+1=48−5+1=4. • 如果过滤器数量仍为1,输入数据的channel数量变 ...
- 实现一维卷积神经网络
实现一维卷积神经网络 1.准备IMDB数据 from keras.datasets import imdb from keras.preprocessing import sequencemax_fe ...
- MATLAB中函数find的使用方法概述,简单易懂+例子
MATLAB中函数find的使用方法总结+探索,简单易懂+例子 该函数不仅可以查找矩阵获这向量中的非零元素的位置,也可以查询满足一定逻辑条件的元素位置. find函数总共的适用方法 index = f ...
- Keras实现一维卷积(Conv1D)实例
实战一维卷积(Conv1D):kaggle叶子分类问题 通过例子理解: (1)一维卷积是如何工作的: (2)输入数据是如何构建的: 在csv文件中,数据集或者特征集的保存方式nxm,其中n为样本个数, ...
- 卷积神经网络之一维卷积、二维卷积、三维卷积
1. 二维卷积 图中的输入的数据维度为14×1414×14,过滤器大小为5×55×5,二者做卷积,输出的数据维度为10×1010×10(14−5+1=1014−5+1=10).如果你对卷积维度的计算不 ...
最新文章
- 靶向新冠状病毒(COVID-19)的药物靶点
- MySQL用户管理、常用sql语句、数据库备份
- SHELL syntax error:unexpected end of file 提示错误
- docker-compose 1.29.2 下载地址
- 云视睿博流媒体服务器Lit,《云视睿博流媒体服务器参数表.docx
- 环境变量_配置JAVA环境变量
- cron每2天跑一次_直购直测,进口新极光每2年或34000公里才需要保养一次?
- raspberry pi_2018十大Raspberry Pi故事
- ubuntu配置fastdfs+Nginx
- ps-色彩饱和度的设计
- manjaro linux vmware,Manjaro Linux处理vmware的vmmon、vmnet8、Network configuration is missing一堆问题的记录...
- 游戏开发中的沟通成本
- 能不用事务就尽量别用
- C语言结业作业,2019年本科课程-C语言程序设计结业试卷(附答案).doc
- badfail@qq.com+java_Java KeeperException.BadArgumentsException方法代码示例
- <MySQL>表中添加和删除字段
- OpenMPI:介绍与an'zhuang
- thisis incompatible with sql_mode=only_full_group
- 浏览器内核学习笔记二
- kali子系统安装教程(包含避坑指南,新手必看!)
热门文章
- 红旗linux服务器操作系统 Asianux V8.1 (欧拉版) 系统安装
- user is not in the sudoers file. This incident will be reported 解决方法
- es分布式架构和原理分析
- python 怎样调用硬件_如何使用python-hwinfo获取Linux硬件信息?
- python 爬虫 微博 github_GitHub 热门:各大网站的 Python 爬虫登录汇总
- win7 X64下安装CAD 2013
- 网吧加油站_“天下加油站”更名为“天下网吧加油站”
- 程序员对社会的作用_萧条的社会对心理健康的影响
- creator 跳跃弧线_CocosCreator零基础制作游戏《极限跳跃》教程1
- [5G学习]02-无线接口协议