当前位置:范文大全 > 公文范文 > 武汉理工基于fir高通滤波器DSP综合报告

武汉理工基于fir高通滤波器DSP综合报告

发布时间:2021-10-23 14:08:22

武汉理工基于fir的高通滤波器DSP综合报告 本文关键词:滤波器,高通,武汉理工,报告,综合

武汉理工基于fir的高通滤波器DSP综合报告 本文简介:摘要DSP技术一般指将DSP处理器用于完成数字信号处理的方法与技术。目前的DSP芯片以其强大的数据处理功能在通信和其他信号处理领域得到广泛注意并已成为开发应用的热点技术。主要应用是实时快速的实现各种数字信号处理算法,如卷积及各种变换等。其中利用DSP来实现数字滤波器就是很重要的一种应用,本文深入研究

武汉理工基于fir的高通滤波器DSP综合报告 本文内容:

DSP

技术一般指将

DSP

处理器用于完成数字信号处理的方法与技术。目前的

DSP

芯片

以其强大的数据处理功能在通信和其他信号处理领域得到广泛注意并已成为开发应用的热

点技术。主要应用是实时快速的实现各种数字信号处理算法,如卷积及各种变换等。其中

利用

DSP

来实现数字滤波器就是很重要的一种应用,本文深入研究

DSP

芯片的滤波器系统

软件实现方法,用窗口设计法实现

FIR

滤波器,实验结果表明滤波结果效果良好,达到了

预期的性能指标。

一、实验目的一、实验目的

1.

掌握

FIR

数字滤波器的原理。

2

2..

掌握

FIR

数字滤波器的

DSP

实现方法。

二、实验原理二、实验原理

数字滤波器一直以来就是数字信号处理器最广为人知的应用。数字滤波器有别于模拟

滤波器的优点是:1)可重复设计,不需更改任何硬件电路的设计,就可以将一个低通滤

波器重新设计成一个高通滤波器。2)执行阶段可以直接更新滤波器的系数,形成适应性

滤波器。滤波器分成两种形态:有限长度脉冲响应(FIR)滤波器。FIR

指的是单一采样

响应的期间是有限长的,IIR

指的是单一采样响应的期间是无限长的。FIR

滤波器的特性

可以用一个差分方程来描述:

).2()2()

1()

1

()()0()(?????nxhnxhnxhny

其中是滤波器的系数。

.,,210

aaa

常用的滤波器有:低通、高通、带通及带阻滤波器。滤波器特性可以由很多的参数来决定,

这些参数包括带通涟波、带阻涟波、带通截止频率及带阻截止频率。在设计

FIR

滤波器

时,必须根据这些参数来确定

FIR

滤波器的系数及阶数。这个过程可以通过几种方法来完成。一是通过

Matlab

软件来

完成,二是通过专门的数字滤波器设计的软件包来完成。这一过程本实验不详述,本实验

假定该过程已经完成,并得到了滤波器的阶数及系数。

本设计是基于

FIR

算法的

dsp

高通滤波器的设计,采用DSP

芯片。其中采样频率为

64000HZ,高通滤波器的边界频率为

2000HZ,阶数为

101

阶。

三、算法设计

1.采用

MATLAB

设计

FIR

数字滤波器

采用

MATLAB

设计

FIR

数字滤波器的方法有多种,本实验采用

fir1

函数,使用方法简介如下:

设计高通滤波器,格式为:b=fir1(N,Wn,

‘high’)

其中

N+1

为滤波器阶数,b

为返回的长度为

N+1

的系数向量。Wn

为归一化边界频率,0

DARAM

.text:

{}

DARAM

.stack:

{}

DARAM

.sysstack:

{}

DARAM

.cinit:

{}

DARAM2

.pinit:

{}

DARAM2

.bss:

{}

DARAM2

.const:

{}

DARAM2

}

