当前位置:文档之家› 重叠相加法实现卷积

重叠相加法实现卷积

设计任务

计算1个给定序列与输入序列的卷积。

功能:对给定的数据进行卷积运算,要求分段卷积由循环卷积实现。要求设计有数据导入界面,各种参数从软件界面可以输入,其中给定序列可以由界面输入,对运算前后的数据绘制曲线。

要求:

1)初步完成总体设计,搭好框架,确定人机对话的界面,确定函数功能,控

制参数的输入方法;

2)设计线性卷积的实现方案;

3)编写两序列作循环卷积的程序;

4)通过直接做线性卷积来检验最后结果。

设计步骤:

1)用结构化设计方法。一个程序划分成若干模块,每一个模块的函数功能要

划分好,总体设计应画出流程图;

2)输入输出界面要友好;

3)源程序书写要规范,加必要的注释;

4)要提供通过直接卷积进行检验的结果;

5)程序一定要要能运行起来。

一、原理

1、算法产生背景

DFT 是连续傅里叶变换在时域和频域上都离散的形式,将时域信号的采样变换为在离散时间傅里叶变换频域的采样。在形式上,变换两端(时域和频域上)的序列是有限长的。DFT 具备明确且合理的物理含义,适合应用于数字系统,同时可以方便地由计算机进行运算。

对于线性非移变离散系统,可由线性卷积表示时域输入输出关系,即

y(n)=x(n)*h(n)

通常采用循环卷积降低运算量,但实际中往往无法满足对信号处理的实时性要求。因此,产生了重叠相加法和重叠保留法两种典型的算法,用以快速计算线性卷积,成为了DFT 的一个重要应用。

2、算法基本思想

重叠相加法是将待过滤的信号分割成长为 N 的若干段,,每一段都可以和有限时宽单位取样回应作卷积,再将过滤后的各段重叠相加。

在实际应用中利用FFT来计算两个序列的圆周卷积从而实现计算其线性卷积,但是常遇到的问题是参加卷积的两个序列的长度相差较大,这样长度小的序列就需要补很多的零点,这样就需要大的存储量,运算时间也会变长。所以常用重叠相加法来解决。

如以下情况:

h(n)长度为N,x(n)长度为无限长

x(n)取M点,且与N尽量接近

可采用如下方法来解决

重叠相加法的卷积示意图

∑∞

-∞

==

k k

n x n x )

()()

()()(kM n R n x n x M k -= x(n)与h(n)的卷积为

)

(*)()(*)()(n x n h n h n x n y k k ∑∞

-∞

===)

