实验二用SIMULATOR模拟实现数字信号处理.docx

上传人:b****8 文档编号:10051478 上传时间:2023-02-08 格式:DOCX 页数:24 大小:107.31KB
下载 相关 举报
实验二用SIMULATOR模拟实现数字信号处理.docx_第1页
第1页 / 共24页
实验二用SIMULATOR模拟实现数字信号处理.docx_第2页
第2页 / 共24页
实验二用SIMULATOR模拟实现数字信号处理.docx_第3页
第3页 / 共24页
实验二用SIMULATOR模拟实现数字信号处理.docx_第4页
第4页 / 共24页
实验二用SIMULATOR模拟实现数字信号处理.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

实验二用SIMULATOR模拟实现数字信号处理.docx

《实验二用SIMULATOR模拟实现数字信号处理.docx》由会员分享,可在线阅读,更多相关《实验二用SIMULATOR模拟实现数字信号处理.docx(24页珍藏版)》请在冰豆网上搜索。

实验二用SIMULATOR模拟实现数字信号处理.docx

实验二用SIMULATOR模拟实现数字信号处理

7.3实验二——用SIMULATOR模拟实现数字信号处理

本实验主要通过四个练习来了解如何利用SIMULATOR实现基本的信号处理方法。

实验包括以下几个练习:

练习一:

时域卷积运算

练习二:

DFT运算

练习三:

时域相关运算

练习四:

利用相关函数计算信号的功率谱

7.3.1练习一——时域卷积运算

练习一的目的是使学生掌握VisualDSP++的使用,同时加深对数字信号处理理论的理解。

这是一个较简单的计算两个输入序列的卷积程序。

两个输入序列的长度相同,分别写入到几个文件中。

程序编译运行时将数据读入存储器中,并对其进行卷积运算,计算结果存放于另一个缓冲区中。

1.程序说明

设输入序列X的长度为M,Y的长度为N,则程序按照因果系统计算卷积:

程序中一个输入序列X指定到数组inputx中,另一个输入序列Y指定到数组inputy中,卷积的输出指定到数组output中。

根据卷积原理,两个输入序列长度为M=N=64,输出序列长度为M+N-1=127。

程序主要由主程序和卷积子程序(位于pm_code段中)二个模块组成。

在主程序中,先将输入数组X复制到输出数组的后半部分,然后调用卷积子程序conv计算卷积。

卷积计算子程序中,将计算按照输出长度分成两段完成,在程序中利用left和right两个二重循环实现。

Left循环计算m=0~N-1,right循环计算m=N~N+M-1。

在计算卷积时,序列X采用正常序寻址,利用指令F5=DM(I9,M9)读取X(k),其中地址增量寄存器M9=1,开始计算时寄存器I9指向序列X的第一个元素。

而序列Y是逆序寻址,利用指令F0=DM(I1,M2)读取Y(m-k),其中地址增量寄存器M2=-1,开始计算时寄存器I1指向序列Y的最后一个元素。

实验测试程序主要模块的源程序如下:

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

conv.asmADSP-2106x

程序功能:

计算X[]与Y[]的卷积

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

#include"def21060.h"/*存储器映射的IOP寄存器定义*/

#defineLENGTH_X64/*符号常数*/

#defineLENGTH_Y64

.SECTION/DMdm_data;/*定义数据存储区中的变量*/

.VARinputx[LENGTH_X]="pulse1.dat";

.VARinputy[LENGTH_Y]="sin64.dat";

.VARoutput[LENGTH_X+LENGTH_Y-1]="zeros.dat";

.SECTION/PMpm_rsti;/*复位向量段*/

NOP;

USTAT2=0x108421;/*复位后程序从这里开始执行*/

DM(WAIT)=USTAT2;/*设置外部存储器访问为0等待*/

JUMPstart;

.SECTION/PMpm_code;

start:

M1=1;

I0=inputx;

L0=0;

I3=output+LENGTH_Y-1;

L3=0;

/*把数组inputx复制到output的后半段(位于LENGTH_Y-1开始)*/

LCNTR=LENGTH_X,docopydatauntillce;

F0=DM(I0,M1);

copydata:

DM(I3,M1)=F0;

