• ## 循环卷积

千次阅读 2010-09-02 19:29:00
1、 题目：循环卷积 2、 代码： /******************************************************************* * 循环卷积 * V0.1 * * 输入参数：lpData,输入数据；DataLen,输入数据长度；Filter,...
1、  题目：循环卷积
2、  代码：
/*******************************************************************
*	循环卷积
*	V0.1
*
*	输入参数：lpData,输入数据；DataLen,输入数据长度；Filter,卷积核；
*	FilterLengh,卷积核长度；AfterProData,卷积结果；Delay, 卷积核延
*	迟长度。
*
*	说明：Delay有输入范围, -DataLen <= Delay < DataLen+2-FilterLen
*
*	李承宇, lichengyu2345@126.com *
*	2010-09-02
*******************************************************************/
#include "stdafx.h"
#include "stdio.h"

void Convolution(double * lpData, short DataLen, double * Filter,
short FilterLengh, double *AfterProData, short Delay)
{
double * TemFilter;
short Temi, Temj, Temk = 0;
short temp;
double TemVal = 0;

TemFilter = new double[FilterLengh];
for( Temi = 0; Temi < FilterLengh; Temi++ )
{
TemFilter[Temi] = Filter[FilterLengh - Temi - 1];
}

for( Temi = Delay; Temi <= DataLen - 1 + Delay; Temi++ )
{
TemVal = 0;

for( Temj = 0; Temj < FilterLengh; Temj++ )
{

temp = Temj + Temi;

if( (temp >= 0) && (temp < DataLen) )
TemVal += TemFilter[Temj] * lpData[temp];
else
{
if( temp < 0 )
TemVal += TemFilter[Temj] * lpData[temp+DataLen];
else
TemVal += TemFilter[Temj] * lpData[temp-DataLen];
}

}

AfterProData[Temk] = TemVal;
Temk ++;
}

delete [] TemFilter;
}

void main()
{
double data[8] = {1, 2, 3, 4, 5, 6, 7, 8 };

double filter[4] = {1, 1, 1, 1};
double AfterProData[8] = {0};
int nDelay;

scanf("%d", &nDelay);

Convolution(data, 8, filter, 4, AfterProData, nDelay);

printf("/nThe result of convolution is:/n");
for(int i = 0; i < 8; i++)
printf("%f/n", AfterProData[i]);

}

3、  说明：
Delay有输入范围要求：
当Temi > 0时，要满足temp – DataLen < DataLen, 即 Temj(max)+ Temi(max) – DataLen < DataLen, 即 (Filter – 1) + (DataLen – 1 + Delay) – DataLen < DataLen, 所以有Delay < DataLen + 2 – FilterLen;
当Temi < 0 时，要满足 temp + DataLen >= 0, 即 Temj(min) + Temi(min) + DataLen >= 0, 即 0 + Delay + DataLen >= 0, 所以有 Delay >= - DataLen.
综上所述，Delay的取值范围是-DataLen <= Delay < DataLen+2-FilterLen.
如果Delay的值在上述范围之外，将取到lpData[-1]和lpData[DataLen]及之外的值，结果发生错误。

4、  改进：
使temp值（Temj + Temi）始终处于0到DataLen-1之间，采用如下方法：
temp = (Temj + Temi) - ( (Temj + Temi) / DataLen ) * DataLen;
if(temp < 0) temp = DataLen + temp;

改进的代码如下：
/*******************************************************************
*	循环卷积
*	V0.2
*
*	输入参数：lpData,输入数据；DataLen,输入数据长度；Filter,卷积核；
*	FilterLengh,卷积核长度；AfterProData,卷积结果；Delay, 卷积核延
*	迟长度。
*
*	说明：Delay可以是任何长度。
*
*	李承宇, lichengyu2345@126.com *
*	2010-09-02
*******************************************************************/

void Convolution(double * lpData, short DataLen, double * Filter,
short FilterLengh, double *AfterProData, short Delay)
{
double * TemFilter;
short Temi, Temj, Temk = 0;
short temp;
double TemVal = 0;

TemFilter = new double[FilterLengh];
for( Temi = 0; Temi < FilterLengh; Temi++ )
{
TemFilter[Temi] = Filter[FilterLengh - Temi - 1];
}

for( Temi = Delay; Temi <= DataLen - 1 + Delay; Temi++ )
{
TemVal = 0;

for( Temj = 0; Temj < FilterLengh; Temj++ )
{

temp = Temj + Temi;

temp = (Temj + Temi) - ( (Temj + Temi) / DataLen ) * DataLen;

if(temp < 0) temp = DataLen + temp;

TemVal += TemFilter[Temj] * lpData[temp];

}

AfterProData[Temk] = TemVal;
Temk ++;
}

delete [] TemFilter;
}

