您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页DSP的数字图像处理技术实现

DSP的数字图像处理技术实现

来源:华佗小知识
DSP技术课程设计报告

《现代信号处理课程设计》

课程设计报告

设计题目 DSP的数字图像处理技术实现

1

DSP技术课程设计报告

目 录

第一章 绪论-----------------------------------------------3

1.1.1 课程设计目的及任务------------------------3 1.1.2 阈值分割的实现方法------------------------4

第二章 视频采集与显示相关概念-----------------------------5

2.1 帧和场-------------------------------------------5 2.2 YCbCr及其采样格式--------------------------------5 第三章 DSP平台及软件开发---------------------------------7

3.1 DSP平台-----------------------------------------7

3.1.1 DSP发展简介-------------------------------7 3.1.2 TMS320F2812 DSP芯片简介-------------------8 3.2 F2812 DSP软件开发-------------------------------9

3.2.1 F2812 软件开发平台CCS---------------------9 3.2.2 F2812 DSP软件开发流程---------------------10

第四章 阈值分割在MATLAB上的实现--------------------------12 第五章 阈值分割在DSP上的实现----------------------------13

5.1 系统流程与实现方案------------------------------13

5.1.2 初始化模块--------------------------------14 5.1.3 图像阈值处理及输出模块--------------------16 5.2 工程中的主要库和文件(详见附录)-----------------18

5.2.1 工程中的库(.lib)--------------------------18 5.2.2 工程中的主要文件--------------------------18 5.3 程序运行及结果验证------------------------------19 附录:各源程序代码及其详细分析----------------------------20 总 结----------------------------------------------------32

2

DSP技术课程设计报告

第一章 绪论

1.1.1 课程设计目的及任务

本课程设计教学所要达到的目的是:

1) 掌握如何使用DSP仿真平台; 2) 掌握DSP内部结构和工作原理; 3) 熟悉DSP的指令系统;

4) 熟悉用DSP实现各种基本算法。

通过对课程设计任务的完成,使学生理解课堂教学的理论内容,并且能够掌握和熟悉DSP的开发流程和基本的编程方法,熟悉DSP2812系列芯片,并利用CCS的开发环境进行程序设计,完成相应功能。同时,由于设计中涉及到各种器件的使用,可以起到综合运用各种技术和知识的作用。此外学生的实验技能、动手能力、分析问题、解决问题的能力都将得到培养,为进一步进行工程实践奠定良好的基础。

图像分割是一种重要的图像技术,在理论研究和实际应用中都得到了人们的广泛重视。图像分割的方法和种类有很多,有些分割运算可直接应用于任何图像,而另一些只能适用于特殊类别的图像。有些算法需要先对图像进行粗分割,因为他们需要从图像中提取出来的信息。例如,可以对图像的灰度级设置门限的方法分割。值得提出的是,没有唯一的标准的分割方法。许多不同种类的图像或景物都可作为待分割的图像数据,不同类型的图像,已经有相对应的分割方法对其分割,同时,某些分割方法也只是适合于某些特殊类型的图像分割。分割结果的好坏需要根据具体的场合

3

DSP技术课程设计报告

及要求衡量。图像分割是从图像处理到图像分析的关键步骤,可以说,图像分割结果的好坏直接影响对图像的理解。而阈值分割是其中常用的一种。

1.1.2 阈值分割的实现方法

阈值分割法分为全局阈值法和局部阈值分割法。局部阈值分割法是将原始图像划分成较小的图像,并对每个子图像选取相应的阈值。全局阈值分割方法在图像处理中应用比较多,它在整幅图像内采用固定的阈值分割图像。经典的阈值选取以灰度直方图为处理对象。根据阈值选择方法的不同,可以分为模态方法、迭代式阈值选择等方法。这些方法都是以图像的直方图为研究对象来确定分割的阈值的。另外还有类间方差阈值分割法、二维最大熵分割法、模糊阈值分割法、共生矩阵分割法、区域生长法等等。

本实验以采用全局阈值分割,将一幅灰度图像转换成黑白二值图像。操作过程是先由用户规定一个阈值,如果图像中像素的灰度值小于该阈值,则将该像素的灰度值设置为0,否则将灰度值设置为255。灰度的阈值变换的变换函数表达式如下:

