基于MATLAB离散卷积的实现和源代码
用matlab实现两个离散序列的卷积(不使用conv函数)
作业2.用matlab实现离散序列的卷积.
N=14;
n=[1:N-1];
f=1/16;
signal1=5*sin(2*pi*n/8);
figure(1); subplot(3,1,1) stem(n,signal1);title( ' 信号1' );xlabel( 'n' );ylabel( axis([0 15 -6 6])
long_M=5;
signal2=ones(1,long_M); subplot(3,1,2)
stem(signal2);title( ' 信号2' );xlabel( 'n' );ylabel( axis([0 6 -2 2]);
grid on;
long_N=length(signal1); fk=zeros(0,long_N+long_M+10);
if (long_N>long_M)
for k=1:1:long_N+long_M-1
a=0;
if (k<=long_N)
for i=1:1:k
if (i>long_M)
fk(k)=a;
else fk(k)=a+signal2(i)*signal1(k-i+1); a=fk(k);
end
end
else
for i=1:1:k
if (k-long_N+i>long_M)
fk(k)=a;
else fk(k)=a+signal2(k-long_N+i)*signal1(long_N-i+1); a=fk(k);
end
end
end
end
end subplot(3,1,3) stem(fk);title( ' 卷积函数的实现' );xlabel( 'n' );ylabel(
MATLAB技术卷积运算实例
MATLAB技术卷积运算实例
卷积运算是数字图像处理中一种常用的操作,它在信号处理、图像处理、神经
网络以及其它许多领域都有广泛的应用。MATLAB作为一款功能强大的数学软件,提供了各种函数和工具箱,使得卷积运算在MATLAB中变得非常方便和高效。本
文将通过几个实例演示如何使用MATLAB进行卷积运算,并介绍一些常见的卷积
运算技巧和应用。
一、一维离散卷积
在信号处理中,一维离散卷积是一种将两个离散信号相乘后求和的运算。在MATLAB中,我们可以使用conv函数来实现一维离散卷积运算。假设我们有两个
长度分别为N和M的一维信号x和h,我们可以通过以下代码实现卷积运算:```matlab
x = [1, 5, 2, 3, 4]; % 一维信号x
h = [2, 1, 3]; % 一维信号h
y = conv(x, h); % 进行卷积运算
```
在上述代码中,x和h分别表示两个一维信号,y表示卷积运算的结果。通过
运行以上代码,我们可以得到卷积运算的结果。
二、二维离散卷积
除了一维信号,MATLAB也支持对二维图像进行卷积运算。二维离散卷积是
一种常见的图像处理操作,它在边缘检测、模糊处理等方面具有广泛的应用。在MATLAB中,我们可以使用conv2函数来实现二维离散卷积运算。假设我们有两
个大小分别为NxM和PxQ的二维图像A和B,我们可以通过以下代码实现卷积运算:
```matlab
A = imread('image.jpg'); % 读取图像A
B = [1, 2, 1; 0, 0, 0; -1, -2, -1]; % 卷积核B
实验2 离散序列的卷积和系统差分方程的MATLAB实现
实验2离散序列的卷积和系统差分方程的MATLAB 实现
1. 实验目的
熟悉序列的卷积运算及其MATLAB 实现;熟悉离散序列的傅里叶变换理论及其MATLAB 实现;加深对离散系统的差分方程和系统频率响应的理解。
2.实例分析
2.1离散序列卷积运算的MATLAB 实现
例2.1已知(){1,2,3,4,5}x n =,(){6,2,3,6,4,2}h n =,计算()()*()y n x n h n =。 两序列的线性卷积定义为:()*()()()k x n y n x k y n k ∞
=-∞=
-∑ MATLAB 提供了一个内部函数conv(x,h)来计算两个有限长序列之间的卷积。将下列指令编辑到“exe2conv.m ”文件中。
% exe2conv.m 利用conv 函数实现卷积运算
N=5;M=6;L=N+M-1;
x=[1,2,3,4,5]; nx =0:N-1;
h=[6,2,3,6,4,2]; nh=0:M-1;
y=conv(x,h); ny=0:L-1;
subplot(1,3,1);stem(nx,x,'.');xlabel('n');ylabel('x(n)');grid on ; subplot(1,3,2);stem(nh,h,'.');xlabel('n');ylabel('h(n)');grid on ; subplot(1,3,3);stem(ny,y,'.');xlabel('n');ylabel('y(n)');grid on ;
运行“exe2conv.m ”文件将产生如图2-1所示的序列。
用matlab计算序列卷积和并绘图
(一)实验目的:学会用MATLAB 对信号与系统分析的方法,理解离散序列卷积和的计算对进行离散信号与系统分析的重要性。 (二)实验原理:
1、离散时间序列f1(k)和f2(k)的卷积和定义:
f(k)=f1(k)*f2(k)=
∑∞
-∞
=-•
i i k f i f )(2)(1
2、在离散信号与系统分析中有两个与卷积和相关的重要结论:
a 、f(k)=
∑∞
-∞
=-•i i k i f )()(δ=f(k)* δ(k)即离散序列可分解为一系列幅
度由f(k)决定的单位序列δ(k)及其平移序列之积。
b 、对线性时不变系统,设其输入序列为f(k),单位响应为h(k),其零状态响应为y(k),则有:y(k)=
∑
∞
-∞
=-•i i k h i f )()(
3、上机:conv.m 用来实现两个离散序列的线性卷积。 其调用格式是:y=conv(x,h)
若x 的长度为N ,h 的长度为M ,则y 的长度L=N+M-1。 (三)实验内容
1、题一:令x(n)= {
}5,4,3,2,1,h(n)={}246326,,,,,,y(n)=x(n)*h(n),求y(n)。 要求用subplot 和stem 画出x(n),h(n),y(n)与n 的离散序列图形。 源程序: N=5; M=6; L=N+M-1; x=[1,2,3,4,5];
h=[6,2,3,6,4,2]; y=conv(x,h); nx=0:N-1; nh=0:M-1; ny=0:L-1;
subplot(131); stem(nx,x,'*k'); xlabel('n'); ylabel('x(n)'); grid on ;
matlab 离散向量逆卷积
matlab 离散向量逆卷积
在MATLAB中,可以使用函数`deconv`来进行离散向量的逆卷积。函数的语法如下:
```matlab
y = deconv(u, v)
```
其中`u`是原始离散向量,`v`是卷积核向量。函数将计算`u`的逆卷积,并将结果存储在向量`y`中。
以下是一个例子,演示如何使用`deconv`函数进行离散向量的逆卷积:
```matlab
u = [1, 3, 5]; % 原始向量
v = [2, 4]; % 卷积核向量
y = deconv(u, v);
disp(y);
```
输出结果为:
```
-3 -10
```
请注意,逆卷积的计算结果可能会受到噪声的影响,因此得到的结果可能并非完全准确。在实际应用中,可以对结果进行插值或滤波来改善结果的质量。
实验一:离散时间序列卷积和MATLAB实现
实验一:离散时间序列卷积和MATLAB 实现
(一)实验目的
1、掌握离散卷积计算方法;
2、学会线性常系数差分方程的迭代解法;
3、学会针对具体系统设计程序;
(二)实验内容
1、用MATLAB 画出如下表达式的脉冲序列
()8.0() 3.4(1) 1.8(2) 5.6(3) 2.9(4)0.7(5)f n n n n n n n δδδδδδ=+-+-+-+-+-
例如:x(1)=8.0; n=0:5;
fn=[8.0 3.4 1.8 5.6 2.9 0.7]; stem(n,fn); xlabel('n'); ylabel('fn');
n
f n
2、 计算卷积
用MATLAB 计算序列{1 2 3 3 2 1 1}和序列{-1 2 0 1}的离散卷积。 首先用手工计算,然后用MATLAB 函数conv(x,y)编程验证。 MATLAB 部分参考程序如下: a=[1 2 3 3 2 1 1]; c=conv(a,b); M=length(c)-1; stem(n,c);
xlabel('n'); ylabel('幅度');
subplot(3,1,1); a=[1 2 3 3 2 1 1]; stem(a); subplot(3,1,2)
b=[-1 2 0 1]; stem(b); subplot(3,1,3); c=conv(a,b); M=length(c)-1;
stem(c);
xlabel('n'); ylabel('幅度');
3、参考教材P14页,使用通用卷积convu 函数,计算如下卷积
已知h(n)=R 5(n+2),x(n)=3R 4(n-3),计算y(n)=x(n)*h(n)编程实现并在一幅图内分别画出h(n),x(n),y(n),标好横坐标与纵坐标。
离散信号的产生、显示及离散序列的卷积和matlab实现
离散信号的产生、显示及离散序列的卷积和matlab实现
离散信号的产生可以通过一个生成离散序列的函数来实现。Matlab提供了一些内置的函数来生成常见的离散信号,例如单位阶跃函数(heaviside)、单周期方波(square)、正弦信号(sin)、脉冲(impulse)等。
离散信号的显示可以使用Matlab的plot函数来实现。将离散序列作为函数的输入参数,然后使用plot函数绘制出序列的图像。
离散序列的卷积可以使用conv函数来实现。conv函数接受两个输入信号,并返回它们的离散卷积结果。
下面是一个示例代码演示离散信号的产生、显示和离散序列的卷积:
```matlab
% 产生离散信号
n = 0:1:9; % 定义离散点的范围
x1 = heaviside(n-2); % 单位阶跃函数
x2 = square(n); % 单周期方波
x3 = sin(n); % 正弦信号
% 显示离散信号
figure;
subplot(3,1,1);
stem(n, x1);
title('单位阶跃函数');
subplot(3,1,2);
stem(n, x2);
title('单周期方波');
subplot(3,1,3);
stem(n, x3);
title('正弦信号');
% 离散序列的卷积
h = [1, 2, 1]; % 卷积核
y = conv(x3, h); % 卷积运算
figure;
subplot(2,1,1);
stem(x3);
title('输入信号');
subplot(2,1,2);
stem(y);
title('卷积结果');
MATLAB卷积的程序代码与运行截图补充版
t1=-5:1/a:5;
f1=stepfun(t1,0);
f2=stepfun(t1,-1/a)-stepfun(t1,1/a);
subplot(231);
plot(t1,f1);axis([-5,5,0,1.2]);xlabel('时间');
ylabel('f1(t)');title('单位阶跃函数');
subplot(232);plot(t1,f2);ylabel('f2(t)');
title('单位冲激函数');
y=conv(f1,f2);r=2*length(t1)-1;t=-10:1/a:10;
subplot(233);plot(t,y);axis([-5,5,0,1.2]);
title('f1与f2的卷积');
ylabel('y(t)');
f11=conv(f1,f1);f22=conv(f2,f2);
subplot(234);plot(t,f11);title('f1与f1的卷积');
ylabel('f11(t)');axis([-5,5,0,5000]);
subplot(235);plot(t,f22);title('f2与f2的卷积');ylabel('f22(t)');
t1=-5:1/a:5;
f1=stepfun(t1,0);
f2=stepfun(t1,-1/a)-stepfun(t1,1/a);
subplot(231);
plot(t1,f1);xlabel('时间');
ylabel('f1(t)');title('单位阶跃函数');
subplot(232);plot(t1,f2);ylabel('f2(t)');
基于Matlab的离散卷积
基于Matlab 的离散卷积
刘国良
(洛阳理工学院 河南洛阳 471000)
摘 要:卷积运算广泛用于通讯、电子、自动化等领域的线性系统的仿真、分析及数字信号处理等方面。在Matlab 中可以使用线性卷积、圆周卷积和快速傅里叶运算实现离散卷积。线性卷积是工程应用的基础,但圆周卷积和快速傅里叶运算实现线性离散卷积具有速度快等优势,圆周卷积采用循环移位,在Matlab 中没有专用函数,需要根据圆周卷积的运算过程编制程序代码;快速傅里叶运算(FFT )是DSP 的核心算法,在序列比较长时FFT 是一种最合适的方法,运算速度快、程序简单,序列越长其优势越明显。以同一个例子介绍了进行离散卷积仿真运算的两种方法与特点。
关键词:Matlab ;数字信号处理;离散卷积运算;快速傅里叶运算
中图分类号:TP311 文献标识码:B 文章编号:10042373X (2009)052125202
Discreted Convolution B ased on Matlab
L IU Guoliang
(L uoyang Institute of Science and Technology ,L uoyang ,471000,China )
Abstract :The convolution operation is widely applied in the field of linear system simulations ,analysis and DSP design of communication ,electronics ,automatic system and so on ,linear convolution ,circular convolution and FFT for discreted convolu 2tion emulation operation can be adopted in Matlab.Linear convolution is the foundation of project application ,but circular con 2volution and FF T in linear convolution have advantages of fast speed.Circular convolution adopts circulating shift ,there is not privately function in Matlab ,it needs to draw up program code according to the operational course of circular convolution.FFT is the major operation of DSP ,when sequence grows fairly ,FF T is a kind of most suitable method ,it is more rapidly in opera 2tional speed and program simple ,the longer of the sequence the more of its advantage.With a same example ,to carry out characteristic and two kinds of method of emulation operation for discreted convolution are introduced.
离散序列卷积和(用matlab实现)
离散序列卷积和(用matlab实现)MATLAB
(一)实验目的:学会用MATLAB对信号与系统分析的方法,理解离散序列卷积和的计算对进行离散信号与系统分析的重要性。(二)实验原理:
1、离散时间序列f1(k)和f2(k)的卷积和定义:
,
f1(i),f2(k,i) f(k)=f1(k)*f2(k)= ,i
,,,
2、在离散信号与系统分析中有两个与卷积和相关的重要结论:
,
f(i),,(k,i) a、f(k)= =f(k)* δ(k)即离散序列可分解为一系列,i,,,
幅度由f(k)决定的单位序列δ(k)及其平移序列之积。
b、对线性时不变系统,设其输入序列为f(k),单位响应为h(k),其零状
,
f(i),h(k,i)态响应为y(k),则有:y(k)= ,i
,,,
3、上机:conv.m用来实现两个离散序列的线性卷积。
其调用格式是:y=conv(x,h)
若x的长度为N,h的长度为M,则y的长度L=N+M-1。(三)实验内容
,,,,1,2,3,4,56,2,3,6,4,21、题一:令x(n)= ,h(n)=,
y(n)=x(n)*h(n),求y(n)。
要求用subplot和stem画出x(n),h(n),y(n)与n的离散序列图形。
源程序:
N=5;
M=6;
L=N+M-1;
x=[1,2,3,4,5];
h=[6,2,3,6,4,2];
y=conv(x,h);
nx=0:N-1;
nh=0:M-1;
ny=0:L-1;
subplot(131); stem(nx,x,'*k'); xlabel('n'); ylabel('x(n)'); grid on ;
matlab 卷积 离散化数字信号
主题:matlab中的离散化数字信号卷积计算
一、matlab中的数字信号离散化
在matlab中,数字信号的离散化是常见的数据处理操作。离散化是指将连续信号以一定的时间间隔进行采样,转化为一系列离散的数据点。在数字信号处理中,离散化是必不可少的一步,因为大部分实际信号
都是连续的,需要经过离散化才能够被数字计算机进行处理。
离散化信号通常可以表示为一个数组或矩阵,每个元素代表特定时间
点上的信号幅值。在matlab中,可以使用数组、矩阵或table等数据结构来存储离散化信号数据。
二、matlab中的卷积计算
卷积是数字信号处理中常用的一种操作,用于描述两个信号之间的交
叉影响。在matlab中,可以使用conv函数来进行数字信号的卷积计算。该函数接受两个输入参数,分别表示两个待计算的信号,返回它
们的卷积结果。
在进行数字信号的卷积计算时,需要注意信号的长度和边界处理。matlab中的conv函数默认采用线性卷积,会在计算结果中自动填充
零以匹配两个信号的长度。若需要进行循环卷积或自定义边界处理,
可以使用circconv或conv2等其他函数。
三、matlab中的卷积计算示例
以下是一个使用matlab进行卷积计算的示例:
```matlab
生成输入信号
x = [1, 2, 3];
h = [0.1, 0.2, 0.1];
计算卷积
y = conv(x, h);
```
在这个示例中,我们定义了两个长度为3的输入信号x和h,然后使用conv函数计算它们的卷积结果y。通过运行上述代码,可以得到卷积结果y=[0.1, 0.4, 0.8, 0.7, 0.3]。
离散序列卷积(matlab实现)
离散序列卷积(matlab实现)
————————————————————————————————作者:————————————————————————————————日期:
数字信号处理实验报告
实验一 离散时间序列卷积和MATLAB 实现
(一)实验目的:学会用MATLAB 对信号与系统分析的方法,理解离散序列卷积和的计算对进行离散信号与系统分析的重要性。 (二)实验原理:
1、离散时间序列f1(k)和f2(k)的卷积和定义:
f(k)=f1(k)*f2(k)=
∑∞
-∞
=-•
i i k f i f )(2)(1
2、在离散信号与系统分析中有两个与卷积和相关的重要结论:
a 、f(k)=
∑∞
-∞
=-•i i k i f )()(δ=f(k)* δ(k)即离散序列可分解为一系列
幅度由f(k)决定的单位序列δ(k)及其平移序列之积。
b 、对线性时不变系统,设其输入序列为f(k),单位响应为h(k),其零状
态响应为y(k),则有:y(k)=
∑
∞
-∞
=-•i i k h i f )()(
3、上机:conv.m 用来实现两个离散序列的线性卷积。 其调用格式是:y=conv(x,h)
若x 的长度为N ,h 的长度为M ,则y 的长度L=N+M-1。 (三)实验内容
1、题一:令x(n)= {
}5,4,3,2,1,h(n)={}246326,,,,,,y(n)=x(n)*h(n),求y(n)。 要求用subplot 和stem 画出x(n),h(n),y(n)与n 的离散序列图形。
源程序: N=5; M=6;
L=N+M-1; x=[1,2,3,4,5]; h=[6,2,3,6,4,2]; y=conv(x,h); nx=0:N-1; nh=0:M-1; ny=0:L-1;
实验五 使用matlab实现卷积的运算
实验五 使用matlab 实现卷积的运算
一 实验目的
1、 学习MATLAB 语言的编程方法及熟悉MA TLAB 指令;
2、
深刻理解卷积运算,利用离散卷积实现连续卷积运算;
二 实验内容
1、 完成)(1t f 与)(2t f 两函数的卷积运算 其中:)4()()(),
()(221--==-t u t u t f t u e
t f t
在一个图形窗口中,画出)(1t f 、
)(2t f 以及卷积结果。要求每个坐标系有标题、坐标轴名称。
>> p=0.1; t=0:p:10;
f1=exp(-2*t).*u(t); f2=u(t)-u(t-4); f=conv(f1,f2); subplot(1,3,1); plot(t,f1,'r');
title('f1(t)=e^-2*t*u(t)'); xlabel('t(sec)'); ylabel('f1(t)'); subplot(1,3,2); plot(t,f2,'g');
title('f2(t)=u(t)-u(t-4)'); xlabel('t(sec)'); ylabel('f2(t)'); subplot(1,3,3); plot(f);
title('f(t)=f1(t)*f2(t)'); xlabel('t(sec)'); ylabel('f(t)');
05100
0.10.20.30.40.5
0.6
0.70.8
0.9f1(t)=e -
2*t*u(t)t(sec)
f 1(t )
510
0.10.20.30.4
0.50.6
0.70.80.9
matlab离散循环卷积
matlab离散循环卷积
离散循环卷积是信号处理和数字信号处理中的一个重要概念。在MATLAB中,可以使用内置函数`cconv`来实现离散循环卷积。这个函数的语法为:
matlab.
c = cconv(a, b, N)。
其中,`a`和`b`是长度为`N`的向量,表示输入的两个信号;`N`是信号的长度;`c`是长度为`N`的向量,表示输出的卷积结果。
在MATLAB中,离散循环卷积的计算可以使用`cconv`函数,也可以手动编写代码来实现。一种常见的实现方式是使用循环来计算离散循环卷积的结果。下面是一个简单的示例代码:
matlab.
function c = my_cconv(a, b, N)。
c = zeros(1, N);
for n = 1:N.
for k = 1:N.
j = mod(n k, N) + 1;
c(n) = c(n) + a(k) b(j);
end.
end.
end.
这段代码实现了离散循环卷积的计算过程,首先创建一个长度
为`N`的全零向量`c`,然后使用双重循环遍历输入信号`a`和`b`,
根据离散循环卷积的定义进行计算,并将结果保存在向量`c`中。
除了使用`cconv`函数和手动编写代码,还可以使用快速傅立叶
变换(FFT)来计算离散循环卷积,这种方法通常比直接计算更高效。
MATLAB中提供了`fft`和`ifft`函数来进行快速傅立叶变换和逆变换,可以利用这些函数来实现离散循环卷积的计算。
总之,离散循环卷积在信号处理和数字信号处理中具有重要的
应用,MATLAB提供了多种方式来实现离散循环卷积的计算,包括使
离散卷积的算法分析及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)'),%%加标签网格和标题
matlab卷积计算例题
matlab卷积计算例题
以下是一个MATLAB卷积计算的例题:
假设有两个信号序列x=[1,2,3]和h=[2,4],要求计算它们的卷积。MATLAB代码如下:
% 定义两个信号序列
x = [1,2,3];
h = [2,4];
% 计算卷积
y = conv(x,h);
% 输出卷积结果
disp(y);
运行以上代码,输出结果为:
csharp
y = 2 8 14 12
这就是两个信号序列x=[1,2,3]和h=[2,4]的卷积结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.1线性卷积
首先了解到两个连续时间信号x(t)和h(t)的卷积运算为
并在此基础上得道了LTI连续系统零状态响应的时域计算公式。类似的我们定义:
为序列x(n)和h(n)卷积和运算,即就是离散的线性卷积。
2.2 循环卷积
设序列h(n)和x(n)的长度分别为N和M。h(n)与x(n)的L点循环卷积定义为:
signal1=5*sin(2*pi*f*n)+10*cos(2*pi*n/8);
figure(1);
subplot(411)
stem(n,signal1);
title('原信号1');
xlabel('n');ylabel ('y(n)');
axis([0 18 -25 25])
long_M=5;
signal2=2*ones(1,long_M);
在序列比较长时FFT是一种最合适的方法,可以快速得出仿真运算的结果。选择圆周卷积或FFT运算线性离散卷积可提高DSP设计的效率。
通过对离散卷积的实现,加深了对卷积的理解,卷积的实现方式,卷积和FFT对应的关系。
附件:
clc;
clear;
close all;
N=14;
n=[1:N-1];
f=1/16;
if (i>long_M) %判断翻转序列是否超过了自身的长度
fk(k)=a; %超过了,后面的数为零,对应点上的值保持不变
else
fk(k)=a+signal2(i)*signal1(k-i+1);%计算对应点上的卷积值
a=fk(k);
end
end
else
for i=1:1:k %翻转列超过了原序列右边的第最后一个数
grid on;
subplot(412)
stem(circy);
title('用函数实现的循环卷积条件满足L>=M+N-1');
xlabel('n');ylabel('幅度');
grid on;
axis([0 18 -100 100]);
%%%%%%%循环卷积-当长度条件满足L<M+N-1(和线性卷积不相等)%%%
fn=1:1:changdu;
subplot(414)
stem(fn,Cy);
title('用fft方法实现的卷积');
xlabel('(n)');ylabel('幅度');
axis([0 18 -100 100]);
grid on;
xlabel('n');ylabel('幅度');
axis([0 18 -100 100]);
grid on;
%%%%%%%%%%fft实现卷积%%%%%%%%%%%%%
X1=fft(signal1,changdu);
X2=fft(signal2,changdu);
Y=X1.*X2;
Cy=ifft(Y,changdu);
xlabel('n');ylabel('幅度');
axis([0 18 -100 100]);
grid on;
%%%%%%%%循环卷积-当长度条件满足L>=M+N-1%%%%%%%%%%%%%%%
changdu=long_N+long_M-1;
Blsignal1=[signal1,zeros(1,changdu-long_N)];%补零
5分析的结论和心得体会
通过对线性卷积函数的重新实现后得到的序列,验证了函数是正确的,但是由于采用了较多for循环,使得此函数的运行效率不是很高。
用循环卷积和FFT运算离散卷积具有很大优势,在Matlab中循环卷积没有专用函数,需要自己编制,此例分析了循环卷积条件对于结果的影响,第三个序列是条件不满足N>=N1+N2-1时,序列变短且值对应的值也不同。
Blsignal2=Hn(L1,:); %移位赋值
end
end
circy=Hn'*Blsignal1';
figure(2);
subplot(411)
stem(JuanJi);
title('调用conv函数实现的卷积');
xlabel('n');ylabel('幅度');
axis([0 18 -100 100])
fk=zeros(0,loபைடு நூலகம்g_N+long_M+10); %初始化一个矩阵fk
if(long_N>long_M) %选择较短的矩阵进行翻转的运算
for k=1:1:long_N+long_M-1
a=0;
if (k<=long_N)%判断翻转序列的右边第一个数是否超过了原序列的最后一个数
for i=1:1:k
] (n)
L为循环卷积区间长度,L>=max[N,M]。本为的程序实现方法采用的是矩阵相乘实现循环卷积,
2.3 用FFT实现卷积
根据信号在时域与频域的关系,可以用FFT计算线性卷积,有定义可知
可以对x(n)和h(n)做N=N1+N2-1的FFT(其中N1为x(n)的长度,N2为h(n)的长度),再对 做N点得IFFT即可得到y(n)。
subplot(413)
stem(JuanJi);
title('用conv函数实现的卷积');
xlabel('n');ylabel('幅度');
axis([0 18 -100 100]);
grid on;
%%%%%%%%%%%重新对函数的实现%%%%%%%%%
long_N=length(signal1);
3离散卷积分析的步骤
1.通过定义重新实现线性卷积函数,对比调用的conv()函数验证重新实现卷积的是否正确。
2.实现循环卷积,通过设定循环卷积的长度条件N>=N1+N2-1和N<N1+N2-1,分析循环卷积和线性相等时满足的条件。
3.将两个序列做N点得FFT,举证相乘后,再做N点得IFFT,从而得到卷积的序列。
4离散卷积分析的结果
图1
图1为Matlab的程序仿真图,第三个序列为调用函数conv()实现的线性卷积,第四个序列为自编线性卷积函数。可以从两图中看到序列是相同的,从而说明自编的线性卷积函数是正确的。
图2
图2中的第一个是线性卷积的实现,第二个序列是条件满足N>=N1+N2-1时的循环卷积,第三个序列是条件不满足N>=N1+N2-1时的循环卷积,第四个序列是信号在时域与频域的关系,用FFT计算得到的线性卷积。
changdu1=long_N;
Blsignal3=[signal1,zeros(1,changdu1-long_N)];
Blsignal4=[signal2,zeros(1,changdu1-long_M)];
Hn1=zeros(changdu1,changdu1);
for L1=1:1:changdu1
if(L1==1)
Hn1(L1,:)=Blsignal4;
else
Hn1(L1,:)=circshift(Blsignal4,[0,1]);
Blsignal4=Hn1(L1,:);
end
end
circj=Hn1'*Blsignal3';
subplot(413)
stem(circj);
title('用函数实现的循环卷积条件为L<M+N-1');
基于MATLAB离散卷积的实现
1离散卷积实现的目的和方法
在数字信号处理(DSP)系统中,无论在时域或频域都离不开卷积运算和快速傅里叶(FFT)运算。可以使用线性卷积、循环卷积实现离散卷积,也可以根据时域信号函数与频谱函数的关系,使用快速傅里叶变换(FFT,IFFT)实现离散卷积。线性卷积是求离散系统响应的主要方法之一,许多重要应用都建立在这一理论基础上,如卷积滤波等,专用函数conv (x , h)可完成线性卷积过程。循环卷积的计算速度要远远快于线性卷积,如果选择圆周卷积的长度L≥N1+N2-1,则可以用圆周卷积取代线性卷积。FFT运算具有速度快、计算量小等优越性,是DSP的核心算法。根据信号在时域与频域的关系,同样可以用FFT计算线性卷积。通过编程实现的卷积函数深入的了解了卷积的原理。
subplot(412)
stem(signal2);
title('原信号2');
xlabel('n');ylabel('y(n)');
axis([0 18 -5 5]);
grid on;
%%%%%%%%%线性卷积函数%%%%%%%%%%%%%
JuanJi=conv(signal1,signal2);%调用函数conv实现卷积
Blsignal2=[signal2,zeros(1,changdu-long_M)];
Hn=zeros(changdu,changdu);%初始化一个矩阵
for L1=1:1:changdu
if(L1==1)
Hn(L1,:)=Blsignal2; %当处于第一行时不用进行移位操作
else
Hn(L1,:)=circshift(Blsignal2,[0,1]); %从第二行开始向右进行循环移位操作
if ((k-long_N+i>long_M)) %判断翻转序列是否超过自身的长度
fk(k)=a;
else
fk(k)=a+signal2(k-long_N+i)*signal1(long_N-i+1);
a=fk(k);
end
end
end
end
end
subplot(414)
stem(fk);
title('重新卷积函数的实现');