数字图像处理实验实验三.docx
《数字图像处理实验实验三.docx》由会员分享,可在线阅读,更多相关《数字图像处理实验实验三.docx(15页珍藏版)》请在冰点文库上搜索。
![数字图像处理实验实验三.docx](https://file1.bingdoc.com/fileroot1/2023-5/18/492a29c9-baa4-48ba-8431-a2d2e5bda788/492a29c9-baa4-48ba-8431-a2d2e5bda7881.gif)
数字图像处理实验实验三
报告内容:
(目的和要求、原理、步骤、数据、计算、小结等)
实验三静态图像的DCT变换
一、实验目的
1、了解DCT和IDCT的概念。
2、了解DSP的EDMA技术
3、了解DSP的中断技术。
4、了解SDRM在静态数据采集中的作用。
5、了解DSK板上用户自定义开关的使用。
6、了解DSP和FPGA在视频数据采集中的同步原理。
二、实验设备
计算机、6711DSK、视频板、CCS软件、Webpack软件
三、实验原理
本实验有视频采集卡上的FPGA和DSK共同完成对摄入图像进行DCT变换。
DCT、IDCT广泛应用于各种视频压缩标准中,它充分利用了图像数据的空间相关性来实现数据压缩。
DCT、IDCT变换本身是无损的,只是由于有限精度的原因才回有精度上的损失。
采集下来的图像首先放到SDRAM中
DSP处理流程为:
首先进行图像采集,并由FPGA控制存入到SDRAM中。
当用户按下按钮SW2的USER_SW1位按钮后,开始进行图像的模糊处理。
变换完成后用EDMA将处理的结果送给视频板的SDRAM,并由FPGA控制视频信号数据从SDRAM同步送给AL250,完成显示功能。
四、实验步骤
1、有关DCT变换的基础知识
2、连接好摄相头、视频卡、FPGA下载电缆、6711DSK并口仿真电缆,上电。
3、下载FPGA程序。
选择下载文件“exp\exp5”目录下的“scapture.bit”
4、下载完成后,连接DSK的并口电缆和计算机的并口,双击“C6711DSKCCS”图标。
进入CCS软件开发环境。
打开“exp\exp5”的“Video.out”文件,并运行。
5、程序运行后按下视频板的复位按钮S2完成图像的静态采集。
6、图像采集好后,按下DSK板上的SW2的USER_SW1位按钮,DSP开始进行边缘提取,完成后,自动显示处理的结果。
此时显示器的图像将会出现进行过DCT和反IDCT后的图像,尽管在显示屏上没有明显的变换,但是DCT反IDCT后的图像依然具有一定的图像丢失。
7、如果要继续采集和处理新的图像,拨回DSK板上的SW2的USER_SW1位按钮重复步骤5和6。
8、完成这个实验的实验报告。
五、源程序清单
#defineEMIF_CE10x01800004
#defineGet_Switches((*(int*)0x90080000>>24)&0x07)
#defineLED1_on*(int*)0x90080000=0x0E000000
#defineLED2_on*(int*)0x90080000=0x0D000000
#defineLED3_on*(int*)0x90080000=0x0B000000
#defineLEDs_off*(int*)0x90080000=0x07000000
externcregistervolatileunsignedintCSR;
externcregistervolatileunsignedintIER;
intDct(unsignedchar*block,short*coeff);
intIdct(short*coeff,unsignedchar*block);
int*OPT_6,
*SRC_6,
*count_6,
*DST_6,
*index_6,
*link_6,
*OPT_reload_6,
*SRC_reload_6,
*count_reload_6,
*DST_reload_6,
*index_reload_6,
*link_reload_6,
*EER,
*ESR,
*ECR;
int*CIER=(int*)0x01A0FFE8;
int*CIPR=(int*)0x01A0FFE4;
shortcapture_flag=0;
shortline=0;
shortdata_ready=0;
shortprocess_finish=0;
#include
voidmain()
{inta;
unsignedchardata[64];
shortdata_dct[64];
shortdata_dct_1[64];
shortflag;
int*p,*r;
short*q;
shortk,h1,h2;
inti1,j1;
intdct_flag=0;
int*sw;
int*SDRAM_control,
*ER,
*OPT_7,
*SRC_7,
*count_7,
*DST_7,
*index_7,
*link_7,
*OPT_reload_7,
*SRC_reload_7,
*count_reload_7,
*DST_reload_7,
*index_reload_7,
*link_reload_7;
p=(int*)0xa0000018;
r=(int*)0xb0000014;
q=(short*)0x80000000;
data[0]=0x8080;
*(int*)EMIF_CE1=0xFFFFFF23;//CE1设置成32位模式
CSR=CSR|1;//在CPUCORE寄存器中把外部中断使能
IER=0x00000122;
*ECR|=0x000000C0;
*CIER=0x00000040;
ECR=(int*)0x01A0FFF8;
ER=(int*)0x01A0FFF0;
EER=(int*)0x01A0FFF4;
ESR=(int*)0x01A0FFFC;
OPT_6=(int*)0x01A00090;
SRC_6=(int*)0x01A00094;
count_6=(int*)0x01A00098;
DST_6=(int*)0x01A0009c;
index_6=(int*)0x01A000A0;
link_6=(int*)0x01A000A4;
OPT_reload_6=(int*)0x01A00210;
SRC_reload_6=(int*)0x01A00214;
count_reload_6=(int*)0x01A00218;
DST_reload_6=(int*)0x01A0021C;
index_reload_6=(int*)0x01A00220;
link_reload_6=(int*)0x01A00224;
OPT_7=(int*)0x01A000A8;
SRC_7=(int*)0x01A000AC;
count_7=(int*)0x01A000B0;
DST_7=(int*)0x01A000B4;
index_7=(int*)0x01A000B8;
link_7=(int*)0x01A000BC;
OPT_reload_7=(int*)0x01A00630;
SRC_reload_7=(int*)0x01A00634;
count_reload_7=(int*)0x01A00638;
DST_reload_7=(int*)0x01A0063c;
index_reload_7=(int*)0x01A00640;
link_reload_7=(int*)0x01A00644;
*EER=0x0000000C0;//EDMA通道6和通道7的使能打开
//具体配置EDMA通道6的寄存器参数,要注意这里采用了link的技术:
即EDMA完成一帧//的数据搬移后,利用link机制,把参数,表重新载入,自动进行后续的搬移,这对于图像的显示//来说是非常必要的
*OPT_6=0x49160003;
*SRC_6=0x80000000;
*count_6=0x027002D0;//origin
*DST_6=0xb0000014;
*index_6=0x06C00002;
*link_6=0x00000210;
*OPT_reload_6=0x49160003;//具体配置EDMA通道6的重新载入的参数
*SRC_reload_6=0x80000000;
*count_reload_6=0x027002D0;//origin
*DST_reload_6=0xb0000014;
*index_reload_6=0x06C00002;
*link_reload_6=0x00000210;
*OPT_7=0x48200003;//具体配置EDMA通道7的寄存器参数
*SRC_7=0xa0000018;
*count_7=0x027002D0;//origin
*DST_7=0x80000000;//origin
*index_7=0x03600001;
*link_7=0x00000630;
*OPT_reload_7=0x48200003;//具体配置EDMA通道6的重新载入的参数
*SRC_reload_7=0xa0000018;
*count_reload_7=0x027002D0;//origin
*DST_reload_7=0x80000000;//origin
*index_reload_7=0x00000000;
*link_reload_7=0x00000630;
*(int*)0x01800010=0x00000010;
*(int*)0x01800014=0x00000010;
a=*(int*)0x90080000;//第二个十六进制数控制开关,0表示按下去
sw=(int*)0x90080000;
for(;;)
{if(data_ready)
{
if(Get_Switches==0x00000006)//*aa&0x0f000000==0x0e000000)
{
for(j1=0;j1<78;j1++)
{
for(i1=0;i1<90;i1++)
{
//对亮度进行处理
for(h1=0;h1<8;h1++)
for(h2=0;h2<8;h2++)
{
data[h2+h1*8]=*(unsignedchar*)(0x80000000+j1*720*8*2+i1*8*2+h2*2+h1*720*2);
}
Dct(data,data_dct_1);
Idct(data_dct_1,data);
for(h1=0;h1<8;h1++)
for(h2=0;h2<8;h2++)
{
*(unsignedchar*)(0x80000000+j1*720*8*2+i1*8*2+h2*2+h1*720*2)=data[h2+h1*8];
}
}
}
*OPT_6=0x49160003;
*SRC_6=0x80000000;
*count_6=0x027002D0;//origin
*DST_6=0xb0000014;
*index_6=0x06C00002;
*link_6=0x00000210;
*OPT_reload_6=0x49160003;//具体配置EDMA通道6的重新载入的参数
*SRC_reload_6=0x80000000;
*count_reload_6=0x027002D0;//origin
*DST_reload_6=0xb0000014;
*index_reload_6=0x06C00002;
*link_reload_6=0x00000210;
*(int*)0x90080000=0x08000000;
data_ready=0;
}
}
}
}
/*
interruptvoidVS_isr()
{
//*(int*)0x90080000=0x07000000;}
*/
interruptvoidEDMA_finish_isr()
{
*(unsignedvolatileint*)CIPR|=0x00000040;
data_ready=1;
*(int*)0x90080000=0x07000000;
}
intDct(unsignedchar*block,short*coeff)
{
intj1,i,j,k;
floatb[8];
floatb1[8];
floatd[8][8];
floatf0=(float).7071068;
floatf1=(float).4903926;
floatf2=(float).4619398;
floatf3=(float).4157348;
floatf4=(float).3535534;
floatf5=(float).2777851;
floatf6=(float).1913417;
floatf7=(float).0975452;
for(i=0,k=0;i<8;i++,k+=8){
for(j=0;j<8;j++){
b[j]=(float)block[k+j];
}
/*Horizontaltransform*/
for(j=0;j<4;j++){
j1=7-j;
b1[j]=b[j]+b[j1];
b1[j1]=b[j]-b[j1];
}
b[0]=b1[0]+b1[3];
b[1]=b1[1]+b1[2];
b[2]=b1[1]-b1[2];
b[3]=b1[0]-b1[3];
b[4]=b1[4];
b[5]=(b1[6]-b1[5])*f0;
b[6]=(b1[6]+b1[5])*f0;
b[7]=b1[7];
d[i][0]=(b[0]+b[1])*f4;
d[i][4]=(b[0]-b[1])*f4;
d[i][2]=b[2]*f6+b[3]*f2;
d[i][6]=b[3]*f6-b[2]*f2;
b1[4]=b[4]+b[5];
b1[7]=b[7]+b[6];
b1[5]=b[4]-b[5];
b1[6]=b[7]-b[6];
d[i][1]=b1[4]*f7+b1[7]*f1;
d[i][5]=b1[5]*f3+b1[6]*f5;
d[i][7]=b1[7]*f7-b1[4]*f1;
d[i][3]=b1[6]*f3-b1[5]*f5;
}
for(i=0;i<8;i++){
for(j=0;j<4;j++){
j1=7-j;
b1[j]=d[j][i]+d[j1][i];
b1[j1]=d[j][i]-d[j1][i];
}
b[0]=b1[0]+b1[3];
b[1]=b1[1]+b1[2];
b[2]=b1[1]-b1[2];
b[3]=b1[0]-b1[3];
b[4]=b1[4];
b[5]=(b1[6]-b1[5])*f0;
b[6]=(b1[6]+b1[5])*f0;
b[7]=b1[7];
d[0][i]=(b[0]+b[1])*f4;
d[4][i]=(b[0]-b[1])*f4;
d[2][i]=b[2]*f6+b[3]*f2;
d[6][i]=b[3]*f6-b[2]*f2;
b1[4]=b[4]+b[5];
b1[7]=b[7]+b[6];
b1[5]=b[4]-b[5];
b1[6]=b[7]-b[6];
d[1][i]=b1[4]*f7+b1[7]*f1;
d[5][i]=b1[5]*f3+b1[6]*f5;
d[7][i]=b1[7]*f7-b1[4]*f1;
d[3][i]=b1[6]*f3-b1[5]*f5;
}
for(i=0;i<8;i++){
for(j=0;j<8;j++){
*(coeff+j*8+i)=(short)d[i][j];}
}
return0;
}
intIdct(short*coeff,unsignedchar*block)
{
intj1,i,j;
floatb[8],b1[8],d[8][8];
floatf0=.7071068;
floatf1=.4903926;
floatf2=.4619398;
floatf3=.4157348;
floatf4=.3535534;
floatf5=.2777851;
floatf6=.1913417;
floatf7=.0975452;
floate,f,g,h;
/*Horizontal*/
/*Descancoefficientsfirst*/
for(i=0;i<8;i++){
for(j=0;j<8;j++){
b[j]=*(coeff+j*8+i);
}
e=b[1]*f7-b[7]*f1;
h=b[7]*f7+b[1]*f1;
f=b[5]*f3-b[3]*f5;
g=b[3]*f3+b[5]*f5;
b1[0]=(b[0]+b[4])*f4;
b1[1]=(b[0]-b[4])*f4;
b1[2]=b[2]*f6-b[6]*f2;
b1[3]=b[6]*f6+b[2]*f2;
b[4]=e+f;
b1[5]=e-f;
b1[6]=h-g;
b[7]=h+g;
b[5]=(b1[6]-b1[5])*f0;
b[6]=(b1[6]+b1[5])*f0;
b[0]=b1[0]+b1[3];
b[1]=b1[1]+b1[2];
b[2]=b1[1]-b1[2];
b[3]=b1[0]-b1[3];
for(j=0;j<4;j++){
j1=7-j;
d[i][j]=b[j]+b[j1];
d[i][j1]=b[j]-b[j1];
}
}
for(i=0;i<8;i++){
for(j=0;j<8;j++){
b[j]=d[j][i];
}
e=b[1]*f7-b[7]*f1;
h=b[7]*f7+b[1]*f1;
f=b[5]*f3-b[3]*f5;
g=b[3]*f3+b[5]*f5;
b1[0]=(b[0]+b[4])*f4;
b1[1]=(b[0]-b[4])*f4;
b1[2]=b[2]*f6-b[6]*f2;
b1[3]=b[6]*f6+b[2]*f2;
b[4]=e+f;
b1[5]=e-f;
b1[6]=h-g;
b[7]=h+g;
b[5]=(b1[6]-b1[5])*f0;
b[6]=(b1[6]+b1[5])*f0;
b[0]=b1[0]+b1[3];
b[1]=b1[1]+b1[2];
b[2]=b1[1]-b1[2];
b[3]=b1[0]-b1[3];
for(j=0;j<4;j++){
j1=7-j;
d[j][i]=b[j]+b[j1];
d[j1][i]=b[j]-b[j1];
}
}
for(i=0;i<8;i++){
for(j=0;j<8;j++){
*(block+i*8+j)=(unsignedchar)(d[i][j]);
}
}
return0;
}六、实验出现的问题、实验结果分析
在运行程序前,要先下载FPGA程序,但是在下载时经常下载失败,解决方法是重新开始下载,多试几次,不然可以通过重启主机,检查各个接口是否接好。
有时也可能是下载线有问题。
电脑主机重启后将COMS中的I/OCONFIGRATION设置为EPP,则CCS软件会打不开。
似乎每次实验都有这样的问题,所以才更需要注意。
只有在对整个过程熟练后,才能保证每一步都准确无误。
DCT、IDCT变换充分利用了图像数据的空间相关性来实现数据压缩用A口和B口。
七、实验小结和思考
通过本次实验,我们了解DSP的EDMA技术,了解DSP的中断技术;对SDRM在静态数据采集中的作用有了一定的熟悉。
DCT变换实验说明DCT、IDCT变换本身是无损的,只是由于有限精度的原因才回有精度上的损失。