(xT)0f(x)255(xT),其中

T为规定的阈值。

4

DSP技术课程设计报告

第二章 视频采集与显示相关概念5

2.1 帧和场

一个视频信号可以通过对一系列帧(渐进采样)或一个序列的隔行扫描的场(隔行扫描采样)来进行采样。在一个隔行扫描采样的视频序列里,一帧的一半的数据是在每个时间采样间隔进行采样的。一个场由奇数个或偶数个扫描线组成,而一个隔行扫描的视频序列包括一系列的视频帧。这种采样方式的优点在于与有相同帧数的同样码率的渐进序列相比,可以在一秒中传输两倍多的场,这样就可以形成更加平滑的运动。比如,一个PAL视频序列由50场/秒的码率组成,在回放过程中,运动可以比与之相同的25帧每秒的用渐进视频序列形成的运动显得更加的平滑。

2.2 YCbCr及其采样格式

YCbCr 人类视觉系统(HVS)相比亮度来说对于颜色就不是那么敏感。在RGB颜色空间中,三种颜色被平等的看待,并用相同的分辨率存放起来。但是通过把亮度与颜色信息分离,并对亮度值取更高的分辨率可以更有效地表示一个颜色图像。YCbCr颜色空间和它的变换(通常写为YUV)就是一种流行而高效的表示一个颜色图像的方法。Y是亮度值信号,Cb、Cr是色差信号。在YCbCr空间中,只有Y和Cb、Cr值被传输和存储,而且 Cb和Cr的分辨率可以比Y低,因为人类视觉系统对于亮度更加敏感。这就减少了表示图像的数据量。通常的观察情况下,RGB和 YCbCr表示的图像看上去没有什么不同。对于色度采用比亮度低的分辨率进行采样是一种简单而有效的压缩办法。

4:4:4采样就是三种元素Y、Cb、Cr有同样的分辨率,这样的话,

5

DSP技术课程设计报告

在每一个像素点上都对这三种元素进行采样。数字4是指在水平方向上对于各种元素的采样率,比如说,每四个亮度采样点就有四个Cb和Cr采样值。4:4:4采样完整地保留了所有的信息值。

4:2:2采样中 (记为YUY2),色度元素在纵向与亮度值有同样的分辨率,而在横向则是亮度分辨率的一半(4:2:2表示每四个亮度值就有两个Cb 和Cr采样)。4:2:2视频用来构造高品质的视频彩色信号。

4:2:0采样中(记为YV12),Cb和Cr在水平和垂直方向上均为Y分辨率的一半。因为每个色差分量中包含了1/4的Y分量, 4:2:0的YCbCr视频采样刚好4:4:4的一半。4:2:0采样有时被描述是一个“每像素12位”的方法,原因可以从对四个像素的采样中看出。使用4:4:4采样,一共要进行12次采样,对每一个Y、Cb和Cr,需要12×8=96位,平均下来要96/4=24位。使用4:2:0需要6×8=48位,平均每个像素48/4=12位。 在一个4:2:0隔行扫描视频序列中,一个完整的视频帧的YCbCr采样分配到两个场中。可以得到,隔行扫描的总采样数跟渐进式扫描的采样数是相同的。图2-1为YCbCr3种采样格式的比较。

图2-1 YCbCr3种采样格式的比较

6

DSP技术课程设计报告

第三章 DSP平台及软件开发

3.1 DSP平台

3.1.1 DSP发展简介

DSP发展历程大致分为70年代的理论先行、80年代的产品普及、90年代的突飞猛进三个阶段。

DSP出现之前数字信号处理只能依靠微处理器来完成。由于MPU较低的处理速度无法满足信息量的高速实时要求,因此高效的信号处理成了日渐迫切的社会需求。70年代有人提出DSP的理论和算法基础,但那时的DSP仅仅停留在教科书上,即使是研制出来的DSP系统也是由分立元件组成,其应用领域仅局限于军事、航空航天部门。

