前言

本人在对野外仪器数据采集的信号做一些列数字信号处理的过程中,经常遇到卷积与循环卷积。现实中,野外仪器记录到的数据都是离散的!所以我们在对数据进行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循环卷积函数,一维卷积与循环卷积的使用(离散数据+具体例子)相关推荐

  1. 分类预测 | MATLAB实现1-DCNN一维卷积神经网络分类预测

    分类预测 | MATLAB实现1-DCNN一维卷积神经网络分类预测 目录 分类预测 | MATLAB实现1-DCNN一维卷积神经网络分类预测 基本介绍 程序设计 学习总结 参考资料 基本介绍 使用卷积 ...

  2. matlab damp函数返回的值为什么有两行相同数据?

    代码如下,普通的一阶系统,为什么工作区damp返回的值有两行一样的呢?求大佬解答 k=[2,5,10];t=0.625; gg=[];wwn=[];zz=[]; for i=1:length(k)   ...

  3. 基于FPGA的一维卷积神经网络CNN的实现(一)框架

    理论建立与效果展示 环境:Vivado2019.2. Part:xcku040-ffva1156-2-i,内嵌DSP个数 1920个,BRAM 600个也就是21.1Mb. 说明:通过识别加高斯白噪声 ...

  4. 矩阵一维卷积c++_深度神经网络卷积层计算加速与优化

    01 传统卷积层计算 首先我们定义符号F()函数为卷积函数 一维卷积:F(n,m) n代表输出的维度,m代表滤波器的维度 二维卷积:F(n*m,r*s) n*m代表输出的维度,r*s代表滤波器的维度 ...

  5. keras从入门到放弃(二十二)一维卷积处理 RNN文本分类

    什么是一维卷积 一维卷积 • 图中的输入的数据维度为8,过滤器的维度为5.与二维卷积类似,卷积后输出的数据维度为8−5+1=48−5+1=4. • 如果过滤器数量仍为1,输入数据的channel数量变 ...

  6. 实现一维卷积神经网络

    实现一维卷积神经网络 1.准备IMDB数据 from keras.datasets import imdb from keras.preprocessing import sequencemax_fe ...

  7. MATLAB中函数find的使用方法概述,简单易懂+例子

    MATLAB中函数find的使用方法总结+探索,简单易懂+例子 该函数不仅可以查找矩阵获这向量中的非零元素的位置,也可以查询满足一定逻辑条件的元素位置. find函数总共的适用方法 index = f ...

  8. Keras实现一维卷积(Conv1D)实例

    实战一维卷积(Conv1D):kaggle叶子分类问题 通过例子理解: (1)一维卷积是如何工作的: (2)输入数据是如何构建的: 在csv文件中,数据集或者特征集的保存方式nxm,其中n为样本个数, ...

  9. 卷积神经网络之一维卷积、二维卷积、三维卷积

    1. 二维卷积 图中的输入的数据维度为14×1414×14,过滤器大小为5×55×5,二者做卷积,输出的数据维度为10×1010×10(14−5+1=1014−5+1=10).如果你对卷积维度的计算不 ...

最新文章

  1. 靶向新冠状病毒(COVID-19)的药物靶点
  2. MySQL用户管理、常用sql语句、数据库备份
  3. SHELL syntax error:unexpected end of file 提示错误
  4. docker-compose 1.29.2 下载地址
  5. 云视睿博流媒体服务器Lit,《云视睿博流媒体服务器参数表.docx
  6. 环境变量_配置JAVA环境变量
  7. cron每2天跑一次_直购直测,进口新极光每2年或34000公里才需要保养一次?
  8. raspberry pi_2018十大Raspberry Pi故事
  9. ubuntu配置fastdfs+Nginx
  10. ps-色彩饱和度的设计
  11. manjaro linux vmware,Manjaro Linux处理vmware的vmmon、vmnet8、Network configuration is missing一堆问题的记录...
  12. 游戏开发中的沟通成本
  13. 能不用事务就尽量别用
  14. C语言结业作业,2019年本科课程-C语言程序设计结业试卷(附答案).doc
  15. badfail@qq.com+java_Java KeeperException.BadArgumentsException方法代码示例
  16. <MySQL>表中添加和删除字段
  17. OpenMPI:介绍与an'zhuang
  18. thisis incompatible with sql_mode=only_full_group
  19. 浏览器内核学习笔记二
  20. kali子系统安装教程(包含避坑指南,新手必看!)

热门文章

  1. 红旗linux服务器操作系统 Asianux V8.1 (欧拉版) 系统安装
  2. user is not in the sudoers file. This incident will be reported 解决方法
  3. es分布式架构和原理分析
  4. python 怎样调用硬件_如何使用python-hwinfo获取Linux硬件信息?
  5. python 爬虫 微博 github_GitHub 热门:各大网站的 Python 爬虫登录汇总
  6. win7 X64下安装CAD 2013
  7. 网吧加油站_“天下加油站”更名为“天下网吧加油站”
  8. 程序员对社会的作用_萧条的社会对心理健康的影响
  9. creator 跳跃弧线_CocosCreator零基础制作游戏《极限跳跃》教程1
  10. [5G学习]02-无线接口协议