基于DSP的卷积算法的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
摘要 (3)
绪论 (3)
课程设计方案及原理 (3)
课程设计步骤及过程 (10)
总结 (16)
参考文献 (16)
基于DSP的卷积算法的实现
摘要:卷积和(简称卷积)是信号处理中常用的算法之一。

数字卷积运算通常采用两种方法:线性卷积和圆卷积。

为了能使卷积运算在C54x系列DSP上的实现方法,首先要对数字卷积的基本概念作深入了解。

使大家从根本上掌握卷积的实现方法,我们以模拟信号的卷积和数字信号的卷积为主,以及他们在C54x系
列DSP上的实现方法。

绪论:在通信和信号处理中,常用的运算,如卷积,自相关,滤波和快速傅里叶交换等。

都具有较高的密度性和复杂性,而这些运算中所用到的最基本的是乘法-累加运算。

C54x的硬件及软件设计使其具有快速的进行乘法-累加运算功能,并具有丰富的软件资源为这些算法的实施提供有力的条件。

因此,这种芯片在通信及信号处理等领域得到广泛的应用。

本节主要介绍卷积算法在DSP原理中的应用。

课程设计方案及原理
一、实验目的
1.掌握用窗函数法设计卷积算法的原理和方法;
2.熟悉卷积算法特性;
3.了解各种窗函数对卷积算法的影响。

二、实验设备
计算机,Code Composer Studio 2.0 for ’C5000系统。

三、实验原理
1.卷积的基本原理和公式
卷集和:对离散系统“卷积和”也是求线性时不变系统输出响应(零状态响应)的主要方法。

卷积和的运算在图形表示上可分为四步:
Y(n)= ∑X(m)h(n−m)=X(n)*h(n)
m=−∞
1)翻褶先在哑变量坐标M上作出x(m)和h(m),将m=0的垂直轴为轴翻褶成h(-m)。

2)移位将h(-m)移位n,即得h(n-m)。

当n为正整数时,右移n位。

当n为负整数时,左移n位。

3)相乘再将h(n-m)和x(m)的相同m值的对应点值相乘。

4)相加把以上所有对应点的乘积叠加起来,即得y(n)值。

依上法,取n=…,-2,-1,0,1,2,3,…各值,即可得全部y(n)值。

2.程序流程图
3.程序的自编函数及其功能
(1)processing1(int *input2, int *output2)
调用形式:processing1(int *input2, int *output2)
参数解释:intput2、output2为两个整型指针数组。

返回值解释:返回了一个“TREN”,让主函数的while循环保持连续。

功能说明:对输入的input2 buffer波形进行截取m点,再以零点的Y轴为对称轴进行翻褶,把生成的波形上的各点的值存入以OUTPUT2指针开始的一段地址空间中。

(2)processing2(int *output2, int *output3)
调用形式:processing2(int *output2, int *output3)
参数解释:output2、output3为两个整型指针数组。

返回值解释:返回了一个“TREN”,让主函数的while循环保持连续。

功能说明:对输出的output2 buffer波形进行作n点移位,然后把生成的波形上的各点
的值存入以OUTPUT3指针开始的一段地址空间中。

(3)processing3(int *input1,int *output2,int *output4)
调用形式:processing3(int *input1,int *output2,int *output4)
参数解释:output2、output4、input1为三个整型指针数组。

返回值解释:返回了一个“TREN”,让主函数的while循环保持连续。

功能说明:对输入的input2 buffer波形和输入的input1 buffer作卷积和运算,然后把
生成的波形上的各点的值存入以OUTPUT4指针开始的一段地址空间中。

(4)processing4(int *input2,int *output1)
调用形式:processing4(int *input2,int *output1)
参数解释:output1、input2为两个整型指针数组。

返回值解释:返回了一个“TREN”,让主函数的while循环保持连续。

功能说明:对输入的input2 buffer波形截取m点,然后把生成的波形上的各点的值存
入以OUTPUT1指针开始的一段地址空间中。