随着大规模集成电路技术的发展,1982年世界上诞生了首枚DSP芯片。这种DSP器件采用微米工艺NMOS制作,虽功耗和尺寸稍大,运算速度却比MPU快几十倍,尤其在语音合成和编解码器中得到广泛应用。DSP芯片的问世是个里程碑,它标志着DSP应用系统由大型向小型化迈进一大步。80年代中期,随着CMOS技术的进步与发展,第二代基于CMOS工艺的DSP芯片应运而生,其存储容量和运算速度都成倍提高,成为语音处理、图像硬件处理技术的基础。80年代后期,第三代DSP芯片问世,运算速度进一步提高,应用于范围逐步扩大到通信、计算机领域。

90年代DSP发展最快,相继出现和第五代DSP器件。现在的DSP属于第五代产品,将DSP内核及外围元件集成在单一芯片上。这种集成度极高的DSP芯片不仅在通信、计算机领域大显身手,而且逐渐渗透到人们日常消费领域。经过20多年的发展,DSP产品的应用已扩大到人们日常生活的各个方面,并成为电子产品更新换代的决定因素。

7

DSP技术课程设计报告

3.1.2 TMS320F2812 DSP芯片简介

TMS320F2812是美国德州仪器公司(TI)推出的一款面向数字多媒体应用的DSP,它集成完备的视频/音频输入/输出接口、以太网接口、PCI-66总线等片上外设,不仅使用户方便地对音/视频等复杂运算高速处理,还能方便、无缝地接口视/音频编码器件和以太网/PCI总线等数据传输接口,非常适于VoIP、多通道数字视频录像机(DVR)、多通道数字视频监控等应用。其功能框图如图3-1所示:

图3-1 TMS320F2812功能框图

8

DSP技术课程设计报告

3.2 F2812 DSP软件开发

3.2.1 F2812 软件开发平台CCS

Code Composer Sudio(CCS)是TI公司推出的一个集成性DSPs软件开发平台。CCS内部集成了以下软件工具:

 代码产生工具(包括F2812编译器、汇编优化器、汇编器和连接器)  软件模拟器(Simulator)  实时基础软件DSP/BIOS

 主机与目标系统之间的实时数据交换软件RTDX  实时分析和数据可视化软件

图3-3是CCS开发环境的构成及与主机和目标系统的接口。

图3-3 CCS的构成和接口

9

DSP技术课程设计报告

在CCS下,开发者可以对软件进行编辑、编译、调试、代码性能测试和项目管理等所有工作。

3.2.2 F2812 DSP软件开发流程

图3-4是一个典型的F2812软件开发流程图。

图3-4 软件开发流程

F2812软件开发流程中用到的主要工具如下:  C编译器

C编译器对符合ANSI标准的C代码进行编译,生成汇编代码。

10

DSP技术课程设计报告

 汇编优化器

汇编优化器接受用户编写的线性汇编代码作为输入,产生一个标准汇编代码的中间文件,作为汇编器的输入。  汇编器

汇编器输出可重新分配地址的机器语言目标文件(COFF文件)。它所输入的汇编语言文件可以是C编译器产生的汇编文件、汇编优化器输出的汇编文件、或是由文档管理器管理的宏库内的宏。  连接器

连接器的作用是接受可重新分配地址的目标文件作为输入,生成可执行的目标文件。连接器根据用户说明的程序和数据存放地址,把汇编器产生的浮动地址代码和数据映射到实际地址空间。  运行支持库

C6000运行支持库包括C编译器所支持的ANSI标准运行支持函数、编译器公用程序函数、浮点运算函数和C编译器支持的I/O函数。

11

DSP技术课程设计报告

第四章 阈值分割在MATLAB上的实现

根据公式,编写一个简单的灰度处理的Matlab程序。程序如下。 I=imread('lena.bmp');%读取原图像 figure(1);

imshow(I);title('原始图像'); %显示原图像 [ROW,COL]=size(I); T=125; %设置阈值 I = double(I); for i = 1: ROW for j = 1: COL if (I(i,j)>T) I(i,j)=255; else

I(i,j)=0; end end end

figure(2);imshow(I); %显示经阈值分割的图像 title('经阈值分割的图像');

在Matlab中运行该程序,生成图像如下图所示。

12

DSP技术课程设计报告

原始图像(a)原始图像

经阈值分割的图像

(b)经阈值分割的图像