原代码出：《小波分析及其在图像处理中的应用》，陈武凡主编，科学出版社，2002年4月第一版，程序附录
展开全文
• 二、实验条件PC 机，MATLAB7.0三、实验内容1)循环卷积的定义：两个序列的N 点循环卷积定义为：)0()()()]()([10N n m n x m h n x n h N k N N利用MATLAB 实现两个序列的循环卷积可以分三个步骤完成：(1)初始化：确定...

一、实验目的
1.利用MATLAB 实现循环卷积。
2.比较循环卷积与线性卷积的区别。
二、实验条件
PC 机，MATLAB7.0
三、实验内容
1)循环卷积的定义：两个序列的N 点循环卷积定义为：
)0()()()]()([1
0N n m n x m h n x n h N k N N
利用MATLAB 实现两个序列的循环卷积可以分三个步骤完成：
(1)初始化：确定循环点数N ，测量输入2个序列的长度。
(2)循环右移函数：将序列x(n)循环右移，一共移N 次(N 为循环卷积的循环次数)，最后将每次循环成的新序列组成一个矩阵V 。
(3)相乘：将x(n)移位后组成的矩阵V 与第二个序列h(n)对应相乘，即得循环卷积结果。程序如下：
程序一：
clear;close all ;
N=10;
x1=[6 15 -6 3 5 7 0 1];
x2=[7 1 2 9 4 3 20 6];
xn1=length(x1);
xxn1=0:xn1-1;
xn2=length(x2);
xxn2=0:xn2-1;
subplot(3,1,1);
stem(xxn1,x1);
subplot(3,1,2);
stem(xxn2,x2);
x11=fft(x1,N);

展开全文
• 循环卷积是模数 N。使用模数函数我实现了逻辑。
• matlab循环卷积函数,使用矩阵实现，用于理解循环卷积。分2部分，一部分为循环移位，第二部分给矩阵赋值、计算循环卷积
• 利用matlab实现循环卷积.doc 1、实验目的1利用MATLAB实现循环卷积。2比较循环卷积与线性卷积的区别。二、实验条件PC机，MATLAB703、实验内容1)循环卷积的定义两个序列的N点循环卷积定义为010NNMXHNXHK...

利用matlab实现循环卷积.doc
1、实验目的1利用MATLAB实现循环卷积。2比较循环卷积与线性卷积的区别。二、实验条件PC机，MATLAB703、实验内容1)循环卷积的定义两个序列的N点循环卷积定义为010NNMXHNXHK利用MATLAB实现两个序列的循环卷积可以分三个步骤完成1初始化确定循环点数N，测量输入2个序列的长度。2循环右移函数将序列XN循环右移，一共移N次(N为循环卷积的循环次数)，最后将每次循环成的新序列组成一个矩阵V。3相乘将XN移位后组成的矩阵V与第二个序列HN对应相乘，即得循环卷积结果。程序如下程序一CLEARCLOSEALLN10X1615635701X2712943206XN1LENGTHX1XXN10XN11XN2LENGTHX2XXN20XN21SUBPLOT3,1,1STEMXXN1,X1SUBPLOT3,1,2STEMXXN2,X2X11FFTX1,NX12FFTX2,NY11X11X12Y1IFFTY11,NSUBPLOT3,1,3N0LENGTHY11STEMN,Y1, TITLE 循环卷积的结果 XLABEL N YLABEL Y1N 运行后所得图形如下观察所得的循环卷积结果发现并没有呈现周期性的序列，因此将程序做下列改变。程序二CLEARCLOSEALLN40X1615635701X2712943206X2X2,X2,X2,X2XN1LENGTHX1XXN10XN11XN2LENGTHX2XXN20XN21SUBPLOT3,1,1STEMXXN1,X1SUBPLOT3,1,2STEMXXN2,X2X11FFTX1,NX12FFTX2,NY11X11X12Y1IFFTY11,NSUBPLOT3,1,3N0LENGTHY11STEMN,Y1, TITLE 循环卷积的结果 XLABEL N YLABEL Y1N 从图中可以看出循环卷积的结果已经呈循环序列。将程序进一步改进在X2序列之间加一些零矩阵；程序如下CLEARCLOSEALLN50X1615635701X2712943206X2X2,ZEROS1,7,X2,ZEROS1,7,X2,ZEROS1,7,X2XN1LENGTHX1XXN10XN11XN2LENGTHX2XXN20XN21SUBPLOT3,1,1STEMXXN1,X1SUBPLOT3,1,2STEMXXN2,X2X11FFTX1,NX12FFTX2,NY11X11X12Y1IFFTY11,NSUBPLOT3,1,3N0LENGTHY11STEMN,Y1, TITLE 循环卷积的结果 XLABEL N YLABEL Y1N 2)线性卷积与循环卷积的区别从循环卷积的定义公式中可以看出，循环卷积和线性卷积的不同之处在于①两个N点序列的N点循环卷积的结果仍为N点序列，而两个N点序列线性卷积的结果的长度则变为为2N1；②循环卷积对序列的移位采取循环移位，而线性卷积对序列则是采取线性位移。而就是这两点不同，导致循环卷积和线性卷积有不同的结果和性质。然而虽然循环卷积和线性卷积虽然是不同的概念，但是它们之间有一个有意义的公式联系在一起，其中 NGRNYNXHNYRN也就是说，两个序列的N点循环卷积是他们的线性卷积以N为周 XHNY期的周期延阔。设序列HN的长度为,序列XN的长度为，此时，线性卷积结12果的序列的点数为因此如果循环卷积的点数N小于，那么 21N121上述周期性延阔的结果就会产生混叠，从而两种卷积会有不同的结果。而如果N满足的条件，就会有。这就会意味着在时域不会产生混 N0 NYN叠。因此，可以得出结论若通过在序列的末尾填充适当的零值，使得XN和HN成为点序121列，并作出这两个序列的循环卷积与线性卷积的结果在范围内121NNN0相同。将循环卷积的结果与线性卷积做对比，程序如下CLEARCLOSEALLN50X1615635701X21712943206X2X21,ZEROS1,7,X21,ZEROS1,7,X21,ZEROS1,7,X21XN1LENGTHX1XXN10XN11XN2LENGTHX2XXN20XN21SUBPLOT4,1,1STEMXXN1,X1SUBPLOT4,1,2STEMXXN2,X2X11FFTX1,NX12FFTX2,NY11X11X12Y1IFFTY11,NSUBPLOT4,1,3N0LENGTHY11STEMN,Y1, TITLE 循环卷积的结果 XLABEL N YLABEL Y1N Y2CONVX1,X21SUBPLOT4,1,4STEMY2, TITLE 线性卷积的结果 XLABEL N YLABEL Y2N 关于循环卷积，需要知道循环卷积仅仅是针对离散傅里叶变换；然而，这里的循环是针对周期序列而言的；而线性卷积是针对有限长序列，要用DFT求线性卷积，必然要求周期序列的一个周期内求卷积能和有限长序列求线性卷积等值。因此需要求N点长度的循环卷积必然要和线性卷积的长度一致。至少N要不少于线性卷积的长度。四、实验结论和讨论1学习了与循环卷积相关的概念，知道了有限长序列的循环移位是指，NRYMN也就是先让序列YN以N为周期进行周期延拓，再进行反折，然后朝右移位，只朝一个方向移位的原因是对周期序列向右移动一个位置，也就相当于向左移动了N－1个位置,最后取(0，N－1)的N个值就得到了循环移位后的N个序列值。设有序列XN和YN，其N点循环卷积为由于10NKNRMXHMY(循环移位的关系最后得到的循环卷积的长度就是N点，M取0，1，2，„，N1。循环卷积的简介表示为。NXHMY熟知了循环卷积的算法以及如何用MATLAB实现循环卷积的运算。一共分为三步分别是初始化确定循环点数N，测量输入2个序列的长度，长度小于N的在后面补0；循环右移函数将序列XN循环右移，一共移N次(N为循环卷积的循环次数)，最后将每次循环成的新序列组成一个矩阵V；相乘将XN移位后组成的矩阵V与第二个序列HN对应相乘，即得循环卷积结果。2再次复习了一边线性卷积的相关性质，比较了线性卷积与循环卷积之间相同与不同之处。知道当循环卷积L线性卷积的长度时,线性卷积的结果与循环卷积的结果是相等的；但是循环卷积首先长度是不变的,而线性卷积的长度是L1L21,也就是说积分或者求和的上限是不一样的,前者是1N,而后者是无穷。3通过这次设计我也发现了自身存在的一些问题，程序的逻辑虽然在脑海中能有一个大概的轮廓，但是要将它实现并写出完整的程序却还是有些困难。虽然这次程序在老师的指导和帮助下写了出来，但是在一些基础的语言结果比如零矩阵的数输写还无法在没有程序的参考下写出来。这也体现了我对MATLAB还不熟悉，需要更多的练习来巩固和完善自己。

展开全文
• 可以找到两个一维序列的循环卷积
• 计算两个离散时间序列的循环卷积
• 该程序执行两个等长序列的循环卷积
• 前言本人在对野外仪器数据采集的信号做一些列数字信号处理的过程中，经常遇到卷积与循环卷积。现实中，野外仪器记录到的数据都是离散的！所以我们在对数据进行FFT变换时，都默认使用的是DFT(离散傅里叶变换)。本文...

前言
本人在对野外仪器数据采集的信号做一些列数字信号处理的过程中，经常遇到卷积与循环卷积。现实中，野外仪器记录到的数据都是离散的！所以我们在对数据进行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信号循环卷积结果(时域)

展开全文
• 求两个不同长度序列的循环卷积
• 使用 DFT-IDFT 的循环卷积 第一个序列(*) 第二个序列 = IDFT(第一个序列的 DFT * 第二个序列的 DFT)
• 两个信号的循环卷积（代码处理两个不同长度的信号）而不使用 cconv() 命令
• ## 线性卷积、周期卷积和循环卷积

千次阅读 多人点赞 2020-07-22 12:59:44
线性卷积、周期卷积和循环卷积 例题：已知序列x1(n)=[0,2,2,1] (n=0,1,2,3); x2(n)=[1,2,-1,1] (n=0,1,2,3).求解 (1)计算线性卷积y1(n)=x1(n)✳x2(n); (2)计算周期卷积y2(n)=x1(n)⊛x2(n);(N=5) (3)计算循环卷积y3(n...
• 周期卷积 对象：用以建立周期序列与DFS系数之间的桥梁。 定义式： 周期序列的周期卷积对应于与之相应的傅里叶级数系数序列的乘积。 循环卷积 对象：用以建立有限长序列与DFT系数之间的桥梁。...而且通过循环卷积...
• 这篇博文要将的是循环卷积循环卷积和线性卷积还是有很大区别的，我们都知道，两个N点序列之间的线性卷积会得出一个更长的序列，不得不再一次要将区间限制在 0 <= n <= N -1。因此代替线性移位的是应该考虑...
• 基于matlab的彩色gui动态显示线性卷积循环卷积，拥有良好的色彩效果的gui显示效果
• 循环卷积 针对的是两个长度都为N的序列，对两个序列做FFT，然后再做IFFT得到的结果就是循环卷积，结果的长度也是N。 直接计算步骤： 序列A与序列B，长度都是N，新的序列C 1、把B倒过来。[翻转] 2、把B向右平移...
• 实现线性卷积和循环卷积，主要介绍了MATLAB 工具的这部分的使用方法，以及编程
• 用FFT实现线性卷积循环卷积，在matlab中还使用了conv、cconv函数与FFT实现相比较
• PAGE 用Matlab验证循环卷积和线性卷积关系的软件设计 与仿真 目 录 TOC \o "1-2" \h \z \t "标题 3,3" 摘 要 1 英文摘要 2 引 言 3 正 文 4 1 MATLAB平台概述 4 1.1 MATLAB软件简述 4 1.2 MATLAB举例应用 5 2 循环...
• 离散函数的循环卷积matlab代码。。。。。。
• Mlab 重叠保留法计算循环卷积 Mlab 重叠保留法计算循环卷积
• 对于长度分别为 N1 和 N2 的两个序列 x1(n) 和 x2(n) 圆形卷积变成线性卷积，当补零等于[(N1+N2-1)- max(n1,n2)]
• 用C++实现循环卷积，算法简单，代码行不多
• 循环卷积是针对周期信号完成的，下面的函数需要两个信号并返回它们的循环卷积和循环矩阵。
• 代码清晰且具有自我描述性
• 利用FFT计算并分析线性卷积与循环卷积
• 数字信号处理循环卷积与线性卷积

...