实验2-音频DSP程序编写与调试

更新时间:2023-04-26 17:28:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

!

广州大学学生实验报告

开课学院及实验室:机电学院电子楼501 2018年 5 月 11 日

学院机械与电气工

程学院

年级、专

业、班

电信151

!

苏伟强

学号51

实验课程名称音频DSP技术与应用成绩

实验项目名称%

实验二音频DSP程序编写与调试指导

老师

张承云

一、实验目的

1.掌握DSP程序的编写方法,调试方法,烧写方法。

二、实验设备

1.软件:VisualDSP++和matlab

2.¥

3.硬件:ADSP-21489 EZ-Borad开发板

三、实验内容

1.软件仿真

a.使用VisualDSP++目录下的例程21489 AD1939 Block-Based Talkthru 48 or 96kHz,将实验文

件夹exp2目录下的和拷贝到该工程文件夹下,并且将代替为exp2中的,在VisualDSP++打开,设置为

软件仿真模式(添加新的simulation的section),编译该程序,如Fig. 1所示。

b.如Fig. 1所示,程序编译通过,说明程序没有语法错误,但是这并不意味着程序的算法没有问

题,即我们无法知道算法能不能达到预期的效果,所以我们需要进行模拟数据仿真。在程序中,数据

的输入和输出都是以变量的形式表示的,所以我们需要用我们的模拟数据对这些变量进行初始化,这

就需要数据流的设置了,数据流是有方向的(source->destination),可以实现数据从source 到

destination的传递,这也是所谓“流”的概念。点击settings\streams\add添加流,弹出add stream

对话框设置流的source和destination,source和destination可以是数据文件,也可以是变量。在

本实验中,我们将添加数据从文件传递到输入变量DataIn,实现输入变量的数据初始化;添加输出变

量DataOut传递到文件的流实现输出变量的文件存储。如所示

Fig. 1 编译工程

&

Fig. 2 添加数据文件导入流和处理结果导出流

c.在语句processData(input,output,N)添加断点,调试,在断点处停下后,在expression数据查看框查看输入数据input ,使用matlab打开文件,对比数据input和中的数据,如所示,发现两个一样,证明我们之前设置的原始数据输出入流有效。(从文件传递到输入变量DataIn)

Fig. 3 input和对比

d.删除断点,执行完程序,将文件文件输入到matlab,采样频率为48kHz,绘图,如所示,现在可

以知道程序的作用是将输入音频衰减一半。

Fig. 4 matlab绘制和,采样频率48kHz

;

2.硬件仿真

a.使用usb-JTAG线连接PC与21489 开发板,开发板电源线连接电源,使用手机或者其他音频输出

设备通过RCA音频线(Radio Corporation of American莲花插座)输入音频到开发板(底层1L,1R),使用耳机接听输出音频(中间层1L,1R)。

b.使用VisualDSP++目录下的例程21489 AD1939 Block-Based Talkthru 48 or 96kHz,添加新的

section硬件仿真(EZ-KIT Lite),取消所有断点,编译运行,用耳机听到了手机播放的音频。

c.将实验材料exp2文件夹下的,拷贝到该工程文件夹中。并且在VisualDSP++项目目录中右键Add

File(s) to Folder往工程中添加前述两个文件。

d.在文件中,找出以下代码并且去掉前面的注释符

extern void multiply(float inputdata ,float outputdata);

multiply (inputD, outputD);

在文件中,将以下代码的注释符去掉

void multiply(float inputdata ,float outputdata)

{

outputdata=*inputdata;

}

编译连接程序,并且运行,发现没有声音,原因是multiply 函数实际上并未将处理完后的数据赋值给outputD,只对临时变量outputD进行赋值,而临时变量outputD将在函数结束后释放内存。

e.在文件中,找出以下代码并且去掉前面的注释符

extern void multiply(float inputdata ,float* outputdata);

