首页 范文大全 古典文学 职场知识 中国文学 公文书信 外国名著 寓言童话 百家讲坛 散文/诗歌 美文欣赏 礼仪知识 民俗风情
  • 工作总结
  • 工作计划
  • 心得体会
  • 竞聘演讲
  • 会议发言
  • 爱国演讲
  • 就职演说
  • 开业开幕
  • 思想学习
  • 征文演讲
  • 经验材料
  • 述职报告
  • 调研报告
  • 工作汇报
  • 年终总结
  • 申报材料
  • 学习体会
  • 企划方案
  • 活动方案
  • 技巧经验
  • 模板范例
  • 思想宣传
  • 经济工作
  • 工作报告
  • 组织人事
  • 反腐倡廉
  • 慰问贺电
  • 先进事迹
  • 思想汇报
  • 入党申请书
  • 党会发言
  • 先进性教育
  • 入团申请书
  • 个人简历
  • 演讲稿
  • 调查报告
  • 实习报告
  • 和谐社会
  • 观后感
  • 读后感
  • 作文范文
  • 自我鉴定
  • 讲话稿
  • 自查报告
  • 武汉理工基于fir高通滤波器DSP综合报告

    时间:2021-03-04 12:07:24 来源:蒲公英阅读网 本文已影响 蒲公英阅读网手机站

    相关热词搜索:滤波器 高通 武汉理工

    武汉理工基于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。

    • 范文大全
    • 职场知识
    • 精美散文
    • 名著
    • 讲坛
    • 诗歌
    • 礼仪知识