CALLconv;/*调用子程序,进行卷积计算*/

end:

IDLE;/*等待*/

/*********计算时域相关性的子程序 ****************************/

conv:

I2=output;

M1=1;

M2=-1;

M9=1;

F15=0;/*用于给累加器清零*/

/*计算前LENGTH_X个数据*/

LCNTR=LENGTH_X,DOleftUNTILLCE;

I9=I2;

I1=inputy+LENGTH_Y-1;/*指向inputy的结尾*/

F9=PASSF15,F0=DM(I1,M2),F5=PM(I9,M9);

LCNTR=LENGTH_Y,DOinner1UNTILLCE;

F13=F0*F5;

inner1:

F9=F9+F13,F0=DM(I1,M2),F5=PM(I9,M9);

/*F0=数组inputy,F5=数组inputx*/

left:

DM(I2,M1)=F9;/*存储计算结果,I2递增*/

/*计算后面LENGTH_Y-1个数据*/

R1=LENGTH_Y;/*内循次数计数器*/

LCNTR=LENGTH_Y-1,DOrightUNTILLCE;

I9=I2;

I1=inputy+LENGTH_Y-1;/*指向inputy的结尾*/

R1=R1-1;/*循环次数递减*/

F9=PASSF15,F0=DM(I1,M2),F5=PM(I9,M9);

LCNTR=R1,DOinner2UNTILLCE;

F13=F0*F5;

inner2:

F9=F9+F13,F0=DM(I1,M2),F5=PM(I9,M9);

/*F0=数组inputy,F5=数组inputx*/

right:

DM(I2,M1)=F9;/*存储计算结果,I2递增*/

RTS;

2.实验步骤

1)调入程序

启动运行VisualDSP++,运行菜单命令\Project\New来新建一个工程,工程名称自定义,正确设置工程的各个选项,将DSP_exp\float\unit_2\Conv目录下的源文件(conv.ASM和conv.ldf)加入到工程中,同时也将备用的数据文件pulse1.dat、pulse4.dat、square1.dat、square2.dat、sin64.dat、trig64.dat以及初始化文件zeros.dat加入工程中。

2)选择输入数据文件

编译程序前,在下述程序行中将输入数据文件改为pulse1.dat和sin64.dat:

.VARinputx[LENGTH_X]="pulse1.dat";

.VARinputy[LENGTH_Y]="sin64.dat";

其中pulse1.dat为单个冲击脉冲信号,sin64.dat为正弦信号。

3)编译程序

分析、理解源程序,在此基础上再编译运行程序。

可通过点击按钮命令或选择菜单命令\Project\BuildProject来完成编译。

本程序的sessions为ADSP-21062ADSP-2106xSimulator。

4)观察结果

按F5运行程序,然后执行菜单命令\View\DebugWindows\Plot命令,分别作出输入数据inputx[]和inputy[]与输出数据output[]的图形。

执行菜单命令\Debug\StepInto单步运行程序,打开RegisterFile和对应的存储区,观察寄存器和存储器的变化。

6)改变数据再运行

●数组inputx保持为pulse1.dat,将数组inputy分别改变为数据文件square1.dat(方波)、trig64.dat(三角波)重复3),4),来考察程序的执行结果。

●数组inputx改变为pulse4.dat(4个冲击脉冲),将数组inputy分别改变为数据文件sin64.dat,square1.dat(方波)、trig64.dat(三角波)重复3),4),来考察程序的执行结果。

●数组inputx改变为square1.dat,将数组inputy改变为数据文件square2.dat(方波),

重复3),4),来考察程序的执行结果。

3.典型结果

图7.17正弦波与冲击脉冲的卷积

图7.18两个不同宽度的矩形脉冲的卷积

图7.19冲击脉冲序列与矩形脉冲的卷积

4.实验要求

1)利用plot功能,观察各种输入数据、输出数据的的波形;

2)按照实验步骤完成实验,比较给定的几种数据的卷积结果,说明几种信号卷积的差别。

3)在实验报告中记录square1和square2卷积的输入和输出数据及其波形,并利用数字信号处理课程所学知识分析结果。

7.3.2练习二——DFT计算

离散傅里叶变换(DFT)的计算公式为:

其中x(n)是输入的数字序列,n=0~N-1;X(k)是输入数字序列的DFT系数,k=0~N-1。

它仅存在于离散点,因此是离散谱。

通过本练习使学生加深对各种基本波形的DFT的理解,加深对数字信号处理理论的理解。

输入数据放在几个文件中,程序编译运行时将数据读入存储器中,并对其进行DFT运算,计算结果存放于输出缓冲区中。

本练习采用64点离散傅里叶变换,DFT程序流图如图7.20所示。

1.程序说明

1)程序中,输入的64点数据放在数据文件square64.dat、trig64.dat、noise64.dat,并赋给DM段中的input[N]数组。

2)正弦旋转因子sin(2nkπ/N)的值预先计算,并放在PM数据段的sin[N]数组中。

由于cos(2nkπ/N)=sin(2nkπ/N+π/2),所以cos[N]=sine[N+N/4]即可由正弦值数组中跳过N/4个数来获得其余弦值。

对正弦和余弦均采用循环寻址方式,I8中存放正弦地址;I9中存放sine基址加N/4,即余弦的地址:

其循环长度存在L8、L9中,均为64。

3)在DM数据段定义了两数组:

real[N]和imag[N]。

分别用来存放计算结果的实部和虚部。

I1、I2中分别存放输出数据imag和real的地址。

4)程序的数据处理部分采用子程序调用方式,子程序名为dft。

即:

Calldft(DB);

采用迟延跳转方式,即该指令后的两条指令在子程序正式执行前被调用执行,来提高指令的执行效率。

5)B0=input:

来取出输入数据的地址,放入I0,并设定循环基址,L0寄存器中放入数据循环长度。

DFT数据处理中采用双重循环来实现。

由于输入的数据和旋转因子表均采用循环寻址方式。

故在内循环中,无需将数组的起始地址复位。

在最后一个数据(数组中)被读取后,地址寄存器中的地址会自动变为数组的起始地址。

图7.17DFT程序流图

6)程序中因sin(2nkπ/N)中的k、n都是变量,所以在内循环中n从0到N变化,即对每一个k值均有N次相乘,将其相加,得到一个数的DFT变换值。

外循环中,每一循环k值加1,则旋转因子表寻址步长也应加1。

例子中在每一内循环后,将I10+l,即使M8值加1。

7)程序中用到的指令含义

B0=input;设定循环基址,并使I0=ipput

L0=@input;将数组input[N]的长度值赋给L0

F8=PASSF15;将寄存器F15的值赋给F8

F0=DM(I0,M1);将I0地址所在的值通过DM数据总线传输给F0寄存器,

并修改IO的地址值,即I0=I0+M1

F5=PM(I9,M8);将I9地址所在的值通过PM数据总线传输给F5,并修

改I9=I9+M8

DM(I2,M0)=F9;将F9的值通过DM数据总线存入到I2地址,并将I2=I2十M1

MODIFY(I10,M9);修改I10地址值I10=I10十M9

源程序代码:

/*DFT.ASMN点实数DFT

N-l

real(k)+j*imag(k)=SUMinput(n)*[C-j*S];k=0toN-l

n=0

这里:

C=COS(2*PI*k*n/N),S=sin(2*pi*k*n/N),j=sqrt(-1)*/

#include“def21060.h”

#defineN64

.SECTION/DMdm_data;/*变量定义在DM数据段*/

.VARInput[N]=“x.dat”;/*输入数据*/

.VARreal[N]=“zeros64.dat”;/*输出数据的实部*/

.VARimagp[N]=“zeros64.dat”;/*输出数据的虚部*/

.SECTION/PMpm_data;

.VARsine[N]=“sin64.dat”;/*定义正弦旋转因子表,放在PM数据段*/

/*余弦旋转因子表由正弦表移动N/4而得*/

.VARmodul[N]=“zeros64.dat”

.SECTION/PMpm_rsti;

NOP;

USTAT2=0x108421;/*USTAT2为用户自定义寄存器*/

DM(WAIT)=USTAT2;/*WAIT寄存器用来设定与外设数据传

输时的等待周期及状态数*/

JUMPStart;