/*firhigh.cmd/

;

fir.asm

该程序用于实现

FIR

滤波器,可被

C

语言程序调用

;

int

fir(int,int,unsigned

int,int)

;

参数

0:

AR0

输入信号缓冲区指针

;

参数

1:

AR1

-

FIR

滤波器系数向量指针

;

参数

2:

T0

-

FIR

滤波器的阶数

L

;

参数

3:

T1

-

输入信号当前值在循环缓冲区的序数

;

返回值:

T0

-

输出信号当前值

.global

_fir

.def

_fir

_fir

pshm

ST1_55

;现场

ST1,ST2

ST3

入栈

pshm

ST2_55

pshm

ST3_55

or

#0x340,mmap(ST1_55)

;设置

FRCT,SXMD,SATD

bset

SMUL

;置位

SMUL

mov

mmap(AR0),BSA01

;AR0=输入信号循环缓冲区的起始地址

mov

mmap(AR1),BSA23

;AR1=滤波器系数循环缓冲区的起始地址

mov

mmap(T0),BK03

;设置循环缓冲区大小

or

#0x5,mmap(ST2_55)

;AR0

AR2

为循环缓冲区指针

mov

T1,AR0

;

AR0

index

偏移量开始

mov

#0,AR2

;

AR2

0

偏移量开始

sub

#2,T0

;T0=L-2

mov

T0,CSR

;设置外部循环次数为

L-1

mpymAR0+,*AR2+,AC0

;执行第一次运算

||

rpt

CSR

;启动循环

macmAR0+,*AR2+,AC0

mov

hi(AC0),T0

;

Q15

格式存放结果

popm

ST3_55

;

恢复

ST1,ST2

ST3

popm

ST2_55

popm

ST1_55

ret

.end

/*

main.c/

#include

“math.h“#define

Fs

64000

/*

采样频率/

#define

T

1/Fs

/*

采样时间/

#define

f1

500

/*

正弦信号

1

频率/

#define

f2

2500

/*

正弦信号

2

频率/

#define

f3

3300

/*

正弦信号

3

频率/

#define

PI

3.1415926

#define

w1

(2*PI*f1*T)

/*

正弦信号

1

数字频率=2*pi*f1/Fs/

#define

w2

(2*PI*f2*T)

/*

正弦信号

2

数字频率=2*pi*f2/Fs/

#define

w3

(2*PI*f3*T)

/*

正弦信号

3

数字频率=2*pi*f3/Fs/

#define

a1

0.333

/*

正弦信号

1

幅度/

#define

a2

0.30

/*

正弦信号

2

幅度/

#define

a3

0.30

/*

正弦信号

3

幅度/

extern

int

fir(int,int,unsigned

int,int

);

/*

Low-pass

FIR

filter

coefficients/

int

coeff[101]={

6,3,0,-4,-8,-13,-19,-25,-31,-38,-44,-49,-52,-53,-51,-45,-34,-20,0,24,53,85,120,155,189,221,247,266,274,270,251,216,163,91,0,-110,-238,-381,-538,-705,-879,-1055,-1229,-1397,-1554,-1695,-1817,-1915,-1988,-2033,30713,-2033,-1988,-1915,-1817,-1695,-1554,-1397,-1229,-1055,-879,-705,-538,-381,-238,-110,0,91,163,216,251,270,274,266,247,221,189,155,120,85,53,24,0,-20,-34,-45,-51,-53,-52,-49,-44,-38,-31,-25,-19,-13,-8,-4,0,3,6

};

int

in[101];

/*

input

buffer/

int

out[101];

/*

Output

buffer/

main()

{

unsigned

int

L=101;

unsigned

int

i;

float

signal;

unsigned

int

n=0;

int

index=0;

for(i=0;i2

以后,y[k]能用

y[k-1]和

y[k-2]算出,这是一个递归的差分方程。式中

,2cos2cos(2*/)

s

ATnff???

1B

?

?

sinsin(2*/)

s

CTnff???

fs

为采样频率,f

为正弦波频率。A

为正弦波幅度。可见用数字频率振荡器产生正弦波的实质就

是用程序实现上述的递归差分方程。

如要产生振荡器的频率为

2kHz

正弦波,设采样速率为

40k,通过定时器设置,每隔

25us

中断一

次,即产生一个

y[n]。则递归差分方程系数为:

2cos2cos(2**/)

s

ATff????2cos(2**2000/40000)2*0.95105652???

B=-1

sinsin(2**/)sin(2**2000/40000)0.30901699

s

CTff???????

为了便于定点

DSP

处理,将所有系数除以

2,然后用

16

位定点格式表示为:

A=79bcH,B=C000H,C=13c7H,这便是产生

2kHz

正弦信号的三个系数。

主程序初始化时先计算出

y[1]和

y[2],然后开放定时器中断,以后每次进入定时器中断服务程序

时,利用前面计算出的

y[1]和

y[2]计算出新的

y。

初始化

y[1]和

y[2]

SSBX

FRCT

;置

FRCT=1,准备进行小数乘法运算

ST

#0x79BC,AA

;将常数装入变量

AA

ST

#0xC000H,BB

;将常数装入变量

BB

ST

#0x13C7H,CC;将常数装入变量

CC

PSHD

CC

;将

CC

压入堆栈

POPD

Y2

初始化

Y2=CC

LD

AA,T

AA

装到

T

寄存器

MPY

Y2,A

;Y2

乘以系数

A,结果放入

A

寄存器

STH

A,Y1

;将

A

寄存器的高

16

位存入变量

Y1

;中断服务程序段:

LD

BB,T

;将系数

B

装入

T