源程序如下:
#include <stdio.h>
#include "volume.h"
/* Global declarations */
int inp1_buffer[BUFSIZE];
int inp2_buffer[BUFSIZE]; /* processing data buffers */
int out1_buffer[BUFSIZE];
int out2_buffer[BUFSIZE];
int out3_buffer[BUFSIZE];
int out4_buffer[BUFSIZE*2];
int size = BUFSIZE;
int ain = MINGAIN;
int zhy=0;
int sk=64; /*sk代表所开的bufsize的大小,需修改它.输入文件sine.dat为32点,sine11.dat,
sin22.dat,sin33.dat,sin44.dat为64点的输入波形.*/
/* volume control variable */
unsigned int processingload = 1; /* processing routine //load value */
/* Functions */
extern void load(unsigned int loadValue);
static int processing1(int *output1, int *output2);
static int processing2(int *output2, int *output3);
static int processing3(int *input1,int *output2,int *output4);
static int processing4(int *input2, int *output1);
static void dataIO1(void);
static void dataIO2(void);
/*
* ======== main ========
*/
void main()
{
int *input1 = &inp1_buffer[0];
int *input2 = &inp2_buffer[0];
int *output1 = &out1_buffer[0];
int *output2 = &out2_buffer[0];
int *output3 = &out3_buffer[0];
int *output4 = &out4_buffer[0];
puts("volume example started\n");
/* loop forever */
while(TRUE)
{
/*
* Read input data using a probe-point connected to a host file.
* Write output data to a graph connected through a probe-point.
*/
dataIO1();
dataIO2();
/* apply gain */
processing4(input2,output1);
processing1(output1, output2);
processing2(output2, output3);
processing3(input1,output2,output4) ;
}
}
/*
* ======== processing ========
*
* FUNCTION: apply signal processing transform to input signal. *
* PARAMETERS: address of input and output buffers.
*
* RETURN V ALUE: TRUE.
*/
static int processing4(int *input2,int *output1)
{ int m=sk;
for(;m>=0;m--)
{
*output1++ = *input2++ * ain;
}
for(;(size-m)>0;m++)
{output1[m]=0;
}
////load(processingload);
return(TRUE);
}
static int processing1(int *output1,int *output2)
{
int m=sk-1;
for(;m>0;m--)
{
*output2++ = *output1++ * ain;
}
/* additional processing //load */
//load(processingload);
return(TRUE);
}
static int processing2(int *output2, int *output3)
{ int n=zhy;
size=BUFSIZE;
for(;(size-n)>0;n++)
{ *output3++ = output2[n];
}
/* for (;n>0;n--)
{ *output3++ = 0;
} */
//load(processingload);
return(TRUE);
}
static int processing3(int *input1,int *output2,int *output4) { int m=sk;
int y=zhy;
int z,x,w,i,f,g;
for(;(m-y)>0;)
{i=y;
x=0;
z=0;
f=y;
for(;i>=0;i--)
{g=input1[z]*output2[f];
x=x+g;
z++;
f--;
}
*output4++ = x;
y++;
}
m=sk;
y=sk-1;
w=m-zhy-1;
for(;m>0;m--)
{
y--;
i=y;
z=sk-1;
x=0;
f=sk-y;
for(;i>0;i--,z--,f++)
{g=input1[z]*output2[f];
x=x+g;
}
out4_buffer[w]=x;
w++;
}
//load(processingload);
return(TRUE);
}
/*
* ======== dataIO ========
*
* FUNCTION: read input signal and write processed output signal.
*
* PARAMETERS: none.
*
* RETURN V ALUE: none.
*/
static void dataIO1()
{
/* do data I/O */
return;
}
static void dataIO2()
{
/* do data I/O */
return;
}
课程设计步骤及过程
1.实验准备
(1)连接设备
①关闭计算机和实验箱电源。

②如使用PP型仿真器则用附带的并口连线连接计算机并口和仿真器相应接口。

③检查ICETEK-VC5416-A板上DIP开关MP/MC的位置,应设置在“OFF”位置(靠近
复位按钮),即设置DSP工作在MP方式。

④关闭实验箱上三个开关。

(2)开启设备
①打开计算机电源。

②打开实验箱电源开关,
③如使用USB型仿真器用附带的USB电缆连接计算机和仿真器相应接口,注意仿真器上
两个指示灯均亮。

(3)设置Code Composer Studio为Simulator方式:
参见“Code Composer Studio入门实验”之四.2。

(4)启动Code Composer Studio 2.0
2.打开工程,浏览程序,工程目录为C:\ICETEK-VC5416-EDULab\Lab20-Convolve3.编译并下载程序
4.设置输入数据文件
请在c程序中的如下两行上设置probe point:
dataIO1();1
dataIO2();
设置方法是把光标指示到这一行上,按鼠标右键,从显示的菜单上分别选择probe point。