.SECTION/PMpm_code;/*程序代码段*/

START:

M1=l;/*地址修改寄存器*/

M9=1;

B0=input;/*设定循环基址*/

L0=@input;/*输入数据循环长度*/

I1=imag;/*虚部输出地址*/

L1=0;

CALLdft(DB);/*调用子程序,计算DFT*/

I2=real;/*实部输出地址*/

L2=0;

nop;

CALLmodl;/*调用子程序,计算DFT的模值*/

end:

IDLE;

/*********计算DFT子程序 ****************************/

dft:

/*dft子程序*/

B8=sine;/*将sine放到I8基址,并设定循环基址*/

L8=@sine;

B9=sine;/*Cos表的循环基址*/

I9=sine+N/4;/*通过sine+N/4得到cos放到I9基址*/

L9=@sine;/*循环长度.*/

I10=0;/*用来调整M8的步长*/

L10=0;

F15=0;/*在每一外循环时,对F8、F9清0*/

LCNTR=N,DOouterUNTILLCE;/*外循环*/

F8=PASSF15,M8=I10;

F9=PASSF15,F0=DM(I0,M1),F5=PM(I9,M8);

/*上二句是清F5、F9寄存器,设定M8步长,并读取X(n)和COS值*/

F12=F0*F5,F4=PM(I8,M8);

LCNTR=N-l,DOinnerUNTILLCE;/*内循环*/

F13=F0*F4,F9=F9+F12,F0=DM(I0,M1),F5=PM(I9,M8);

inner:

F12=F0*F5,F8=F8-F13,F4=PM(I8,M8);

F13=F0*F4,F9=F9+F12;/*F8中放虚部值,F9中放实部值*/

F8=F8-F13,DM(I2,M1)=F9;/*存实部值*/

MODIFY(I10,M9);/*使旋转因子表的寻址步长加一*/

outer:

DM(I1,M1)=F8/*存虚部值*/

RTS;

/*********求模计算的子程序 ****************************/

modl:

I0=real;

L0=0;

I1=imag;

L1=0;

I8=modul;

L8=0;

F2=DM(I0,M1);

F6=F2;

F3=DM(I1,M1);

F7=F3;

F8=F2*F6;

F13=F3*F7;

LCNTR=N,DOmod_calUNTILLCE;

F8=F2*F6,F13=F8+F13,F3=DM(I1,M1);

F4=RSQRTSF13,F7=F3;

F4=F4*F13,F2=DM(I0,M1);

F13=F3*F7,F6=F2;

mod_cal:

PM(I8,M9)=F4;

NOP;

NOP;

RTS;

2.实验步骤

1)调入程序

启动运行VisualDSP++,建立新工程,将位于将DSP_exp\float\unit_2\DFT_MOD目录下的源文件(dft_mod.asm和dft_mod.ldf)添加到工程中,同时也将备用的数据文件square64.dat、sin64.dat、trig64.dat、noise64.dat以及初始化文件zeros64.dat加入工程中。

2)选择输入数据文件

编译程序前,在下述程序行中将输入数据文件改为square64.dat:

.VARinput[N]="square64.dat";

其中square64.dat为方波信号。

3)编译程序

分析、理解源程序,在此基础上再编译运行程序。

可通过点击按钮命令或选择菜单命令\Project\BuildProject来完成编译。

本程序的sessions为ADSP-21062ADSP-2106xSimulator。

4)观察结果

∙程序调试时,可在程序中设置多个断点,来观察输入数据x、输出数据的实部real、输出数据的虚部imag和求模后的数据mudul的值;

∙打开Memory\TwoColumn窗口,在窗口中用鼠标右键点击,在弹出的菜单中选择用浮点数(FloatingPoint32bit)格式显示数据。

∙单步执行时,就可看到寄存器和内存单元中动态的数据变化。

5)改变数据再运行

●数组input分别改变为数据文件trig64.dat(三角波)、niose64.dat(高斯白噪声),重复3),4),来考察程序的执行结果。

3.典型实验结果

    图7.21三角波及其DFT变换后的幅度谱

图7.22高斯白噪声及其DFT变换后的的幅度谱

4.实验要求