13

DSP技术课程设计报告

第五章 阈值分割在DSP上的实现

5.1 系统流程与实现方案

整个系统采用模块化设计,用C语言编程实现。系统工作流程如图5-1所示。

开始CSL初始化将Video Port0设为编码器输出CHIP模块初始化将Video Port1设为采集输入EMIFA模块初始化启动图像数据采集中断向量表初始化启动图像显示模块I2C接口初始化是否采集区数据已经采集好,同时显示缓冲区的数据已空?否是TVP5150PBS视频解码器初始化将图像数据从临时图像缓冲区传送到显示缓冲区SAA7121H视频编码器初始化结束

图5-1 系统工作流程图

下面结合程序介绍主要功能模块。

14

DSP技术课程设计报告

5.1.2 初始化模块

 初始化CSL芯片支持库

CSL_init();  初始化EMIFA

EMIFA_config(&Seeddm2ConfigA);  设置中断

IRQ_setVecs(vectors);指向asm中定义的中断向量表

IRQ_map(IRQ_EVT_VINT1,11);映射采集事件到物理中断号INT11 IRQ_reset(IRQ_EVT_VINT1);采集事件中断使能 IRQ_nmiEnable();不可屏蔽中断使能 IRQ_globalEnable();全局中断使能  打开一个数据拷贝的数据通路

DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);  初始化 IIC

hSeeddm2i2c = I2C_open(I2C_PORT0,I2C_OPEN_RESET); I2C_config(hSeeddm2i2c,&SEEDDM2IIC_Config);  初始化TVP5150

GPIO_RSET(GPGC,0x0);将GPIO0不作为GPINT使用 GPIO_RSET(GPDIR,0x1);将GPIO0作为输出

GPIO_RSET(GPVAL,0x0);GPIO0输出为高,选择IIC1总线,配置TVP5150第二通路U21

_IIC_read(hSeeddm2i2c,addrI2C,0x8c,&vFromat);回读采集设备的格式

vFromat = vFromat & 0xff; Switch (vFromat)

15

DSP技术课程设计报告

{

case TVP51XX_NTSCM: case TVP51XX_NTSC443:

NTSCorPAL = 1;设备为NTSC格式 break;

case TVP51XX_PALBGHIN: case TVP51XX_PALM:

NTSCorPAL = 0;设备为PAL格式 break;

Default: }

 初始化Video Port1

portNumber = 1;

vpHchannel1 = bt656_8bit_ncfc(portNumber);将VP1A设为采集输入

NTSCorPAL = 2;系统为不支持的模式 break;

5.1.3 图像阈值处理及输出模块

/*启动显示模块*/

bt656_display_start(vpHchannel0); /*建立显示的实时循环*/ for(;;) {

/*当采集区的数据已经采集好,而显示缓冲区的数据已空*/ if((capNewFrame == 1)&&(disNewFrame == 1))

16

DSP技术课程设计报告

{

/*将数据装入显示缓冲区,并清采集完成的标志*/ capNewFrame =0; disNewFrame =0;

threshold();//阈值处理

}

}

}

for(i=0;iDAT_copy((void *)(capYbuffer + i * numPixels),

(void *)(disYbuffer + i * numPixels), numPixels); /*传送Cb缓冲区*/

DAT_copy((void *)(capCbbuffer + i * (numPixels >> 1)), (void *)(disCbbuffer + i * (numPixels >> 1)), numPixels>>1);

/*传送Cr缓冲区*/

DAT_copy((void *)(capCrbuffer + i * (numPixels >> 1)), (void *)(disCrbuffer + i * (numPixels >> 1)), numPixels>>1); }

17

DSP技术课程设计报告

5.2 工程中的主要库和文件(详见附录)

5.2.1 工程中的库(.lib)

 CSL芯片支持库(Chip Support Library)

CSL中包含很多TI公司封装好的API和宏。设计CSL的目的是为了提供标准的方法访问和控制特定处理器类型对应的片上外设,免除用户编写配置和访问片上外设所必需的定义和代码。。  C语言运行支持库(Run-time Support Library)

