DSP 实验六 正弦波产生与图像增强的DSP实现.docx

上传人:b****3 文档编号:4415307 上传时间:2022-12-01 格式:DOCX 页数:14 大小:153.64KB
下载 相关 举报
DSP 实验六 正弦波产生与图像增强的DSP实现.docx_第1页
第1页 / 共14页
DSP 实验六 正弦波产生与图像增强的DSP实现.docx_第2页
第2页 / 共14页
DSP 实验六 正弦波产生与图像增强的DSP实现.docx_第3页
第3页 / 共14页
DSP 实验六 正弦波产生与图像增强的DSP实现.docx_第4页
第4页 / 共14页
DSP 实验六 正弦波产生与图像增强的DSP实现.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

DSP 实验六 正弦波产生与图像增强的DSP实现.docx

《DSP 实验六 正弦波产生与图像增强的DSP实现.docx》由会员分享,可在线阅读,更多相关《DSP 实验六 正弦波产生与图像增强的DSP实现.docx(14页珍藏版)》请在冰豆网上搜索。

DSP 实验六 正弦波产生与图像增强的DSP实现.docx

DSP实验六正弦波产生与图像增强的DSP实现

实验六正弦波产生与图像增强的DSP实现(C语言)

一、实验目的

1.初步掌握用C语言进行DSP程序设计。

2.掌握递推法产生正弦型信号的C语言程序设计方法。

3.掌握查表法进行图像直方图变换增强的C语言程序设计方法。

二、实验环境

1.奔腾IV计算机

2.CodeComposerStudio(CCS)软件

3.matlab6.5软件

三、实验内容

*C54xDSP软件设计的方法通常有三种:

(1)用汇编语言开发。

用汇编语言开发产品,周期长,软件修改和升级困难。

(2)用C语言开发。

优点是增强软件的可读性,提高了软件的开发速度,方便软件的修改和移植。

但无法实现在任何情况下都能合理地利用DSP芯片的各种资源。

(√)

(3)用C和汇编语言混合编程开发,能更好地达到设计要求。

1.递推法产生正弦型信号

递推法产生N点余弦波和正弦波的公式:

cos(nx)=2cos(x)cos[(n-1)x]-cos[(n-2)x]

(1)

sin(nx)=2cos(x)sin[(n-1)x]-sin[(n-2)x]

(2)

其中:

x--角度步长;n---离散时间(n=0:

N)

(1)产生余弦信号(本例取x=10,N=200点)

变量:

_COSX=cos(10)=0.99390827-----角度步长x的余弦值;

数组:

1)_cosx-------存放余弦波输出值(共200点)

2)dacdata=_cosx*2047+2048------输出结果

(将余弦信号的幅度范围从-1~1调整至0~4096,成为整数)

根据公式

(1)循环,逐次计算出各点的余弦信号。

}

实验要求:

[1]将cose.c,cose.cmd及c:

\ti\c5400\cgtools\lib目录下的库文件rts.lib添加入所创建的工程:

cose.pjt中。

[2]运行程序cose.c,按照以下设置,画出输出波形dacdata:

图1

[3]分别按照以下设置,观察并写出_cosx和dacdata前10个值。

(a)(b)

图2

_cosx[0]~_cosx[9]=1.00.99939080.99756410.9945220.9902682

0.9848080.97814790.9702960.9612620.9510568

dacdata[0]~dacdata[9]=40954093409040834075406340504034

40153994

(2)设计程序,产生正弦信号(本例取x=10,N=200点)

提示:

对程序cose.c中蓝色部分进行修改:

变量:

_COSX=cos(10)=0.99390827-----角度步长x的余弦值;

数组:

1)_sinx-------存放正弦波输出值(共200点)

2)dacdata[i]=_sinx[i]*4096------输出结果(共180点)

(将余弦信号的幅度范围从-1~1调整至-2048~2048,成为整数)

3)初始值:

_sinx[0]=0.0;_sinx[1]=0.01745241;

dadata[0]=0;dacdata[1]=71。

注:

sin(10)=0.0175