()](*)([n y n h n x k k k

k ∑

∑∞

-∞

=∞

-∞

===

重叠相加法的步骤如下

(1)将h(n)补零延长到L =M+ N -1,并计算长为L 的FFT ,得到 H(k)。 (2)分别将xk(n)补零延长到L =M+ N -1,并计算长为L 的FFT ,得到 Xk(k) (3)计算)()()(k H k X k Y k k =,并求长为L 的反变换,即

)]([)(k Y IFFT n y k k =

(4)将yk(n)的重叠部分相加,最后得到结果为∑∞

-∞

==

k k

n y n y )()(

二、程序设计

1、程序设计思路

函数juanji(x1,x2,L)设计

(1) x 1(n)进行N 点快速傅里叶变换得X1k (2) x 2(n)进行N 点快速傅里叶变换得X2k (3) 进行频域相乘Yk=X1k*X2k

(4) 对Yk 进行反变换得到时域卷积结果y(n) 函数chongdie (x,h,N )设计

(1)首先取圆周卷积的周期L (即进行L 点的快速傅里叶变换) (2)计算每一分段的大小N

(3)填充序列使得循环中对序列的索引不会超出范围 (4)计算分段数K

(5)对序列进行分段调用juanji()函数计算圆周卷积 (6)各段重叠相加 (7)取出实际的输出序列

2、程序流程图

开始

对x1(n)进行FFT运算

对x(2)进行FFT运算

频域相乘

Yk=X1k*X2k

对Yk进行反变换得到时域结果y(n)

结束

开始

取圆周卷积

的周期L

计算每一分段的大小N

将序列按要求

填充

计算分段数K

调用卷积函数

将各段处理的结果重叠相加输出最终结果

结束

重叠相加法

卷积

三、分析与测试

1、循环卷积设计

①程序

M = length(h);

if N

end

L = M+N-1; %循环卷积与线性卷积结果相同时需要进行运算的最少点数

Lx = length(x);

T = ceil(Lx/N); %确定分段数T

t = zeros(1,M-1); %初始化序列t(n)

x = [x,zeros(1,(T+1)*N-Lx)]; %不足的分段补零

y = zeros(1,(T+1)*N); %生成输出序列y(n),长度足够长

for i=0:1:T

xi=i*N+1;

x_seg = x(xi:xi+N-1); %选择低点数计算时的分段x(n)

X1k = fft(x_seg,L); %x_seg做L点FFT

X2k = fft(h,L); %h做L点FFT

Yk = X1k.*X2k; %频域相乘

y_seg = ifft(Yk); %FFT反变换得循环卷积结果

y_seg(1:M-1)=y_seg(1:M-1)+t(1:M-1);%完成重叠相加

t(1:M-1) = y_seg(N+1:L); %重新对t(n)赋值为保留的后M-1点y(xi:xi+N-1)=y_seg(1:N); %直接输出前N个点

end

y=y(1:Lx+M-1); %取出最终的输出序列

②测试

设N=4

h=[1,2,3,4]

X=[1,2,3,4,5,6,7,8,9]

调用系统函数fftfilt(h,x,N)

对比生成图像

设计函数图形

系统函数fftfilt(h,x,N)

③分析

设计函数与系统函数前7个点一样,系统函数没有后4-1=3个点,4为h(n)长度。设计函数符合要求。

2、线性卷积设计

①程序

Lx=length(A)+length(B)-1; %线性卷积长度

l1=length(A)-1;

l2=length(B)-1;

A=[zeros(1,l2) A zeros(1,l2)]; %A序列前后补零

B=fliplr(B); %反转B

B=[B,zeros(1,l1+l2)]; %B序列后面补零与A长度相等for i=1:Lx %计算z(i)

z(i)=A(1)*B(1);

for k=2:length(B)

z(i)=z(i)+A(k)*B(k);

end

t=B(length(B)); %保存B序列最后一个数for j=length(B):-1:2 %B序列依次向后移位

B(j)=B(j-1);

end

B(1)=t;

end

②测试

设h=[1,3,5,7]

X=[9,8,7,6,5,4,3,2,1]

调用系统函数conv(h,x)

对比生成图像

设计函数图形

系统函数conv(h,x)

③分析

设计函数与调用系统函数结果完全相同,设计函数符合要求。

四、实验结果

1、实验源程序

见附录

2、实验结果

五、总结

作为电子信息工程系的学生,数字信号处理这门课程是其他很多课程的基础,所以学好学通数字信号处理这门课程对我们来说是非常重要的。而MATLAB这款软件对数字信号处理的建模、编程、分析、实现有极大的帮助作用,所以我们应该掌握使用MATLAB编程来实现对数字信号的处理。

此次我得到的课设题目是:通过重叠相加法计算卷积。拿到课设题目后,我仔细研究了与题目相关的原理,包括线性卷积、周期卷积、圆周卷积、重叠相加法、离散福利叶变换DFT、快速傅里叶变换FFT等原理知识,弄清楚了它们之间的关系。通过这次课程设计,我不仅顺利完成课程设计的要求,而且在课程设计过程中通过对相关原理的回顾,对各相关原理之间的关系有了脱胎换骨般的认识,让我意识到此前学到的知识是多么的浅薄。

在和同组同学一起讨论研究通基于重叠相加法的圆周卷积原理后,我开始了利用MATLAB来实现这个功能。在编写程序的过程中,我查阅了很多有关MATLAB的编程知识,通过整合所查阅到的编程知识,结合先前研究的基于重叠相加法的圆周卷积原理,我设计了具有此功能的MATLAB函数。在设计时我遇到了不少的问题,刚开始时我先设定分段长度N,然后由N来求卷积周期L。但是在程序运行过程中我发现算法具有很大的局限性。通过仔细揣摩这其中的问题,原来是我忽略了FFT 运算的条件。所以我制定了第二个方案,先设定卷积的周期L,然后由L来求分段长度N,这样程序的适用范围就扩大了。为了提高程序的适用性,我不断的对程序进行修改和测试,以求能够达到更好的效果,这个过程让我体会到了编程解决问题的乐趣。

通过这次课程设计,让我加深了对书本知识的理解,并应用课本的理论知识,结合相关软件,设计解决问题的算法。从而提高了由知识转换为技能的能力,提高了自己的实践能力。通过与同学的互相沟通,不仅使各自的知识得到了扩充,而且

从中得到了很多的启示,这次课程设计让人受益匪浅。

六、参考文献

【1】高西全、丁玉美.数字信号处理第三版.西安电子科技大学出版社.2008.

【2】罗建军、杨琦.精讲多练MATLAB.西安:西安交通大学出版社.2002.

【3】刘泉、阙大顺、郭志强.数字信号处理.电子工业出版社.2009.

【4】程卫国.MATLAB53精要编程及高级应用.北京:机械工业出版社.2000.

【5】李正周.MATLAB数字信号处理与应用.北京: 清华大学出版社.2008.

【6】周建兴、岂兴明等编. MATLAB从入门到精通.人民邮电出版社.2008

【7】徐金明、张孟喜、丁涛编. Matlab实用教程.清华大学出版社,北京交通大学出版社.2007.

附录:源程序

function varargout = zc(varargin)

%ZC M-file for zc.fig

% ZC, by itself, creates a new ZC or raises the existing

% singleton*.

%

% H = ZC returns the handle to a new ZC or the handle to

% the existing singleton*.

%

% ZC('Property','Value',...) creates a new ZC using the

% given property value pairs. Unrecognized properties are passed via % varargin to zc_OpeningFcn. This calling syntax produces a

% warning when there is an existing singleton*.

%

% ZC('CALLBACK') and ZC('CALLBACK',hObject,...) call the

% local function named CALLBACK in ZC.M with the given input

% arguments.

%

% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one

% instance to run (singleton)".

%

% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help zc

% Last Modified by GUIDE v2.5 30-Jun-2010 22:11:29

% Begin initialization code - DO NOT EDIT

gui_Singleton = 1;

gui_State = struct('gui_Name', mfilename, ...

'gui_Singleton', gui_Singleton, ...

'gui_OpeningFcn', @zc_OpeningFcn, ...

'gui_OutputFcn', @zc_OutputFcn, ...

'gui_LayoutFcn', [], ...

'gui_Callback', []);

if nargin && ischar(varargin{1})

gui_State.gui_Callback = str2func(varargin{1});

end

if nargout

[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else

gui_mainfcn(gui_State, varargin{:});

end

% End initialization code - DO NOT EDIT

% --- Executes just before zc is made visible.

function zc_OpeningFcn(hObject, eventdata, handles, varargin)

% This function has no output args, see OutputFcn.

% hObject handle to figure

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% varargin unrecognized PropertyName/PropertyValue pairs from the % command line (see VARARGIN)

% Choose default command line output for zc

handles.output = hObject;

% Update handles structure

guidata(hObject, handles);

% UIWAIT makes zc wait for user response (see UIRESUME)

% uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line. function varargout = zc_OutputFcn(hObject, eventdata, handles)

% varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure

varargout{1} = handles.output;

function aa_Callback(hObject, eventdata, handles)

% hObject handle to aa (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of aa as text

% str2double(get(hObject,'String')) returns contents of aa as a double

% --- Executes during object creation, after setting all properties.

function aa_CreateFcn(hObject, eventdata, handles)

% hObject handle to aa (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.

% See ISPC and COMPUTER.

if ispc

set(hObject,'BackgroundColor','white');

else

set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end

function bb_Callback(hObject, eventdata, handles)

% hObject handle to bb (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of bb as text

% str2double(get(hObject,'String')) returns contents of bb as a double

% --- Executes during object creation, after setting all properties.

function bb_CreateFcn(hObject, eventdata, handles)

% hObject handle to bb (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

相关主题
文本预览
相关文档 最新文档