一些C/C++程序完成的任务(例如I/O、动态存储器分配、字符串操作和三角函数)并不是C/C++语言本身的一部分,然而ISO C标准定义了一组运行时支持库函数来完成这些任务。利用ISO标准库可以保证代码的兼容性,便于程序移植。TMS320F2812提供的运行支持库还包括了与处理器类型相关的命令和实现I/O请求的C语言程序。

在程序中调用以上两种类型的库函数,首先要添加这些库。方法是:在工程名处点右键,选择“Add File to Project”,然后添加三种库的路径。

5.2.2 工程中的主要文件

 .c文件

每一个.c文件都是特定函数的具体实现,而main()函数便是程序的入口地址。main()通常包含大量的函数调用,这样就可以把一个大的文件截成多个小文件以便阅读和管理。

本设计中,main()函数出现在dm2main.c文件里。在main()中调用的函数就是如4.1节所述主程序流程中的函数。而这些函数的具体定义是在相关文件中。比如_tvp51xx.c文件定义了配置TVP5150解码芯片的函数,vportcap.c文件定义了用EDMA方式采集图像的设置、中断以及数据传

18

DSP技术课程设计报告

输的函数,iic.c文件定义了IIC的设置结构和通过IIC总线进行读/写操作的函数。  .h文件

.h文件不是函数的具体实现和调用,而是函数的声明和一些数据类型的定义。.h文件还有一个作用是当开发者需要调用某个库时,告知库包含的函数和调用格式,而实际上真正的目标代码已经存在于库文件中了。

本设计中,包含着几种基于特定应用的.h文件:_tvp51xx.h定义了配置TVP5150相关的数据结构,vportcap.h是EDMA方式采集图像相关的函数声明,此外还有一些CSL头文件,包含了调用cslDM2.lib库时跟CSL的API函数有关的函数及其调用格式(详细见附录)。  .cmd文件

.cmd文件使开发者可以通过自己定义的存储器模块来配置系统存储器。它包含了两个功能强大的伪指令MEMORY和SECTIONS。MEMORY定义一个目标系统的存储器映像图,开发者可以给存储器各部分命名,指定它们的起始地址和长度。SECTIONS告诉连接器怎样把输入段组合成输出段,以及把输出段放在存储器的什么位置(见附录)。  .asm文件

.asm文件是汇编文件,它的执行效率较高,但代码相对复杂,因而编程时不常采用。本设计中只有一个汇编文件ves_dm2.asm,用来配置中断向量表中的中断向量。

5.3 程序运行及结果验证

在CCS下,点击Project->Rebuild All进行编译。编译成功后,点击File->Load Program>debug>mpeg4encode.out,下载程序至目标板。然后点击Debug>Run运行程序。在液晶屏上查看显示效果,和预想的一样。

19

DSP技术课程设计报告

附录:各源程序代码及其详细分析

主程序f2812main.c代码及其分析

/********************************************************************/ /* f2812main.c */

/********************************************************************/ /* 包含头文件*/

#include //函数申明,调用CSL库必须包含相应的头文件。 #include #include #include #include #include #include

#include \"iic.h\" //读IIC与写IIC程序的申明文件,函数体在iic.c中。 #include \"vportcap.h\" //通过EDMA视频捕捉程序的申明文件,函数体在vportcap.c中。

#include \"vportdis.h\" //通过EDMA视频显示程序的申明文件,函数体在vportdis.c中。

#include \"sa7121h.h\" //定义SAA7112H寄存器 #include \"TVP51xx.h\" //定义TVP5150A寄存器

#include \"seeddm2.h\" //定义seeddm2板上CPLD和其它片上外设的地址 /*SEEDDM2的emifa的设置结构*/ EMIFA_Config Seeddm2ConfigA ={

0x00052078, /*gblctl寄存器:EMIFA(B)全局控制寄存器值 */

/*将CLK6、4、1使能;将MRMODE置1;使能

20

DSP技术课程设计报告

EK2EN,EK2RATE*/

0xffffffd3, /*cectl0寄存器:CE0空间控制寄存器值,将CE0空间设为

SDRAM*/

0x73a28e01, /*cectl1寄存器:CE1空间控制寄存器值。读保持1个时钟,

MTYPE=0000,选择8位的异步接口;读选通01110,即14个时钟宽度。

TA:2个时钟;读建立2个时钟,写保持2个时钟,写选通14个时钟,写建立7个时钟*/