在c程序的“dataIO1();”行上设置break point。

5.打开观察窗口
-选择菜单“View”、“Graph”、“Time/Frequency…”进行如下设置:-选择菜单“View”、“Graph”、“Time/Frequency…”进行如下设置:
-在弹出的三个图形窗口中单击鼠标右键,选择“Clear Display”。

6. 设置波形输入文件
-选择“File”菜单中的“File I/O…”,打开“File I/O”窗口;单击“Add File”按钮,在“FileInput”窗口中选择C:\ICETEK-VC5416-EDULab\Lab20-Convolve 目录下的sin.dat文件,单击“打开”按钮;在“Address”项中输入inp1_buffer,在“Length”项中输入32,在“Warp Around”项前加上选择标记,单击“Add Probe Point”按钮;
-在“Break/Probe/Profile Points”窗口中单击“Probe Point”列表中的“Convolve.c line52 NoConnection”,再单击“Connect”项尾部的展开按钮,在显示的展开式列表中选择列表末尾的“FILE IN:C:\..\SIN.DAT”,单击“Replace”按钮,单
击“确定”按钮。

-在“File I/O”窗口中单击“确定”,完成设置。

-选择“File”菜单中的“File I/O…”,打开“File I/O”窗口;单击“Add File”按钮,在“FileInput”窗口中选择C:\ICETEK-VC5416-EDULab\Lab20-Convolve 目录下的sin.dat文件,单击“打开”按钮;在“Address”项中输入inp2_buffer,在“Length”项中输入32,在“Warp Around”项前加上选择标记,单击“Add Probe Point”按钮;
-在“Break/Probe/Profile Points”窗口中单击“Probe Point”列表中的“Convolve.c line53 NoConnection”,再单击“Connect”项尾部的展开按钮,在显示的展开式列表中选择列表末尾的“FILE IN:C:\..\SIN.DAT”,单击“Replace”按钮,单击“确定”按钮。

-在“File I/O”窗口中单击“确定”,完成设置。

7.运行程序,观察结果
-按F5键运行程序,待程序停留在软件断点;观察刚才打开的三个图形窗口,其中显示的是输入和输出的时域波形;
-观察频域波形:在各图形窗口中单击鼠标右键,选择“Properties…”,在“Graph Property
Dialog”中的第1项“Display Type”项中选择“FFT Magnitude”,单击“OK”完成;这时图形窗口中显示波形的频域图。

(也可再打开显示频域图的窗口)-验算结果:在各频域窗口中的波形上单击鼠标左键,将光标停到统一的位置(通过观察窗口状态栏中的第1个浮点数表示其坐标值),读取状态栏中的第2个浮点数,为卷积计算的输入和输出结果,请验算:Output≈Input1*Input2。

8.将输入波形文件改成其他波形:选择“File”、“File I/O…”,将2个文件删除,将第1个文件换成SIN11.DAT,讲第2个文件换成SIN22.DAT;输入“Length”改为64,其他不变。

再按F5运行,停止后观察波形。

9.将第2个输入波形改成SIN33.DAT,观察卷积运算后的波形。

10.将第2个输入波形改成SIN44.DAT,观察卷积运算后的波形。

.
其波形如图
AT,观察卷积运算后的波形。

*图表分析
输入图形频域图形采用通过频域采样取值比较,卷积后的结果与标准值只有很的误。

所以说卷积实验结果正确,卷积程序正确无误。

总结:在本次DSP课程设计中我们以四人一组,在课前我们由组长分工,每人分别做着不同的工作,确保了我们本次课程设计的成功。

在本次设计中,我们从查阅资料,到编写程序再到软件仿真,在这个过程中我们充分的利用了所学的知识,并在老师的指导下,按时按质完成了本次课程设计。

通过本次课程设计我们充分的锻炼了自己的动手能力,并把课堂上所学的知识运用到了实际中,达到了我们预期的效果,也为我们以后工作打下了一个好的前提。

参考文献:
郭开轩.2007 数字信号处理器(DSP)及其芯片结构特点
胡建凌徐盛2003 数字信号处理的应用和设计上海上海交通大学出版社王念旭2001 DSP基础与应用系统设计北京北京航空航天大学出版社
张雄伟陈亮徐光辉2003 DSP芯片的原理及开发应用电子出版社
周霖2004 信号处理技术应用北京国防工业出版社。

相关文档
最新文档