根据公式

(2)循环,逐次计算出各点的正弦信号。

实验要求:

[1]设计产生正弦波的程序:

sine.c

/*源程序sine.c*/

ioportunsignedport0bfff;

#defineIOSRport0bfff

#define_COSX0.999390827

#define_SINX0.017452406

#pragmaDATA_SECTION(_SINX,"data_buf1")

float_sinx[200];

#pragmaDATA_SECTION(dacdata,"data_buf2")

intdacdata[180];

voiddelay(void);

voidmain(void)

{

unsignedinti=0;

_sinx[0]=0.000;

dacdata[0]=0;

_sinx[1]=_SINX;

dacdata[1]=_SINX*4096;

i=1;

while

(1)

{

if(i++>179)

break;

_sinx[i]=2*COSX*_sinx[i-1]-_sinx[i-2];

dacdata[i]=_sinx[i]*4096;

}

i=0;

while

(1)

{

if(i>179)

i=0;

IOSR=dacdata[i++];

delay();

}

}

voiddelay(void)

{

longintj;

for(j=0;j<800;j++)

asm("_nop");

}

/*链接命令文件sine.cmd*/(与cose.cm相同)

[2]仍按照图1设置,画出输出dacdata波形:

2.查表法进行图像直方图变换增强

(1)图像的gamma校正

gamma校正是图像对比度增强的方法之一,

公式为:

Iout=(Iin/maxgray)1/γ*maxgray(3)

其中:

Iin---输入图像的灰度值;Iout----输出图像的灰度值;maxgray=255---最大灰度值;

γ---gamma系数。

步骤:

1)在matlab中,根据(3)式编程,产生Iin和Iout,组成表格table。

%gammajiaozheng.m

clear

clc

Iin=0:

255;

maxgray=255;

r=1.54;%gamma系数

Iout=(Iin/maxgray).^(1/r)*maxgray;%gamma校正

table=[Iin'round(Iout)']%Iin和Iout组成的关系表

2)在CCS中用C语言编程,用查表法对一幅64×64的图像:

"tire.dat"进行gamma校正。

数组:

(i)in_buffer-----存放原图像的灰度值。

(ii)out_buffer----存放结果图像的灰度值。

(iii)LUT----对应于灰度:

0~255,经gamma校正后的灰度值表格。

(LUT中的值即matlab中计算得到的:

round(Iout))

查表语句:

output[i]=LUT[input[i]];(i=0~4095)

/*源程序gammajiaozheng.c*/

#include/*包含头文件*/

#include/*包含头文件*/

#defineTRUE1

#defineFALSE0

#defineBUFSIZE4096/*定义BUFSIZE代表4096*/

intin_buffer[BUFSIZE];/*in_buffer数组(整型数)*/

intout_buffer[BUFSIZE];/*out_buffer数组(整型数)*/

staticintgamma(int*input,int*output);/*gamma校正子程序*/

staticvoiddataIO(void);/*图像数据输入子程序*/

voidmain()

{

int*input=&in_buffer[0];/*指针input指向in_buffer[0]*/

int*output=&out_buffer[0];/*指针output指向out_buffer[0]*/

puts("the3rdexperimentstarted\n");/*显示"the3rdexperimentstarted*/

while(TRUE)/*不断循环*/

{

dataIO();/*调用dataIO子程序*/

puts("processing\n");/*在运行栏中输入processinf*/

gamma(input,output);/*对input,output进行gamma矫正*/

dataIO();

}

}

staticintgamma(int*input,int*output)/*gamma校正子程序*/