1)利用plot功能,观察输入数据x、输出数据的实部real、输出数据的虚部imag和求模后的modul的波形;

2)观察各种波形的DFT运算和求模运算的结果,比较并且说明不同输入数据对应的DFT运算输出和求模运算输出的结果;

3)在实验报告中记录square64的DFT输入和输出数据及其波形,并利用数字信号处理课程所学知识分析结果。

7.3.3练习三——时域相关计算

1.程序说明

本练习三完成序列的自相关计算。

目的是使学生加深对相关处理的理解。

这是一个较简单的计算输入序列的相关程序。

输入序列分别写入到几个文件中。

程序编译运行时将数据读入存储器中,并对其进行相关运算,计算结果存放于输出缓冲区中。

1.程序说明

设输入数据X的长度为M,Y的长度为N,则程序按照因果系统计算相关运算:

卷积和相关运算有相似性,因此练习三的程序代码与练习一相比,其主程序是基本相同,不同的是练习一的计算子程序完成卷积运算,而练习三的计算子程序完成相关运算。

程序中一个输入序列X指定到数组inputx中,另一个输入序列Y指定到数组inputy中,相关的输出指定到数组output中。

根据相关原理,两个输入序列长度为M=N=64,输出序列长度为M+N-1=127。

程序主要由主程序和相关子程序(位于pm_code段中)二个模块组成。

在主程序中,先将输入数组X复制到输出数组的后半部分,然后调用相关子程序relate计算卷积。

卷积计算子程序中,将计算按照输出长度分成两段完成,在程序中利用left和right两个二重循环实现。

Left循环计算m=0~N-1,right循环计算m=N~N+M-1。

在计算卷积时,序列X采用正常序寻址,利用指令F5=DM(I9,M9)读取X(k),其中地址增量寄存器M9=1,开始计算时寄存器I9指向序列X的第一个元素。

而序列Y也是正常序寻址,利用指令F0=DM(I1,M1)读取Y(m+k),其中地址增量寄存器M2=1,开始计算时寄存器I1指向序列Y的第一个元素。

下面是练习三的计算子程序:

/******************** 计算时域相关性的子程序 ********************/

relate:

I2=output;

M1=1;

M9=1;

F15=0;/*用于给累加器清零*/

/*下面的left循环计算前面LENGTH_X个相关数据*/

LCNTR=LENGTH_X,DOleftUNTILLCE;

I9=I2;

I1=inputy;/*指向inputy*/

F9=PASSF15,F0=DM(I1,M1),F5=PM(I9,M9);

LCNTR=LENGTH_Y,DOinner1UNTILLCE;

F13=F0*F5;

inner1:

F9=F9+F13,F0=DM(I1,M1),F5=PM(I9,M9);

/*F0=数组inputy,F5=数组inputx*/

left:

DM(I2,M1)=F9;/*存储计算结果,I2递增*/

/*下面的right循环计算后面LENGTH_Y-1个相关数据*/

R1=LENGTH_Y;/*内循环次数计数器*/

LCNTR=LENGTH_Y-1,DOrightUNTILLCE;

I9=I2;

I1=inputy;/*指向inputy*/

R1=R1-1;/*内循环次数递减*/

F9=PASSF15,F0=DM(I1,M1),F5=PM(I9,M9);

LCNTR=R1,DOinner2UNTILLCE;

F13=F0*F5;

inner2:

F9=F9+F13,F0=DM(I1,M1),F5=PM(I9,M9);

/*F0=数组inputy,F5=数组inputx*/

right:

DM(I2,M1)=F9;/*存储计算结果*/

RTS;

2.实验步骤:

1)调入程序

启动运行VisualDSP++,运行菜单命令\Project\New来新建一个工程,工程名称自定义,正确设置工程的各个选项,将DSP_exp\float\unit_2\Corr目录下的源文件加入到工程中,同时也将备用的数据文件square64.dat、noise64.dat、sin64.dat、trig64.dat加入到工程中。

2)选择输入数据文件

编译程序前,在下述程序行中将输入数据文件改为squre64.dat:

.VARinputx[LENGTH_X]="squre64.dat";

.VARinputy[LENGTH

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

当前位置:首页 > 农林牧渔 > 林学

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

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