利用MATLAB实现循环卷积.doc
(完整word版)matlab卷积码程序
1、卷积码编码
function [output]=cnv_encd(input)
%output=cnv_encd(g,k0,input) 卷积码编码函数
%g 生成矩阵
%k0 输入码长
%input 输入信源序列
%output 输出卷积编码序列
g=[1 1 1;1 0 1];编码矩阵
k0=1;
input=[1 1 0 1];
if rem(length(input),k0)>0
input=[input,zeros(size(1:k0-rem(length(input),k0)))]; end
n=length(input)/k0;
if rem(size(g,2),k0)>0
error('Error,g is not of the right size.')
end
li=size(g,2)/k0;
n0=size(g,1);
u=[zeros(size(1:(li-1)*k0)),input,zeros(size(1:(li-1)*k0))];
u1=u(li*k0:-1:1);
for i=1:n+li-2
u1=[u1,u((i+li)*k0:-1:i*k0+1)];
end
uu=reshape(u1,li*k0,n+li-1);
output=reshape(rem(g*uu,2),1,n0*(n+li-1));
2、Viterbi译码程序
1)
function y=bin2deci(x)
l=length(x);
y=(l-1:-1:0);
y=2.^y;
y=x*y';
2)
function y=deci2bin(x,l)
matlab地循环语句和常用函数解析汇报
matlab 基本语句
1.循环语句for
for i=s1:s3:s2
循环语句组
end
解释:首先给i赋值s1;然后,判断i是否介于s1与s2之间;如果是,则执行循环语句组,i=i+s3(否则,退出循环.);执行完毕后,继续下一次循环。
例:求1到100的和,可以编程如下:
sum=0
for i=1:1:100
sum=sum+i
end
这个程序也可以用while语句编程。
注:for循环可以通过break语句结束整个for循环.
2.循环语句while
例:sum=0;i=1;
while(i<=100)
sum=sum+i;i=i+1;
end
3.if语句
if(条件)
语句
end
if(条件)
语句
else
语句
end
if(条件)
语句
elseif
语句
end
4.关系表达式:
=,>,<,>=,<=,==(精确等于)
5.逻辑表达式:|(或),&(且)
6.[n,m]=size(A)(A为矩阵)
这样可以得到矩阵A的行和列数
n=length(A),可以得到向量A的分量个数;如果是矩阵,则得到矩阵A的行与列数这两个数字中的最大值。
7.!后面接Dos命令可以调用运行一个dos程序。
8.常见函数:
poly():为求矩阵的特征多项式的函数,得到的为特征多项式的各个系数。如
a=[1,0,0;0,2,0;0,0,3],则poly(a)=1 -6 11 -6。相当于poly(a)=1入^3+(-6)入^2+11入+(-6)。
compan():可以求矩阵的伴随矩阵.
sin()等三角函数。
MATLAB在数学建模中的应用(3)
使用MATLAB进行卷积运算的常见错误及解决方法
使用MATLAB进行卷积运算的常见错误及解决
方法
引言:
卷积运算是数字信号处理中常用的一种操作,广泛应用于图像处理、音频处理、通信等领域。而MATLAB作为一款强大的数学软件,也提供了方便快捷的卷积函
数供我们使用。然而,在实际操作中,由于对卷积运算的理解不够深入或者对MATLAB函数的使用不够熟悉,很容易犯一些常见的错误。本文将针对使用MATLAB进行卷积运算的常见错误进行介绍,并给出相应的解决方法。
一、错误一:输入信号维度不匹配
在进行卷积运算时,输入信号的维度必须相匹配。一般情况下,MATLAB中
的卷积函数conv()要求输入的两个信号长度相等或者至少有一个信号的长度大于另
一个信号的长度,即两个信号的维度要满足M>=N(M和N分别为两个信号的长度)。如果输入信号的维度不匹配,就会产生错误或得到错误的结果。
解决方法:
确保要用于卷积运算的两个信号的维度匹配。可以通过使用MATLAB函数reshape()或者resize()来重新调整信号的维度,使其满足卷积运算的要求。
二、错误二:边界效应处理不当
在卷积运算中,边界效应是一个常见的问题。默认情况下,MATLAB中的卷
积函数conv()会采用边界补零(zero padding)的方式处理输入信号的边界,这可
能会导致卷积结果出现不符合预期的边界效应。
解决方法:
可以通过使用MATLAB函数padarray()来指定合适的填充方式,并对输入信号
进行合适的边界处理。常用的填充方式有:
1. 边界复制(replicate):将信号边界的元素复制到填充位置。
MATLAB OFDM卷积编码程序及代码
%bin22deci.m
function y=bin22deci(x)
%将二进制数转化为十进制数
t=size(x,2);
y=(t-1:-1:0);
y=2.^y;
y=x*y';
%************************end of file***********************************
%comb.m
%AWGN加噪声程序
function[iout,qout]=comb(idata,qdata,attn)
%******************variables*************************
%idata:输入I信道数据
%qdata:输入Q信道数据
%iout输出I信道数据
%qout输出Q信道数据
%attn:由信噪比导致的衰减系数
%******************************************************
iout=randn(1,length(idata)).*attn;
qout=randn(1,length(qdata)).*attn;
iout=iout+idata(1:length(idata));
qout=qout+qdata(1:length(qdata));
%************************end of file***********************************
%crdemapping.m
%数据逆映射载波程序
function[iout,qout]=crdemapping(idata,qdata,fftlen,nd);
实验五线性卷积与循环卷积的计算
实验五 线性卷积与循环卷积的计算
一 实验目的
(1) 进一步加深对线性卷积的理解和分析能力;
(2) 通过编程,上机调试程序,进一步增强使用计算机解决问题的能力; (3) 掌握线性卷积与循环卷积软件实现的方法,并验证二者之间的关系。
二 实验原理与方法
1、线性卷积
线性时不变系统(Linear Time-Invariant System, or L. T. I 系统)输入、输出间的关系为:当系统输入序列为,系统的单位脉冲响应为,输出序列为,则系统输出为:
或
上式称为离散卷积或线性卷积。
图1示出线性时不变系统的输入、输出关系。
→ L. T. I —→ —→ —→
图1 线性时不变系统的输入、输出关系
2、循环卷积
设两个有限长序列和,均为点长
如果
)(n x )(n h )(n y ∑∞
-∞
==-=
m n h n x m n h m x n y )
(*)()()()(∑+∞
-∞
==-=
m n x n h m n x m h n y )
(*)()()()()(n δ)(n h )(1n x )(2n x N )(1n x )(1k X )(2n x )(2k X )()()(213k X k X k X ⋅=
)(n x L. T. I h(n)
∑+∞
-∞
=-=m m n h m x n y )
()()(D F T D F T
则
○N
上式称为循环卷积或圆周卷积
注:为序列的周期化序列;为的主值序列。 上机编程计算时,可表示如下:
3、两个有限长序列的线性卷积
序列为点长,序列为点长,为这两个序列的线性卷积,则为
且线性卷积的最大长,也就是说当和时
卷积动画演示
卷积的动画演示
实现思想:
首先给出两个序列,求出他们的长度。如果两个序列的长度分别为N和M,那么经过线性卷积后结果的长度为N+M—1.所以在接下来的运算中,将一个序列固定不动,另一个序列从左到有一步步的进行卷积,其中将序列从左到右的过程用一个for循环实现,每移动一次将序列输出一次,直到全部的移动结束。在序列移动的过程中同时进行卷积的操作,也用for循环实现,每卷积一次将把卷积的结果输出一次,直到所有的卷积过程全部进行完。在这个过程中序列的移动和卷积同时进行,这样就实现了卷积的动画。
本程序是在MATLAB 7.6.0(R2008a)环境下运行。
实验代码:
clear
clc
X=[1,2,1,3,2,1];
Y=[3,4,1,1,2];
sizea=length(X); %求两个序列的长度;
sizeb=length(Y);
n=sizea+sizeb-1;
a= 0 : sizeb-1;
%y2(a+1)=x2(q-a);
nn=1:sizea; %输出第一个序列:
subplot(3,1,1)
stem(nn,X)
title('X(n)');axis([-16,16,0,10])
for n=1 : sizea+sizeb-1
k=-sizeb+n:1:-1+n;
subplot(3,1,2) %第二个序列移动的过程;
stem(k,Y)
title('Y(n-m)');axis([-16,16,0,10])
y=conv(X,Y); %求卷积运算;
t=1:1:n;
h(t)=y(t); %依次输出卷积的过程
subplot(3,1,3)
数字信号处理实验教案
数字信号处理实验教案
信息工程学院—通信工程教研室
数字信号处理是一门理论和实际密切结合的课程,为深入掌握课程内容,最好在学习理论的同时,做习题和上机实验。上机实验不仅可以帮助读者深入的理解和消化基本理论,而且能锻炼同学们的独立解决问题的能力。本讲义在第三版的基础上编写了五个实验,前2个实验属基础性的验证性实验,第3、4、5个实验属基本应用综合性实验。
实验一离散时间信号的MA TLAB实现
实验二线性卷积与循环卷积的原理及应用
实验三频率采样定理
实验四离散系统的因果性和稳定性及频率响应特性
实验五基于MATLAB的快速傅里叶变换
根据教学进度,理论课结束后进行相关实验。
实验一时域离散信号的产生
一实验目的
(1)了解常用的时域离散信号及其特点。
(2)掌握MA TLAB产生常用时域离散信号的方法。
二实验内容
(1)编写程序,产生下列离散序列:
A。f(n)=δ(n)(—3〈n<4)
B.f(n)=e(0。1+j1。6π)n (0〈n<16)
(2)一个连续的周期性三角波信号频率为50Hz,信号幅度在0~+2V之间,在窗口上显示
2个周期信号波形,对信号的一个周期进行16点采样来获取离散信号。试显示原连续信号和
采样获得的离散信号波形.
(3)一个连续的周期性方波信号频率为200Hz,信号幅度在-1~+1V之间,在窗口上显示2个
周期信号波形,用Fs=4kHz的频率对连续信号进行采样,试显示原连续信号和采样获得的
离散信号波形.
三实验步骤
(1) 在matlab命令窗口中逐行输入下列语句
>> n1=—3;n2=4;n0=0; %在起点n1、终点n2的范围内,于n0处产生冲激
matlab实现线性卷积和循环卷积
编号:
数字信号处理
实训 (论文)说明书
题目:用matlab实现两信号的卷积
院(系):应用科技学院
专业:电子信息工程
学生姓名:***
学号: ********** 指导教师:严素清童有为纪元法
2011 年 6 月29日
摘要
本文讲述的是运用matlab软件编写线性卷积和循环卷积,运行程序并得到正确结果,附上运行结果图让大家参照对比。
MATLAB是一款在数学类科技应用软件中特别是在数值计算方面首屈一指的软件,它可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。而线性卷积和循环卷积在工程上的应用亦非常广泛,在Matlab软件处理下,实现任意两个序列的线性和循环卷积对于工程上的辅助是相当重要的。卷积关系最重要的一种情况,就是在信号与线性系统或数字信号处理中的卷积定理。利用该定理,可以将时间域或空间域中的卷积运算等价为频率域的相乘运算,从而利用FFT等快速算法,实现有效的计算,节省运算代价。
本文从线性卷积和循环的定义出发,分析其运算原理以及相关的公式、程序,着重介绍并分析了卷积的运算过程,让大家明白什么是卷积。程序运行之后得到正确的结果,将运行后正确的波形图图放在本次论文中让大家直观的做比较。
关键词:Matlab;线性卷积;循环卷积;波形图;正确
Abstract
This is about using matlab software linear convolution and cyclic convolution, operation procedure and get the right result, enclosed operation result diagram let everybody reference MATLAB is a type of technology in applications of mathematics, especially in numerical calculation of the leading software, which can be matrix calculation, and data mapping function, the realization of algorithms, creation of user interface, connected to other procedures, such as programming languages, the main application in engineering computing, control design, signal processing and communications, image processing, signal detection, financial modeling in areas such as design and analysis. And linear convolution in the application of engineering has a very wide range of software in Matlab, the realization of any two sequences of linear convolution support for projects is very important. Convolution relationship between the most important case, that is linear in the signal and digital signal processing system or the convolution theorem. Use of the theorem can be time-domain or space domain to the convolution operation in frequency domain equivalent of the multiplication operation, thus the use of FFT and other fast algorithms, the calculation of effective, cost-saving operation.
Matlab在深度学习中的使用方法
Matlab在深度学习中的使用方法
深度学习是一种广泛应用于机器学习和人工智能领域的技术,它通过模拟人脑
神经网络的结构和功能,实现了从数据中自动学习和提取特征的能力。在深度学习的研究和实践过程中,Matlab作为一种常用的科学计算软件,提供了丰富的工具
和函数,大大简化了深度学习算法的实现和调试过程。本文将介绍Matlab在深度
学习中的使用方法,并结合实例说明其强大的功能和灵活性。
一、Matlab的深度学习工具箱
Matlab提供了专门用于深度学习的工具箱,其中包括各种深度学习算法的函数
和模型。这些函数和模型涵盖了深度神经网络(DNN)、卷积神经网络(CNN)、循环神经网络(RNN)等经典的深度学习结构。通过简单的函数调用和参数设置,用户可以方便地构建和训练自己的深度学习模型。
例如,对于卷积神经网络,Matlab提供了convnet函数,用于构建和训练卷积
神经网络。用户只需提供网络的结构和参数,即可快速搭建一个卷积神经网络模型。而对于循环神经网络,Matlab则提供了rnn函数,方便用户构建和训练循环神经网
络模型。
二、Matlab的深度学习工具函数
除了深度学习工具箱外,Matlab还提供了一系列实用的深度学习函数,用于数
据预处理、模型优化、模型评估等方面。
1. 数据预处理
在深度学习中,数据预处理是一个重要的步骤。Matlab提供了一些用于数据预
处理的函数,如imresize用于图像的大小调整、im2double用于将图像转换为灰度图,并将像素值映射到0-1之间。这些函数能够帮助用户快速准确地对数据进行预
(完整word版)离散卷积的算法分析及MATLAB实现(程序实例)
离散卷积的算法分析及MATLAB实现(实例程序)
摘自:张登奇,陈佳.离散卷积的算法分析及MATLAB实现[J].湖南理工学院学报(自然科学版). 2013(02)
摘要:离散卷积是信号处理的基本运算,快速卷积和分段卷积是计算离散卷积的重要算法.文章以离散线性卷积的概念为基础,介绍了计算卷积的常用方法和运算流程,列举了MATLAB实现的程序.这些程序能动态演示卷积运算的全部过程,既可帮助理解卷积运算的原理流程,也可作为教学讲解的演示工具. 1、离散卷积常规算法的动态演示程序
clear;clc;close all;format compact;
xn=[5,4,3,2,1],M=length(xn),%输入任意序列并计算长度M
hn=[1,1,1],N=length(hn),%输入任意脉冲响应并计算长度N
m=[-(M-1):M+N-2],%设置代换变量的范围以便x(m)翻转和移位
xm=[zeros(1,M-1),xn,zeros(1,N-1)],%补零以便与m对应绘图
subplot(4,1,1);stem(m,xm,'r.'),%%绘输入序列x(m)
ylabel('x(m)'), grid,title('(a) 输入序列x(m)'),%%加标签网格和标题
hm=[zeros(1,M-1),hn,zeros(1,M-1)],%补零以便与m对应绘图
subplot(4,1,2);stem(m,hm,'r.'),%%绘脉冲响应
ylabel('h(m)'),grid,title('(b) 脉冲响应h(m)'),%%加标签网格和标题
卷积.循环卷积与OFDM
卷积、线性卷积、循环卷积与OFDM 中的循环前缀CP
摘要:本文主要讲述了卷积的定义及如何理解卷积,用离散样值近似计算连续卷积的方法,用循环卷积计算线性卷积的方法,用线性卷积计算循环卷积的方法,以及后者在OFDM 中的应用(循环前缀CP ),并给出了相关的Matlab 代码和实例进行验证和说明。目的是为了建立起连续信号处理与离散信号处理之间的联系。与本人在百度文库中的连续时间傅立叶变换与离散时间傅里叶变换之间的关系、从DTFT 到DFT ,计算频谱,并由频谱反求时间样点,为三部曲。
1. 连续信号卷积的定义及实质
众所周知,当信号x(t)通过具有单位冲击响应为h(t)的因果LTI 系统时,其输出信号y(t)是前二者之间的线性卷积:
()()()()0
()()*()T t t T
y t x t h t h x t d x h t d t t t t t t -==
-=
-蝌 (1)
其中假设单位冲击响应在[0 T]之外的值都是0。 从数学上来看,要得到第二个积分公式中的h(t-τ),需先把h(τ)先以τ=0的轴进行时域翻转,然后再向右移动t 个单位。
h(τ)
h(-τ )
图1.从上到下依次为h(τ), h(-τ), h(1-τ), x(τ), h(1-τ)* x(τ)
在上面这个图形例子中,取t=1,故公共区间为[0,1]这个区间,故卷积积分的区间也是这个公共区间,即
()()1
0(1)y x h t d t t t =
-
ò (2)
上面图中的卷积结果将是一个分段函数。
上面的例子中,由于h(t)是连续的,故其与x(t)卷积的意义并不直观。下面我们令
实验五 线性卷积与循环卷积的计算
实验五 线性卷积与循环卷积的计算
一、实验目的
1、进一步加深对线性卷积的理解和分析能力;
2、通过编程,上机调试程序,进一步增强使用计算机解决问题的能力;
3、掌握线性卷积与循环卷积软件实现的方法,并验证二者之间的关系。 二、实验原理
1、线性卷积
线性时不变系统(Linear Time-Invariant System, or L. T. I 系统)输入、输出间的关系为:当系统输入序列为)(n x ,系统的单位脉冲响应为)(n h ,输出序列为)(n y ,则系统输出为:
∑∞
-∞==-=m n h n x m n h m x n y )
(*)()()()(
或
∑+∞
-∞
==-=
m n x n h m n x m h n y )
(*)()()()(
上式称为离散卷积或线性卷积。
图6.1示出线性时不变系统的输入、输出关系。
)(n δ→ L. T. I —→)(n h —→ —→
图6.1 线性时不变系统的输入、输出关系
2、循环卷积
设两个有限长序列)(1n x 和)(2n x ,均为N 点长
)(1n x )(1k X )(2n x )(2k X 如果)()()(213k X k X k X ⋅=
则 )
()(~)(~)(10213n R m n x m x n x N N m ⎥⎦⎤
⎢⎣⎡-=∑-=
[]
∑---=1
021)()(N m N m n x m x
)(1n x =N 10)(2-≤≤N n n x
上式称为循环卷积或圆周卷积
)(n x L. T. I h(n)
∑+∞
-∞
=-=m m n h m x n y )
线性卷积的FFT算法及其matlab实现
线性卷积的FFT算法
线性卷积是求离散系统响应的主要方法之一,许多重要应用都建立在这一理论基础上,如卷积滤波等。
以前曾讨论了用循环卷积计算线性卷积的方法归纳如下:
将长为N
2的序列x(n)延长到L,补L-N
2
个零
将长为N
1的序列h(n)延长到L,补L-N
1
个零
如果L≥N1+N2-1,则循环卷积与线性卷积相等,此时,可有FFT计算线性卷积,方法如下:
a.计算X(k)=FFT[x(n)]
b.求H(k)=FFT[h(n)]
c.求Y(k)=H(k)Y(k) k=0~L-1
d.求y(n)=IFFT[Y(k)] n=0~L-1
可见,只要进行二次FFT,一次IFFT就可完成线性卷积计算。计算表明,L>32时,上述计算线性卷积的方法比直接计算线卷积有明显的优越性,因此,也称上述循环卷积方法为快速卷积法。
上述结论适用于x(n),h(n)两序列长度比较接近或相等的情况,如果
x(n),h(n)长度相差较多,例如,h(n)为某滤波器的单位脉冲响应,长度有限,用来处理一个很长的输入信号x(n),或者处理一个连续不断的信号,按上述方法,h(n)要补许多零再进行计算,计算量有很大的浪费,或者根本不能实现。为了保持快速卷积法的优越性,可将x(n)分为许多段后处理,每小段的长与h(n)接近,其处理方法有两种:
(1)重叠相加法——由分段卷积的各段相加构成总的卷积输出
假定x
i
(n)表示图中第i段x(n)序列:
则输入序列可表为:
于是输出可分解为:
其中
由此表明,只要将x(n)的每一段分别与h(n)卷积,然后再将这些卷积结果
用matlaB分析重叠相加、重叠保留法
用matlaB分析重叠相加、重叠保留法
Matlab实验一
重叠相加法和重叠保留法的实现
学院:信息与通信工程学院
班级:
学号:
班内序号
姓名:
一.实验原理
为了实现线性卷积的快速计算方法,重叠相加法和重叠保留法的实质都是以逐段地方式通过循环卷积来完成线性卷积的计算。将输入序列x(n)进行分段,每段长为N,且N≥M(M为有限长因果序列h(n)的长度),x(n)逐段与h(n)进行循环卷积,在重叠保留法中需在x(n)序列首部加入长度为M-1的0序列。
在算法中,在获得N个点的输入后,进行N+M-1点循环卷积计算,之后输出N个点。通过for循环逐段进行循环卷积,使用fft 和ifft计算两个有限长序列的N点循环卷积结果。
二.源代码和流程图
重叠相加法代码
function [Y]=overpl(x,h,N)
Lx=length(x); %序列长度
M=length(h); %h(n)长度
x=[x,zeros(1,N-1)];
t=zeros(1,M-1);
Y=zeros(1,Lx+M-1);
a=floor(Lx/N);
for k=0:a
A=x(k*N+1:k*N+N);
y1=fft(A,Lx+M-1); %利用fft进行运算
y2=fft(h,Lx+M-1);
y3=y1.*y2;
q=ifft(y3,Lx+M-1);
Y(k*N+1:k*N+M-1)=q(1:M-1)+t(1:M-1);
Y(k*N+M:k*N+N)=q(M:N);
t(1:M-1)=q(N+1:N+M-1);
end
Y(1:Lx+M-1);
对应流程图
图二
基于Matlab的循环卷积计算
题目:x(n) = {x(0), x(1), x(2)} = {1,3,2}, h(n) = {h(0), h(1), h(2), h(3)}={4,3,2,1}。(1)计算y(n) = x(n) * h(n);
(2)分别计算出x(n)与h(n)4点、5点和6点的循环卷积。
解:
(1)matlab代码:
X = [1 3 2]; H = [4 3 2 1]; Y = conv(H,X);
figure(1); nX = 0:length(X)-1; nH = 0:length(H)-1; nY = 0:length(Y)-1;
subplot(3,1,1);
stem(nX,X);
xlabel('Time index n'); ylabel('Amplitude'); title('x(n)'); grid on;
subplot(3,1,2);
stem(nH,H);
xlabel('Time index n'); ylabel('Amplitude'); title('h(n)'); grid on;
subplot(3,1,3);
stem(nY,Y);
xlabel('Time index n'); ylabel('Amplitude'); title('y(n)= x(n)*h(n)'); grid on;
结果如下:
X = 1 3 2
H = 4 3 2 1
Y = 4 15 19 13 7 2
(2)matlab代码:
X = [1 3 2]; H = [4 3 2 1];
N4 = 4; N5 = 5; N6 = 6;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
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);
x12=fft(x2,N);
y11=x11.*x12;
y1=ifft(y11,N);
subplot(3,1,3);
n=0:length(y1)-1;
stem(n,y1,'.');
title('循环卷积的结果');
xlabel('n');ylabel('y1(n)');
运行后所得图形如下:
观察所得的循环卷积结果发现并没有呈现周期性的序列,因此将程序做下列改变。程序二:
clear;close all;
N=40;
x1=[6 15 -6 3 5 7 0 1];
x2=[7 1 2 9 4 3 20 6];
x2=[x2,x2,x2,x2];
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);
x12=fft(x2,N);
y11=x11.*x12;
y1=ifft(y11,N);
subplot(3,1,3);
n=0:length(y1)-1;
stem(n,y1,'.');
title('循环卷积的结果');
xlabel('n');ylabel('y1(n)');
从图中可以看出循环卷积的结果已经呈循环序列。将程序进一步改进——在x2序列之间加一些零矩阵;程序如下:
clear;close all;
N=50;
x1=[6 15 -6 3 5 7 0 1];
x2=[7 1 2 9 4 3 20 6];
x2=[x2,zeros(1,7),x2,zeros(1,7),x2,zeros(1,7),x2];
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);
x12=fft(x2,N);
y11=x11.*x12;
y1=ifft(y11,N);
subplot(3,1,3);
n=0:length(y1)-1;
stem(n,y1,'.');
title('循环卷积的结果');
xlabel('n');ylabel('y1(n)');
2)线性卷积与循环卷积的区别:
从循环卷积的定义公式中可以看出,循环卷积和线性卷积的不同之处在于:①两个N 点序列的N点循环卷积的结果仍为N点序列,而两个N点序列线性卷积的结果的长度则变为为2N-1;②循环卷积对序列的移位采取循环移位,而线性卷积对序列则是
采取线性位移。而就是这两点不同,导致循环卷积和线性卷积有不同的结果和性质。
然而虽然循环卷积和线性卷积虽然是不同的概念,但是它们之间有一个有意义的
公式联系在一起)()(')]()([)(n G rN n y n x n h n y N r N ⎪⎭
⎫ ⎝⎛-=⊗=∑∞-∞=,其中)(*)()('n x n h n y =;也就是说,两个序列的N 点循环卷积是他们的线性卷积以N 为周期的周期延阔。设序列h(n)的长度为1N ,序列x(n)的长度为2N ,此时,线性卷积结果的序列的点数为1-'21N N N +=;因此如果循环卷积的点数N 小于121-+N N ,那么上述周期性延阔的结果就会产生混叠,从而两种卷积会有不同的结果。而如果N 满足'N N =的条件,就会有)0)((')(N n n y n y <≤=。这就会意味着在时域不会产生混叠。因此,可以得出结论:若通过在序列的末尾填充适当的零值,使得x(n)和h(n)成为121-+N N 点序 列,并作出这两个序列的121-+N N 循环卷积与线性卷积的结果在N n <≤0范围内相同。
将循环卷积的结果与线性卷积做对比,程序如下:
clear;close all ;
N=50;
x1=[6 15 -6 3 5 7 0 1];
x21=[7 1 2 9 4 3 20 6];
x2=[x21,zeros(1,7),x21,zeros(1,7),x21,zeros(1,7),x21];
xn1=length(x1);
xxn1=0:xn1-1;
xn2=length(x2);
xxn2=0:xn2-1;
subplot(4,1,1);
stem(xxn1,x1);
subplot(4,1,2);
stem(xxn2,x2);
x11=fft(x1,N);
x12=fft(x2,N);
y11=x11.*x12;
y1=ifft(y11,N);
subplot(4,1,3);
n=0:length(y1)-1;