{

inti;/*定义整型变量i*/

intLUT[256]={0,7,11,14,17,20,22,25,27,29,31,33,35,37,39,40,42,44,46,47,49,50,52,53,55,56,58,59,61,62,63,65,66,68,69,70,71,73,74,75,76,78,79,80,81,83,84,85,86,87,88,90,91,92,93,94,95,96,97,98,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,131,

132,133,134,135,136,137,138,139,140,141,141,142,143,144,145,146,147,148,149,149,150,151,

152,153,154,155,155,156,157,158,159,160,160,161,162,163,164,165,165,166,167,168,169,

169,170,171,172,173,173,174,175,176,177,177,178,179,180,181,181,182,183,184,185,185,186,

187,188,188,189,190,191,191,192,193,194,194,195,196,197,197,198,199,200,200,201,202,

203,203,204,205,206,206,207,208,208,209,210,211,211,212,213,213,214,215,216,216,217,218,

218,219,220,221,221,222,223,223,224,225,225,226,227,228,228,229,230,230,231,232,232,233,234,234,235,236,236,237,238,238,239,240,240,241,242,242,243,244,244,245,246,246,247,248,248,249,250,250,251,252,252,253,254,254,255};/*gamma校正表LUT*/

for(i=0;i

output[i]=LUT[input[i]];

/*对每个输入像素值查表,进行gamma校正,结果存入out_buffer中*/

}

return(TRUE);/*返回主程序*/

}

staticvoiddataIO()

/*图像输入子程序,其实没有进行任何操作,起到等待外部输入数据的作用*/

{

return;/*返回*/

}

/*链接命令文件gammajiaozheng.cmd*/

-mvolume.map

MEMORY

{

PAGE0:

EPROG:

origin=0x3000,len=0x1000

VECT:

origin=0xff80,len=0x80

PAGE1:

USERREGS:

origin=0x60,len=0x1c

BIOSREGS:

origin=0x7c,len=0x4

IDATA:

origin=0x80,len=0x2f80

}

SECTIONS

{

.vectors:

{}>VECTPAGE0

.sysregs:

{}>BIOSREGSPAGE1

.trcinit:

{}>EPROGPAGE0

.gblinit:

{}>EPROGPAGE0

frt:

{}>EPROGPAGE0

.text:

{}>EPROGPAGE0

.cinit:

{}>EPROGPAGE0

.pinit:

{}>EPROGPAGE0

.sysinit:

{}>EPROGPAGE0

.bss:

{}>IDATAPAGE1

.far:

{}>IDATAPAGE1

.const:

{}>IDATAPAGE1

.switch:

{}>IDATAPAGE1

.sysmem:

{}>IDATAPAGE1

.cio:

{}>IDATAPAGE1

.MEM$obj:

{}>IDATAPAGE1

.sysheap:

{}>IDATAPAGE1

.stack:

{}>IDATAPAGE1

}

实验要求:

[1]在空格中添入注释。

[2]将gammajiaozheng.c,gammajiaozheng.cmd及c:

\ti\c5400\cgtools\lib目录下的库文件rts.lib添加入所创建的工程:

gammajiaozheng.pjt中。

[3]运行该程序。

[4]按View--WatchWindow,选择Watch1观测窗口,添加in_buffer和out_buffer变量,观测它们的起始地址:

图3

注:

不一定是图3中显示的地址,要观察后才能得知。

[5]从文件读入数据到内存:

按File----Data----Load,按下图设置:

(a)(b)

图4

注:

图4(b)中的Adress是你所观测到的in_buffer起始地址(不一定是0x0080)

[6]选View---Graph----Image...并按以下设置,画出原图像和经gamma校正后的图像。

(a)(b)

图5

(2)图像的直方图均衡化

直方图均衡化的基本思想是:

将原图的直方图变换为均匀分布的形式,以增加像素灰度值的动态范围,从而达到增强整体对比度的效果。

直方图均衡化的matlab语句:

[g,LUT]=histeq(f);

其中f----原图像;g---直方图均衡化后的图像;

LUT---对应于灰度值0~255的均衡化后像素的灰度。

步骤:

1)在matlab中,产生直方图均衡化表:

LUT。

clear

clc

loadtire1%调入输入图像数据tire1.dat

A=tire1;

M=64;N=64;

f=zeros(M,N);

fori=1:

M%将tire1.dat形成图像f

f(i,:

)=A((i-1)*N+1:

i*N);

end

f=uint8(f);%将f转换为uint8格式