0x22a28a22, /*cectl2寄存器:CE2空间控制寄存器值*/

0x22a28a42, /*cectl3寄存器:CE3空间控制寄存器值*/ };

/*SEEDDM2的IIC设置结构*/ I2C_Config SEEDDM2IIC_Config = { 0, /*i2coar寄存器,采用主模式 */

0, /* i2cimr寄存器,采用无中断方式只写、不读 */ (20-5), /* i2cclkl寄存器,scl low time */ (20-5), /* i2cclkh寄存器,scl high time */ 1, /* i2ccnt寄存器,configure later*/ 0, /* i2csar寄存器,configure later*/

21

0x57115000, /*sdctl寄存器:SDRAM 控制寄存器值*/ 0x0000081b, /*sdtim寄存器:SDRAM 时序寄存器值*/ 0x001faf4d, /*sdext寄存器:SDRAM 扩展寄存器值*/ 0x00000002, /*cesec0寄存器:CE0空间次控制寄存器值*/ 0x00000002, /*cesec1寄存器:CE1空间次控制寄存器值*/ 0x00000002, /*cesec2寄存器:CE2空间次控制寄存器值*/ 0x00000073 /*cesec3寄存器:CE3空间次控制寄存器值*/

DSP技术课程设计报告

0x4ea0, /* i2cmdr寄存器,主机发送模式,i2c runs free,8-bit data + NACK,不重复模式 */

(75-1), /* i2cpsc寄存器,4MHz时钟 */ };

I2C_Handle hSeeddm2i2c; int portNumber;

extern SA7121H_ConfParams sa7121hPAL[45]; extern SA7121H_ConfParams sa7121hNTSC[45]; Uint8 vFromat = 0; Uint8 misc_ctrl = 0x6D; Uint8 output_format = 0x47;

/*地址为0 for cvbs port1,选择复合信号做为输入*/ Uint8 input_sel = 0x00;

/*地址为0xf,将Pin27设置成为CAPEN功能*/ Uint8 pin_cfg = 0x02; /*地址为1B*/

Uint8 chro_ctrl_2 = 0x14; /*图像句柄的声明*/ VP_Handle vpHchannel0; VP_Handle vpHchannel1; VP_Handle vpHchannel2; /*确定图像的参数*/

int numPixels = 720; //每行720个像素 int numLines = 576; //每帧576行(PAL)

/*采集与显示缓冲区的首址,可参见seeddm2video.cmd*/

22

DSP技术课程设计报告

Uint32 capYbuffer=0x80000000; /*采集到的Y分量数据存放在存储器中的起始地址*/ Uint32 capCbbuffer=0x800675c0; /*采集到的Cb分量数据存放在存储器中的起始地址*/ Uint32 capCrbuffer = 0x8009b0a0; /*采集到的Cr量数据存放在存储器中的起始地址*/ Uint32 disYbuffer = 0x80100000; /*Y分量显示数据存放在存储器中的起始地址*/ Uint32 disCbbuffer = 0x801675c0; /*Cb分量显示数据存放在存储器中的起始地址*/ Uint32 disCrbuffer = 0x8019b0a0; /*Cr分量显示数据存放在存储器中的起始地址*/ /*图像格式标志*/ Uint8 NTSCorPAL = 0; extern far void vectors();

extern volatile Uint32 capNewFrame; extern volatile Uint32 disNewFrame;

void threshold();