`

multiply (inputD, &outputD);

在文件中,将以下代码的注释符去掉

void multiply(floa* inputdata ,float* outputdata)

{

*outputdata=*inputdata;

}

编译连接程序,并且运行,发现没有声音,原因是multiply 函数将处理完后的数据赋值给outputD,这里的临时变量为指针类型,通过这个临时变量在内存中索引到变量的值并进行赋值操作,然后函

数结束后释放这个指针,然而这并不影响outputD在内存中的数据已经被修改了的事实。

f.\

g.在文件中,找出以下代码并且去掉前面的注释符

extern void multiply(float* inputdata ,float* outputdata);

multiply (&inputD, &outputD);

在文件中,将以下代码的注释符去掉

void multiply(float* inputdata ,float* outputdata)

{

*outputdata=*(*inputdata);

}

h.%

i.编译连接程序,并且运行,发现没有声音,原因与e所述大致相同,只是其增加了指向inputdata 的

指针临时变量,并且通过指针访问inputdata,由于inputdata 实际上并不需要修改,只用于输入的源数据,

和中间处理数据,所以通过临时变量指定和通过临时指针变量指定,在函数结束后释放临时变量,也不会影响

outputdata结果,因为在释放之前临时变量已经完成了参与产生outputdata的任务。

3.程序烧写

a.继续步骤2硬件仿真程序,在project->project options中选择编译输出类型为载入文件(即loader

file),选择硬件平台21489如Fig. 5所示;在Load选项中选择启动类型(boot type)为并行端口

(parallel port),如Fig. 6。回到项目中,点击编译,即可在项目目录生成.ldr文件。

Fig. 5 选择编译输出类型为ldr

Fig. 6 启动类型为并行端口

b.选择tool->flash programmer。在driver选项卡,选择驱动文件.dxe,点击load driver加载驱动;

在programming选项卡中选择你要烧写的.ldr文件,并且点击烧写(program),等待进度条跑完,完

成烧写。

c.脱机运行开发板,输入音频可以听到声音,说明程序烧写完成。

四、(

五、实验分析

六、实验总结与体会

a.如图是该实验一个工程文件的目录,主要包含头文件,源文件,还有连接文件。头文件主要用来防止

硬件声明例如AD芯片ad1939和DSP芯片21489;源文件主要用来放置头文件中函数的实现,和一些硬件初始

化函数的实现,比方说端口初始化,1939和锁相环初始化, , 还有处理函数源文件,处理模块文件也有主函

数,这里是程序的入口点。

Fig. 7 工程目录

b.在编写DSP程序的时候,对于初学者,可以利用现成的程序框架,比方说本实验的直通程序21489

AD1939 Block-Based Talkthru 48 or 96kHz,修改里面的文件可以实现简单的DSP算法。需要注意的是,在

进行音频处理的时候,如果将音频传入函数中进行处理并返回的话,需传入指针类型的变量,这样才能在函

数中使用这个指针索引到内存并且处理其值。

c.在将程序烧写到板前,往往需要对程序的可行性进行验证,这时候常常使用软件仿真的方法,通过设

置数据流的途径,将模拟数据输入到程序中,并且通过数据流的形式,将处理结果输出到数据文件中,配合

matlab将处理前后数据文件显示出来进行分析,确定达到算法预期结果后可以将程序烧写进开发板,进行脱

机运行。

d.在软件仿真section中,程序编译通过,说明程序没有语法错误,但是这并不意味着程序的算法没有

问题,即我们无法知道算法能不能达到预期的效果,所以我们需要进行模拟数据仿真。

e.¥

f.数据流是有方向的(source->destination),可以实现数据从source 到destination的传递,这也

是所谓“流”的概念。点击settings\streams\add添加流,弹出add stream对话框设置流的source和

destination,source和destination可以是数据文件,也可以是变量。

D

七、实验完成后实验器材照片

Fig. 8 硬件连接图

Fig. 9 实验完成后设备整理图

本文来源:https://www.bwwdw.com/article/458q.html

Top