[g,LUT]=histeq(f);%对f进行直方图均衡化得g,并产生LUT表。

LUT=round(LUT*255)%将LUT乘以255并四舍五入,形成整数

则LUT=[0,0,0,0,4,4,8,12,16,20,24,32,40,45,53,61,65,69,73,77,81,81,85,85,89,89,93,

93,97,97,101,101,101,105,105,109,109,113,113,113,117,117,117,121,121,

121,125,125,125,125,125,130,130,130,134,134,134,134,134,138,138,138,138,

138,142,142,142,142,142,146,146,146,146,146,150,150,150,150,150,150,154,

154,154,154,154,158,158,158,162,162,162,162,162,166,166,166,166,170,170,

170,170,174,174,174,174,174,178,178,178,178,182,182,182,182,186,186,186,

186,190,190,190,190,194,194,194,194,198,198,198,198,198,198,202,202,202,

202,202,206,206,206,206,206,206,206,210,210,210,210,210,210,210,210,215,

215,215,215,215,215,215,219,219,219,219,219,219,219,219,219,223,223,223,

223,223,223,223,223,223,227,227,227,227,227,227,227,227,227,231,231,231,

231,231,231,231,231,231,231,231,231,235,235,235,235,235,235,235,235,235,

235,239,239,239,239,239,239,239,239,239,239,243,243,243,243,243,243,243,

243,243,243,243,243,247,247,247,247,247,247,247,247,247,247,247,247,251,

251,251,251,251,251,251,251,251,251,255,255,255,255];

2)在CCS中用C语言编程,用查表法对图像:

"tire.dat"进行直方图均衡化。

实验要求:

[1]编程实现对图像tire.dat的直方图均衡化。

/*源程序junhenghua.c*/

#include

#include

#defineTRUE1

#defineFALSE0

#defineBUFSIZE4096

intin_buffer[BUFSIZE];

intout_buffer[BUFSIZE];

staticintgamma(int*input,int*output);

staticvoiddataIO(void);

voidmain()

{

int*input=&in_buffer[0];

int*output=&out_buffer[0];

puts("the3rdexperimentstarted\n");

while(TRUE)

{

dataIO();

puts("processing\n");

gamma(input,output);

dataIO();

}

}

staticintgamma(int*input,int*output)

{

inti;

intLUT[256]={0,0,0,0,4,4,8,12,16,20,24,32,40,45,53,61,65,69,73,77,81,81,85,85,89,89,93,

93,97,97,101,101,101,105,105,109,109,113,113,113,117,117,117,121,121,

121,125,125,125,125,125,130,130,130,134,134,134,134,134,138,138,138,138,

138,142,142,142,142,142,146,146,146,146,146,150,150,150,150,150,150,154,

154,154,154,154,158,158,158,162,162,162,162,162,166,166,166,166,170,170,

170,170,174,174,174,174,174,178,178,178,178,182,182,182,182,186,186,186,

186,190,190,190,190,194,194,194,194,198,198,198,198,198,198,202,202,202,

202,202,206,206,206,206,206,206,206,210,210,210,210,210,210,210,210,215,

215,215,215,215,215,215,219,219,219,219,219,219,219,219,219,223,223,223,

223,223,223,223,223,223,227,227,227,227,227,227,227,227,227,231,231,231,

231,231,231,231,231,231,231,231,231,235,235,235,235,235,235,235,235,235,

235,239,239,239,239,239,239,239,239,239,239,243,243,243,243,243,243,243,

243,243,243,243,243,247,247,247,247,247,247,247,247,247,247,247,247,251,

251,251,251,251,251,251,251,251,251,255,255,255,255};

for(i=0;i

output[i]=LUT[input[i]];

}

return(TRUE);

}

staticvoiddataIO()

{

return;

}

....

/*链接命令文件junhenghua.cmd*/(与gammajiaozheng.cmd相同)

[2]运行程序,调入数据"tire.dat",画出原图像及经过直方图均衡化的图像。

[3]将均衡化后的图像数据保存为:

"junhengtire.dat"(16位有符号整数格式)

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1