/*---------------------------------------------------------*/ /* main() */ /*---------------------------------------------------------*/ /*此程序可将四个采集口的数据经过Video Port0送出*/ void main() {

Uint8 addrI2C; int i;

/*-------------------------------------------------------*/ /* 执行所有的初始化 */ /*-------------------------------------------------------*/

/* 初始化CSL库 */

23

DSP技术课程设计报告

CSL_init(); //CSL模块是顶层API模块,使用CSL API前必须调用此函数 CHIP_config(&SEEDDM2percfg); //向配置地址中写设备配置值

/*----------------------------------------------------------*/

/*EMIFA的初始化,将CE0设为SDRAM空间,CE1设为异步空间 注意DM2支持EMIFA,不支持EMIF*/ EMIFA_config(&Seeddm2ConfigA);

/*----------------------------------------------------------*/

/*中断向量表的初始化*/

IRQ_setVecs(vectors); IRQ_nmiEnable(); IRQ_globalEnable();

IRQ_map(IRQ_EVT_VINT1, 11); /*将VP1通道中断对应为CPU中断11*/ IRQ_map(IRQ_EVT_VINT0, 12); /*将VP0通道中断对应为CPU中断12*/ IRQ_reset(IRQ_EVT_VINT1); IRQ_reset(IRQ_EVT_VINT1);

/*打开一个数据拷贝的数据通路,Uint32 DAT_open(int chaNum,int priority,Uint32 flags);*/ DAT_open(DAT_CHAANY,DAT_PRI_LOW,DAT_OPEN_2D); /*----------------------------------------------------------*/

/*进行IIC的初始化*/

hSeeddm2i2c = I2C_open(I2C_PORT0,I2C_OPEN_RESET); I2C_config(hSeeddm2i2c,&SEEDDM2IIC_Config);

/*----------------------------------------------------------*/

/*进行解码器TVP5150pbs的初始化*/ SEEDDM2_rset(0x15, 2); /*选择TVP5150,设置第三通路*/

24

DSP技术课程设计报告

GPIO_RSET(GPGC,0x0); /*将GPIO0不作为GPINT使用*/ GPIO_RSET(GPDIR,0x1); /*将GPIO0作为输出*/

GPIO_RSET(GPVAL,0x0); /*GPIO0输出为高,选择IIC1总线,配置第二路,即为U21*/ addrI2C = 0xBA >>1; /*TVP5150A IIC写地址(I2CSEL=1)*/

/*I2C地址分为10位模式或7位模式,DSP支持7位I2C模式,则要按7位模式使用,取后8位地址右移1位即是7位的I2C地址。TVP5150写地址为0xBA或0xB8,读地址为0xBB或0xB9,因此与TVP5150进行通信,须将I2C的地址向右移一位。*/

_IIC_write(hSeeddm2i2c, addrI2C,0x00, input_sel); /*四个参数依次为I2C Handle(I2C_open函数返回值)、从器件地址、寄存器地址和需要配置的寄存器值 */

_IIC_write(hSeeddm2i2c, addrI2C,0x03, misc_ctrl); _IIC_write(hSeeddm2i2c, addrI2C,0x0D, output_format); _IIC_write(hSeeddm2i2c, addrI2C,0x0F, pin_cfg); _IIC_write(hSeeddm2i2c, addrI2C,0x1B, chro_ctrl_2); /*回读当前摄像设备的格式*/

_IIC_read(hSeeddm2i2c, addrI2C,0x8c, &vFromat); vFromat = vFromat & 0xff;

switch (vFromat) {

case TVP51XX_NTSCM: case TVP51XX_NTSC443:

NTSCorPAL = 1; /*系统为NTSC的模式*/ break;

case TVP51XX_PALBGHIN: case TVP51XX_PALM:

NTSCorPAL = 0; /*系统为PAL的模式*/

25

DSP技术课程设计报告

}

if(NTSCorPAL ==2) {

/*系统不支持的模式,重新配置*/ for(;;) {}

break;

default:

NTSCorPAL = 2; /*系统为不支持的模式*/ break;

}

/*----------------------------------------------------------*/

/*进行SAA7121H的初始化*/

GPIO_RSET(GPVAL,0x0);/*GPIO0输出为低,选择IIC1总线,配置图像输出*/

addrI2C = 0xB8 >>1; /*选择第0路的I2C的地址,TVP5150A IIC写地址(I2CSEL=0)*/

/*将第0路的视频输入口的数据口设为高阻状态,使能SCLK,将第27脚设为输入*/ _IIC_write(hSeeddm2i2c, addrI2C,0x03, 0x1); /*配置SAA7121H*/

GPIO_RSET(GPVAL,0x1);/*GPIO0输出为低,选择IIC1总线,配置图像输出*/ /*初始化Video Port0*/

/*将Video Port1设为视频编码器SAA7121H的输出*/ portNumber = 0;

vpHchannel0 = bt656_8bit_ncfd(portNumber);

addrI2C = 0x88 >>1; //SAA7121 IIC地址(因SAA7121的21管脚SA接低电平)

for(i =0; i<43; i++)

26

DSP技术课程设计报告

{ }

/*----------------------------------------------------------*/ /*初始化Video Port1*/

/*将Video Port1设为采集输入*/ portNumber = 1;

vpHchannel1 = bt656_8bit_ncfc(portNumber); //打开一个VP口,进行采集 bt656_capture_start(vpHchannel1); /*等待第一帧数据采集完成*/ while(capNewFrame == 0){}

/*将数据存入显示缓冲区,并清采集完成的标志*/

27

if(NTSCorPAL == 1) { } else { }

_IIC_write(hSeeddm2i2c,

addrI2C,

(sa7121hPAL[i].regsubaddr), (sa7121hPAL[i].regvule));

//写SAA7121寄存器值

_IIC_write(hSeeddm2i2c,

addrI2C,

(sa7121hNTSC[i].regsubaddr), (sa7121hNTSC[i].regvule));

DSP技术课程设计报告

capNewFrame =0; for(i=0;i/*传送Y缓冲区*/

///DAT_copy(void *src,void *dst,Uint16 byteCnt);

DAT_copy((void *)(capYbuffer + i * numPixels),

(void *)(disYbuffer + i * numPixels), numPixels); /*传送Cb缓冲区*/

DAT_copy((void *)(capCbbuffer + i * (numPixels >> 1)),/*YCrCb=4:2:2,因此将

numPixels减少一半,即右移一位*/

(void *)(disCbbuffer + i * (numPixels >> 1)), numPixels>>1);

/*传送Cr缓冲区*/

DAT_copy((void *)(capCrbuffer + i * (numPixels >> 1)), (void *)(disCrbuffer + i * (numPixels >> 1)), numPixels>>1); }

/*启动显示模块*/

bt656_display_start(vpHchannel0); /*建立显示的实时循环*/ for(;;) {

/*当采集区的数据已经采集好,而显示缓冲区的数据已空*/ if((capNewFrame == 1)&&(disNewFrame == 1))

28

DSP技术课程设计报告

{

/*将数据装入显示缓冲区,并清采集完成的标志*/

capNewFrame =0;

disNewFrame =0;

threshold();//阈值处理

}

}

for(i=0;i/*传送Y缓冲区*/

DAT_copy((void *)(capYbuffer + i * numPixels),

(void *)(disYbuffer + i * numPixels), numPixels); /*传送Cb缓冲区*/

DAT_copy((void *)(capCbbuffer + i * (numPixels >> 1)), (void *)(disCbbuffer + i * (numPixels >> 1)), numPixels>>1);

/*传送Cr缓冲区*/

DAT_copy((void *)(capCrbuffer + i * (numPixels >> 1)), (void *)(disCrbuffer + i * (numPixels >> 1)), numPixels>>1); }

}

/*图像的阈值分割子程序*/

29

DSP技术课程设计报告

void threshold() {

int i,j; //奇数行

for(i=intALines;ifor(j=intAPixels;j*(Uint8 *)(tempYbuffer + i*numPixels + j) = *(Uint8

*)(tempYbuffer + i*numPixels + j)} } //偶数行

for(i=numLines/2+intALines;i{

for(j=intAPixels;j*(Uint8 *)(tempYbuffer + i*numPixels + j) = *(Uint8

*)(tempYbuffer + i*numPixels + j)}

}

//f2812main.c结束

/************************************************************************************/

30

DSP技术课程设计报告

总 结

通过这次的课程设计,首先是自己对于DSP的F2812有了一定的了解,通过两个礼拜的实验,逐渐熟悉着F2812的强大功能。数字信号处理这门课也是非常深奥的一门课,结合DSP的功能进行一些信号的处理。

在信号处理这一块,自己还没有很熟练地进行各种算法的实现,所以自己得一步步地进行学习,因为这是一门很重要很实用的学科,听熊老师讲的一些应用,觉得很有意义,自己要慢慢熟悉数字信号处理中的那些算法。

31

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务