寄存器

MPY

Y2,A

;Y2

乘系数

B,结果放入

A

寄存器

LTD

Y1

;将

Y1

装入

T

寄存器,同时复制到

Y2

MAC

AA,A

;完成新正弦数据计算,A

寄存器

;中为

Y1*AA+Y2*BB

STH

A,1,Y1

;将新数据存入

Y1,因所有系数都

;除过

2,在保存结果时转移一位,

;恢复数据正常大小

STH

A,1,Y0

;将新正弦数据存入

Y0

VC5402

的片内定时器利用

CLKOUT

时钟计数,用三个寄存器(TIM、PRD、TCR)来控制定时器。到

定时器实际上可以有

20

个比特的周期寄存器。它对

CLKOUT

信号计数,先将

PSC

1,直到

PSC

0,然后用

TDDR

重新装入

PSC,同时将

TIM

1,直到

TIM

减为

0。这时

CPU

发出

TINT

中断,同时在

TOUT

引脚输出一个脉冲信号,脉冲宽度为

CLKOUT

一致。然后用

PRD

重新装入

TIM,重复下去直到系

统或定时器复位。因而定时器中断的频率由下面的公式决定:

TINT

的频率=,其中

tc表示

CLKOUT

的周期。设置

PRD

寄存器值为

??

??11

1

????PRDTDDRtc

12499,TINT

中断频率为

40kHz。

定时器初始化程序段为:

STM

#10H,TCR

;停止定时器

STM

#2499H,PRD;设置PRD

寄存器值为2499,

;TINT

中断频率为Foutclk

=(2499+1)=

100MHz/2500

=

40

kHz

STM

#20H,TCR

;重新装入TIM

和PSC,然后;

;启动定时器,在开放中断屏蔽寄存器IMR后,就可以产生频率为2000Hz的正弦波。

三、实验内容与步骤三、实验内容与步骤

1.使用

C54x

汇编语言实现数字振荡器,并通过

CCS

提供的显示窗口观察输出信号波形以及频谱。

2.根据确定数字振荡器的频率,确定系数。数字振荡器系数的确定在前面已经说明,

3.

启动

CCS,新建工程文件,如文件名为sinewave.pjt。并建立如下文件:

汇编源程序exer3.asm

.title

“for

test

INT

service

program

.(25

us)

“.mmregs

.global

_c_int00,_tint,vector

OFF_INTIMER

.set

04Ch

;

vector

of

INTtimer

at

VECTOR+OFF_INTIMER

INIT_A

.set

079bch

;

A/2=0.9510498

INIT_B

.set

0c000h

;

B/2=-0.5

INIT_C

.set

013c7h

;

C/2=0.1545105

.bss

y0,1

.bss

y1,1

.bss

y2,1

.bss

temp,1

.bss

AA,1

.bss

BB,1

.bss

CC,1

.text

_c_int00:

ld

#0,dp

ssbx

intm

;

disable

all

interrupt

!

st

#1fffh,sp

ld

#vector,a

;

get

vector

table

address

!

and

#0FF80h,a

andm

#007Fh,pmst

or

pmst,a

stlm

a,pmst

;

设置IPTR

stm

#10h,TCR

;

init

TIMER

stm

#2499,PRD

;

f=100M/(2499+1)=40kHz

stm

#20h,TCR

;

reset

TIMER

ldm

IMR,a

;

read

back

IMR

or

#08h,a

;

enable

TIMER

interrupt

stlm

a,IMR

;

set

IMR

ld

#temp,dp

;

set

DP

ssbx

FRCT

;

prepare

for

fraction

mpy

st

#INIT_A,AA

;

init

AA,BB,CC

st

#INIT_B,BB

;

st

#INIT_C,CC

;

pshd

CC

popd

y2

;

init

y2,y2=CC

ld

AA,T

;

T=AA

mpy

y2,a

;

y2*AA

-

a

sth

a,y1

;

y2*AA

-

y1

stm

#0h,TCR

;

enable

TIMER

nop

rsbx

intm

;

enable

all

int

!

again:

nop

b

again

nop

nop

nop

nop

nop

nop

;-------------------------------------------------------------

;

interrupt

for

INT_TIMER

!

;-------------------------------------------------------------

_tint:

ld

#BB,DP

ld

BB,T

;

T=BB

mpy

y2,a

;

a=y2*BB

ltd

y1

;

T=y1,y2=y1

mac

AA,a

;

a=a+y1*AA

sth

a,1,y1

;

new

cos

data

-

y1

sth

a,1,y0

;

new

cos

data

-

y0

nop

;

set

breakpoint

in

CCS

!!!

int1_end:

nop

rete

.end

vec_table.asm文件

.mmregs

.ref

_ret

.ref

