用MATLAB实现序列圆周卷积
- 格式:doc
- 大小:31.00 KB
- 文档页数:3
摘要在信号处理中,许多具体的应用是以线性卷积为基础的。
当序列点数较少时可以直接计算线性卷积,然而当序列长度很长时,直接计算卷积的运算量非常庞大。
快速卷积是实现卷积的一种快速算法,减少了运算量,节约了时间,给我们计算卷积提供了很大的便利。
本课程设计是以Matlab为基础,完成序列的卷积和快速卷积运算的编程实现,以及相应的分析和比较。
关键字:Matlab 卷积快速卷积目录1.基于设计题目的原理简介 (1)1.1 序列卷积的定义 (1)1.2 快速傅里叶变换FFT概念 (1)1.3 快速卷积方法及实现 (1)2.程序设计及运行结果分析 (3)2.1 题目一 (3)2.2 题目二 (4)2.3 题目三 (7)3.心得体会 (10)参考文献 (11)专业综合课程设计成绩评定表 (12)1.基于设计题目的原理简介卷积是数字信号处理(DSP)系统中最常见的,也是最重要的运算之一,无论在时域或频域都离不开卷积运算,FFT是DFT的快速算法,当满足一定条件时可用来计算线性卷积,称为快速卷积。
Matlab具有强大的矩阵运算能力,方便实用的绘图功能和语言的高度集成性,在DSP开发中,使用Matlab可以快速对系统进行仿真运算。
1.1 序列卷积的定义设x(n)和h(n)是两个离散序列,进行下列求和运算:∑∞-∞== -=nnhnxmnhmxny)(*)()()()(这样,随着n的不同取值,这个求和公式就定义了一个新序列y(n),称为序列x(n)与h(n)的卷积,记为y(n)=x(n)*h(n) 。
由于DSP主要依靠计算机完成,而计算机无论在时域或频域只能处理有限长的离散信号。
此时只需令上述公式中的n在一个范围内取值即可。
1.2 快速傅里叶变换FFT概念DFT就是对序列频谱的离散化,在数字信号处理中有着重要的作用,但直接计算DFT 的运算量非常大,它与序列长度的平方成正比,因此制约了DFT的应用。
快速傅里叶变换FFT是实现DFT的一种快速算法,能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。
(一)实验目的:学会用MATLAB 对信号与系统分析的方法,理解离散序列卷积和的计算对进行离散信号与系统分析的重要性。
(二)实验原理:1、离散时间序列f1(k)和f2(k)的卷积和定义:f(k)=f1(k)*f2(k)=∑∞-∞=-•i i k f i f )(2)(12、在离散信号与系统分析中有两个与卷积和相关的重要结论: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 ;subplot(132); stem(nh,h,'*k'); xlabel('n'); ylabel('h(n)'); grid on ;subplot(133); stem(ny,y,'*k'); xlabel('n'); ylabel('y(n)'); grid on ; 实验结果:nx (n)nh (n)ny (n )分析实验结果:根据实验结果分析可知,实验所得的数值跟x (n )与y (n )所卷积的结果相同。
matlab卷积计算例题卷积是信号处理中一种常用的数学运算方法,它用于描述两个函数之间的特殊运算关系。
在Matlab中,我们可以利用内置函数或者自定义函数来进行卷积计算。
本文将以一个具体的例题为基础,介绍Matlab中卷积计算的方法。
首先,我们定义两个信号序列x和h:x = [1, 2, 3, 4];h = [1, 1, 1];这里,x表示输入信号,h表示系统的冲激响应。
接下来,我们可以使用Matlab内置的conv函数来进行卷积计算:y = conv(x, h);通过上述代码,我们得到了卷积结果y。
为了更好地理解卷积计算的过程,我们可以手动实现卷积计算。
具体步骤如下:1. 翻转h序列,得到h':h' = [1, 1, 1];2. 在x序列前后各添加与h'序列长度相等的零元素,得到x':x' = [0, 1, 2, 3, 4, 0];3. 将h'序列从x'序列的第一个元素开始与x'序列逐个相乘,得到中间结果:[0, 1, 2, 3, 4, 0] * 1 = [0, 1, 2, 3, 4, 0][0, 1, 2, 3, 4, 0] * 1 = [0, 1, 2, 3, 4, 0][0, 1, 2, 3, 4, 0] * 1 = [0, 1, 2, 3, 4, 0]4. 将上述中间结果依次相加,得到最终的卷积结果y:y = [0, 1, 3, 6, 9, 7, 4, 0]通过手动计算,我们得到的卷积结果与使用conv函数计算得到的结果一致。
除了使用conv函数,我们还可以通过定义自定义函数来实现卷积计算。
下面是一个示例代码:function y = myConv(x, h)N = length(x);M = length(h);y = zeros(1, N+M-1);for n = 1:N+M-1for k = 1:Nif n-k+1 > 0 && n-k+1 <= My(n) = y(n) + x(k) * h(n-k+1);endendendend通过调用自定义函数myConv,同样可以得到卷积结果y。
matlab 实现圆周卷积函数
圆周卷积是数字信号处理中常用的一种卷积方式,它可以用于周期性信号的卷积计算,而且具有一定的计算效率。
在 MATLAB 中,可以使用 fft 函数实现圆周卷积。
具体实现方法如下:
1. 将两个周期性信号分别进行 fft 变换,得到它们的频域表示。
2. 对两个频域信号进行逐元素相乘。
3. 对结果进行 ifft 变换,得到圆周卷积的时域表示。
4. 若信号长度为 N,则在进行 fft 变换时,应该使用长度为2N-1 的 fft 算法。
在 MATLAB 中,可以使用如下代码来实现圆周卷积函数:
function y = cconv(x1,x2)
N = length(x1);
if(N~=length(x2))
error('Error: Input signals must be of equal length'); end
y = ifft(fft(x1,2*N-1).*fft(x2,2*N-1));
end
其中,x1 和 x2 分别表示要进行卷积计算的两个周期性信号,y 表示圆周卷积的结果。
该函数实现了两个信号的圆周卷积计算,并可以处理信号长度不相等的情况。
在使用该函数时,可以将要进行卷积计算的两个信号作为参数
传入函数中,例如:
x1 = [1,2,3,4];
x2 = [5,6,7,8];
y = cconv(x1,x2);
上述代码将计算 x1 和 x2 的圆周卷积,并将结果保存在 y 变量中。
Matlab中的卷积与相关运算详解引言Matlab是一种强大的科学计算工具,其支持多种数学运算和信号处理操作。
在信号处理中,卷积和相关运算是非常重要的概念,用于处理和分析信号。
本文将详细介绍在Matlab中实现卷积和相关运算的方法和应用。
1. 卷积运算1.1 卷积的定义卷积运算是信号处理中常用的一种数学运算,它描述了两个信号之间的某种关联。
在时间域中,卷积运算可以表示为两个函数的积分。
具体而言,对于两个函数f(t)和g(t),其卷积函数为:h(t) = ∫f(τ)g(t-τ)dτ其中,h(t)表示卷积结果函数,τ为积分变量。
1.2 Matlab中的卷积函数在Matlab中,可以通过conv函数来实现卷积运算。
conv函数的语法为:y = conv(u, v)其中,u和v分别为输入的两个向量,y为卷积结果。
需要注意的是,输入向量的长度必须相同。
示例代码:u = [1, 2, 3];v = [4, 5, 6];y = conv(u, v);disp(y);运行上述代码,将输出卷积结果[4, 13, 28, 27, 18]。
1.3 卷积的应用卷积运算在信号处理中有广泛的应用,例如平滑滤波、图像处理、系统响应等。
下面以平滑滤波为例来说明卷积的应用。
示例代码:x = [0, 0, 1, 1, 1, 0, 0];h = [0.2, 0.2, 0.2];y = conv(x, h, 'same');disp(y);运行上述代码,将输出平滑滤波后的信号[0.4, 0.6, 0.8, 0.8, 0.8, 0.4, 0.2]。
通过卷积运算,我们可以实现对信号的平滑处理,去除噪声和突变。
2. 相关运算2.1 相关的定义相关运算是另一种常用的信号处理运算,它描述了两个信号之间的相似性。
在时间域中,相关运算可以表示为两个函数的乘积积分。
具体而言,对于两个函数f(t)和g(t),其相关函数为:r(t) = ∫f(τ)g(t+τ)dτ其中,r(t)表示相关结果函数,τ为积分变量。
↑前言MATLAB 是一套功能强大的工程计算及数据处理软件,广泛应用于工业,电子,医疗和建筑等众多领域。
它是一种面向对象的,交互式程序设计语言,其结构完整又优良的可移植性。
它在矩阵运算,数字信号处理方面有强大的功能。
另外,MATLAB 提供了方便的绘图功能,便于用户直观地输出处理结果。
本课程实验要求学生运用MATLAB 编程完成一些数字信号处理的基本功能,加深对教学内容的理解。
课程试验1——用MATLAB 实现序列卷积运算一、实验目的• 加深对常用离散信号的理解• 熟悉并验证离散时间信号用数字序列表示的方法及序列的线性卷积运算。
二、实验内容1、(1)单位抽样序列⎩⎨⎧=01)(n δ 00≠=n n 在MATLAB 中可以利用zeros()函数实现。
;1)1();,1(==x N zeros x 如果)(n δ在时间轴上延迟了k 个单位,得到)(k n -δ即:⎩⎨⎧=-01)(k n δ 0≠=n k n(2)正弦序列)/2sin()(ϕπ+=Fs fn A n x在MATLAB 中)/***2sin(*1:0fai Fs n f pi A x N n +=-= 2、用MATLAB 计算序列x 1[k]={-2,0,1,–1,3;k=-1,0,1,2,3}和序列x 2[k]={1, 2, 0,-1;k=-2,-1,0,1}的线性卷积。
三、实验要求1、用MATLAB 独立编程并给出运行结果2、试验报告的书写格式(1)试验目的(2)试验内容(3)程序清单(4)运行结果(5)总结(试验结果分析、心得与体会等)。
信号卷积在 MATLAB 中的实现宋德周【摘要】The core digital signal processing algorithm is the Discrete Fourier Transform (DFT), is the DFT to the signal in the digital domain and frequency domain are realized discrete,general-purpose computer which can handle discrete signal. Discrete Fourier transform, in communications, voice processing, image processing, radar, medical imaging and other fields is widely used, but this is by convolution and correlation operations on continuous signals and sequences based on spectral analysis. Volume integral for the circular convolution, linear convolution. This paper analyzes under what circumstances can use cyclic convolution operation instead of linear convolution and the corresponding program codes in MATLAB to achieve this on two sequences of arbitrary input cyclic convolution, the keyboard sequence can input the final results and waveform display.%核心的数字信号处理算法是离散傅立叶变换(DFT),是在数字域和频率域对信号的DFT 实现离散,通用计算机可以处理离散信号。
⽤matlab验证卷积定理
⽤matlab验证卷积定理
卷积定理
⼀、实验⽬的
通过本实验,验证卷积定理,掌握利⽤DFT和FFT计算线性卷积的⽅法。
⼆、实验原理
时域圆周卷积在频域上相当于两序列DFT的相乘,因⽽可以采⽤FFT的算
法来计算圆周卷积,当满⾜
121
L N N
≥+-时,线性卷积等于圆周卷积,因此可利⽤FFT计算线性卷积。
三、实验内容和步骤
1.给定离散信号()
x n和()
h n,⽤图解法求出两者的线性卷积和圆周卷积;2.编写程序计算线性卷积和圆周卷积;
3.⽐较不同列长时的圆周卷积与线性卷积的结果,分析原因。
四、实验设备
计算机、Matlab软件
五、实验报告要求
1.整理好经过运⾏并证明是正确的程序,并且加上详细的注释。
2.给出笔算和机算结果对照表,⽐较不同列长时的圆周卷积与线性卷积的结果对照,作出原因分析报告。
3.结出⽤DFT计算线性卷积的⽅法。
[Matlab]线性卷积圆周卷积代码实现1、线性卷积周期卷积圆周卷积的关系:2、Matlab实验及现象圆周卷积:1 %% 圆周卷积实例程序2 %% Alimy 2014年11⽉21⽇20:19:123 clc;4 clear;5 %%准备数据6 N = 5;7 M = 5;8 L = N + M -1;9 x1n = [1,2,3,4,5];10 x2n = [1,5,9,7,3];11 kn_x1 = 0:1:N-1;12 kn_x2 = 0:1:M-1;13 kn_y = 0:1:L-1;14 %%画原始有限长序列15 subplot(4,2,1);16 stem(kn_x1,x1n);17 xlabel('n','FontSize',15);18 ylabel('x1n','FontSize',15);19 subplot(4,2,2);20 stem(kn_x2,x2n);21 xlabel('n','FontSize',15);22 ylabel('x2n','FontSize',15);2324 x1n_t = [x1n, zeros(1,L-N)]; %%补零25 x2n_t = [x2n, zeros(1,L-M)];26 kn_x1t = 0:1:(N+M-1)-1;27 kn_x2t = 0:1:(N+M-1)-1;28 %%画补0后序列29 subplot(4,2,3);30 stem(kn_x1t,x1n_t);31 xlabel('n','FontSize',15);32 ylabel('x1n补0后','FontSize',15);33 subplot(4,2,4);34 stem(kn_x2t,x2n_t);35 xlabel('n','FontSize',15);36 ylabel('x2n补0后','FontSize',10);3738 x1n_t = [x1n_t,x1n_t,x1n_t,x1n_t]; %沿拓39 x1n_t = fliplr(x1n_t); %翻转40 [x1t_x,x1t_y] = size(x1n_t);41 x1t_numbers = x1t_x * x1t_y;42 kn_x1t = -17:1:18;43 %%画沿拓翻转后的周期序列44 subplot(4,2,5);45 stem(kn_x1t,x1n_t);46 xlabel('t','FontSize',15);47 ylabel('x1n_t补0后再沿拓翻转后','FontSize',10);4849 x2n_t = [zeros(1,L),zeros(1,L),x2n_t,zeros(1,L)];50 kn_x2t = -18:1:17;51 subplot(4,2,6);52 stem(kn_x2t,x2n_t);53 xlabel('t','FontSize',15);54 ylabel('x2n_t补0后沿拓翻转后','FontSize',15);555657 %% 乘加移位58 yn = zeros(1,2*L);59for I = 1:1:1860 x1n_t = circshift(x1n_t,[0,1]);61 yn(I) = x2n_t*x1n_t';62 end6364 kn_yn = 0:1:2*(N+M-1)-1;65 subplot(4,2,7);66 stem(kn_yn,yn);67 xlabel('n','FontSize',15);68 ylabel('圆周卷积结果','FontSize',15);6970 %%取主值序列71 ynmain = zeros(1,L);72for I = 1:1:973 ynmain(I) = yn(I);74 end75 kn_ynm = 0:1:8;76 subplot(4,2,8);77 stem(kn_ynm,ynmain)78 xlabel('n','FontSize',15);79 ylabel('主值序列','FontSize',15);8081 %%cycleConv.m线性卷积:1 %% 线性卷积2 clc;3 clear;4 %%5 N = 5;6 M = 5;7 L = N + M - 1;8 x1n = [1,2,3,4,5];9 kx1 = 0:1:N-1;10 x2n = [1,5,9,7,3];11 kx2 = 0:1:M-1;1213 %% 线性卷积14 yn = conv(x1n,x2n);15 kyn = kx1(1)+kx2(1):1:kx1(end)+kx2(end); % 0:1:(N+M-1)-11617 %% 循环卷积 To do 2014年11⽉20⽇ 15:25:36 循环卷积怎么做1819 %% 画图20 subplot(2,2,1);21 stem(kx1,x1n);22 xlabel('n');23 ylabel('x1n');24 title('信号1');2526 subplot(2,2,2);27 stem(kx2,x2n);28 xlabel('n');29 ylabel('x1n');30 title('信号2');3132 subplot(2,2,3);33 stem(kyn,yn);34 xlabel('n');35 ylabel('yn');36 title('线性卷积结果');37 yn %% 1 7 22 44 69 88 82 47 15 linConv.m结果如下:当 L = N + M -1时,圆周卷积和线性卷积的结果⼀致:yn =1 7 22 44 69 88 82 47 15圆周卷积:线性卷积:。
数字信号处理实验报告
实验项目名称:用MATLAB实现序列的圆周卷积
实验日期: 2012-11-28 实验成绩:
实验评定标准:
一、实验目的
通过本实验,掌握一些基本而且重要的离散时间信号,熟悉基本离散时间信号的MATLAB实现方法。
二、实验器材
PC机,MATLAB软件。
三、实验内容
计算两序列x1(n)={1,2,3,4,5},x2(n)={1,2,3,4,5,4,3,2,1}的圆周卷积。
四、实验结果
实验代码:
clear all
close all
clc
x1=[1,2,3,4,5,6,7,8];
x2=[1,2,3,4,5,6,7,8,7,6,5,4,3,2, 1]; N=length(x1)+length(x2); n=0:N-1
n1=0:N-2;
n2=0:N-3;
y1=circonvt(x1,x2,N);
y2=circonvt(x1,x2,N-1);
y3=circonvt(x1,x2,N-2);
x1=[x1 zeros(1,N-length(x1))]; x2=[x2 zeros(1,N-length(x2))]; Xf1=dft(x1,N);
Xf2=dft(x2,N);
Xf=Xf1.*Xf2;
x=idft(Xf,N);
x=real(x);
subplot(2,3,1)
stem(n,x1);
title('x1(n)');
subplot(2,3,2)
stem(n,x2); title('x2(n)')
subplot(2,3,3);
stem(n,x);
title('x(n)=IDFT(X(k))'); subplot(2,3,4);
stem(n,y1);
title('N点圆周卷积'); subplot(2,3,5);
stem(n1,y2);
title('N-1点圆周卷积'); subplot(2,3,6);
stem(n2,y3);
title('N-2点圆周卷积');
function y=circonvt(x1,x2,N)
if length(x1)>N
error('N 必须 >= x1的长度') end
if length(x2)>N
error('N 必须 >= x2的长度') end
x1=[x1 zeros(1,N-length(x1))]; x2=[x2 zeros(1,N-length(x2))]; m=[0:1:N-1];
x2=x2(mod(-m,N)+1);
H=zeros(N,N);
for n=1:1:N
H(n,:)=cirshift(x2,n-1,N); end
y=x1*H;
function y=cirshift(x,m,N) if length(x)>N
error('N 必须 >= x的长度') end
x=[x zeros(1,N-length(x))];
n=[0:1:N-1];
n=mod(n-m,N);
y=x(n+1);
function [Xk]=dft(xn,N)
n=[0:1:N-1];k=[0:1:N-1];
WN=exp(-j*2*pi/N);
nk=n'*k;
WNnk=WN.^nk;
Xk= xn * WNnk;
function [xn]=idft(Xk,N)
%计算逆离散傅里叶变换
%[xn]=idft(Xk,N)
n=[0:1:N-1];
k=[0:1:N-1]; WN=exp(-j*2*pi/N); nk=n'*k; WNnk=WN.^(-nk); xn=(Xk*WNnk)/N;
实验结果:
五、 实验结果分析
x(n)=IDFT(X (k))
N 点圆周卷
积
N-1点圆周卷
积
N-2点圆周卷积。