_c_int00

.ref

_tint

.global

vector

.sect“.int_table“;--------------------------------------------------------------------

;

interrupte

vector

table

!

;--------------------------------------------------------------------

vector:

rs

b

_c_int00

nop

nop

nmi

b

__ret

nop

nop

sint17

b

__ret

nop

nop

sint18

b

__ret

nop

nop

sint19

b

__ret

nop

nop

sint20

b

__ret

.word

0,0

sint21

b

__ret

.word

0,0

sint22

.word

01000h

.word

0,0,0

sint23

.word

0ff80h

.word

0,0,0

sint24

.word

01000h

.word

0,0,0

sint25

.word

0ff80h

.word

0,0,0

sint26

.word

01000h

.word

0,0,0

sint27

.word

0ff80h

.word

0,0,0

sint28

.word

01000h

.word

0,0,0

sint29

.word

0ff80h

.word

0,0,0

sint30

.word

01000h

.word

0,0,0

int0

b

__ret

nop

nop

int1

b

__ret

nop

nop

int2

b

__ret

nop

nop

tint

b

_tint

nop

nop

brint0

b

__ret

nop

nop

bxint0

b

__ret

nop

nop

trint

b

__ret

nop

nop

dmac1

b

__ret

nop

nop

int3

b

__ret

nop

nop

hpint

b

__ret

nop

nop

q26

.word

0ff80h

.word

0,0,0

q27

.word

01000h

.word

0,0,0

dmac4

b

__ret

nop

nop

dmac5

b

__ret

nop

nop

q30

.word

0ff80h

.word

0,0,0

q31

.word

01000h

.word

0,0,0

;--------------------------------------------------------------------------

;

end

of

interrupte

vector

table

!

;-------------------------------------------------------------------------

__ret

rete

链接定位sinewave.cmd

MEMORY

{

PAGE

1:

INT_D:

ORIGIN=80h,LENGTH=1F80h

PAGE

0:

EXT_P:

ORIGIN=2000h,LENGTH=2000h

}

SECTIONS{

.text

:

EXT_P

PAGE

0

.int_table

:

(EXT_P

ALIGN

(128)

PAGE

(0))

.data

:

INT_D

PAGE

1

}

选择Project

菜单中的Add

File

to

Project

选项,将汇编源程序exer3.asm、vec_table.asm

和连接

定位sinewave.cmd文件依次添加到工程文件中。注意,你可以在添加文件对话框中选择显示不同的文

件类型来加快文件选择速度。你也可以使用鼠标右键单击工程文件名(如sinewave.pjt)并选择Add

Files

项来添加需要的文件。其中,exer3.asm

包括初始化代码和中断服务程序,而vec_talbe.asm

包含中断向量表。

4.

完成编译、连接,正确生成OUT文件。然后使用File

菜单的“Load

Program”选项,将生成的OUT

文件装入DSP

的片内存储器。这时CCS

将显示程序的启始地址_c_int00。

5.

View→Graph→Time/Frequency…打开图形显示设置窗口。在弹出的对话框中按图4.1设置,

图图4.14.1

图形属性设置图形属性设置

主要修改“Start

Address”为y0(y0为生成的正弦波输出变量);“Acquisition

Buffer

Size”为1,“DSP

Data

Type”为“16-bit

signed

integer”。

6.

在汇编源程序的中断服务程序(_tint)中的“nop”语句处设置断点。选择Debug→Animate,运行

程序,观察输出波形。数一数一个周期的正弦波有多少个点?算算频率是否是2kHz?另外,想想Run

和Animate

两种运行方式的区别?

7.

用右键单击图形显示窗口,并选择“Proporties”项以便修改显示属性。将“DisplayType”项改

为“FFT

Magnitude”以便显示信号频谱。修改“Sampling

Rate(Hz)”项为40000,然后退出。注意观

察生成的正弦波频率。

四、实验报告要求四、实验报告要求

1、简述实验目的;

2、简述

DSP

定时器的基本工作原理;

3、调试实验内容,得到相应结果,分析在调试过程中出现的问题,并如何解决问题。

五、思考题五、思考题

1.本实验程序产生了一个

2kHz

的正弦信号,请修改程序,产生一个频率相同的余弦信号。为了

验证产生的COS

信号,可以同时生成SIN

和COS

信号,然后在两个图形窗口中显示波形。它们应该正

好相差π/2

相位。

2.

重新设计和实现一个数字振荡器,采样频率改为为

20KHz,输出正弦信号的频率为

4KHz。

版权所有:蓬勃范文网 2010-2024 未经授权禁止复制或建立镜像[蓬勃范文网]所有资源完全免费共享

Powered by 蓬勃范文网 © All Rights Reserved.。蜀ICP备20021444号