数字信号处理实验报告实验五

时间:2024.3.31

物理与电子信息工程学院

实验报告

实验课程名称:数字信号处理

实验名称: FIR数字滤波器设计与软件实现  

班    级: 1012341 

姓    名:严娅     

学    号: 101234153  

成    绩:_______    

实验时间: 20121220  


一、实验目的

(1)掌握用窗函数法设计FIR数字滤波器的原理和方法。

(2)掌握用等波纹最佳逼近法设计FIR数字滤波器的原理和方法。(3)掌握FIR滤波器的快速卷积实现原理。

(4)学会调用MATLAB函数设计与实现FIR滤波器。

二、实验原理

1、用窗函数法设计FIR数字滤波器的原理和方法。

如果所希望的滤波器的理想频率响应函数为 ,则其对应的单位脉冲响应为

    =         (2-1)

窗函数设计法的基本原理是用有限长单位脉冲响应序列逼近。由于往往是无限长序列,且是非因果的,所以用窗函数截断,并进行加权处理,得到:

                (2-2)

就作为实际设计的FIR数字滤波器的单位脉冲响应序列,其频率响应函数为:

             (2-3)

式中,N为所选窗函数的长度。

由第七章可知,用窗函数法设计的滤波器性能取决于窗函数的类型及窗口长度N的取值。设计过程中,要根据对阻带最小衰减和过渡带宽度的要求选择合适的窗函数类型和窗口长度N。各种类型的窗函数可达到的阻带最小衰减和过渡带宽度见第七章。

这样选定窗函数类型和长度N后,求出单位脉冲响应·,并按式(2-3)求出是否满足要求,要进行验算。一般在尾部加零使长度满足于2的整数次幂,以便用FFT计算。如果要观察细节,补零点数增多即可。如果不满足要求,则要重新选择窗函数类型和长度N,再次验算,直至满足要求。

如果要求线性相位特性,则还必须满足

            (2-4)

根据上式中的正负号和长度N的奇偶性又将线性相位FIR滤波器分成四类。要根据设计的滤波特性正确选择其中一类。例如,要设计线性低通特征,可选择一类,而不能选一类。

2、等波纹最佳逼近法

   等波纹最佳逼近法是一种优化设计法,它克服了窗函数设计法和频率采样法的缺点,使最大误差(即波纹的峰值)最小化,并在整个逼近频段上均匀分布。用等波纹最佳逼近法设计的FIR数字滤波器的幅频响应在通带和阻带都是等波纹的,而且可以分别控制通带和阻带波纹幅度。这就是等波纹的含义。最佳逼近是指在滤波器长度给定的条件下,使加权误差波纹幅度最小化。与窗函数设计法和频率采样法比较,由于这种设计法使滤波器的最大逼近误差均匀分布,所以设计的滤波器性能价格比最高。阶数相同时,这种设计法使滤波器的最大逼近误差最小,即通带最大衰减最小,阻带最小衰减最大;指标相同时,这种设计法使滤波器阶数最低。实现FIR数字滤波器的等波纹最佳逼近法的MATLAB信号处理工具函数为remez和remezord。Remez函数采用数值分析中的remez多重交换迭代算法求解等波纹最佳逼近问题,求的满足等波纹最佳逼近准则的FIR数字滤波器的单位脉冲响应h(n)。

三、实验内容及步骤

   (1)调用信号产生函数xtg产生具有加性噪声的信号xt,并自动显示xt及其频谱,如图10.5.1所示;

图10.5.1 具有加性噪声的信号x(t)及其频谱如图

   (2)设计滤波器,从高频噪声中提取xt中的单频调幅信号,要求信号幅频失真小于0.1dB,将噪声频谱衰减60dB。根据窗函数设计滤波器原理设计滤波器,根据滤波器指标选择合适的窗函数,计算窗函数的长度N,调用MATLAB函数fir1设计一个FIR低通滤波器。并编写程序,调用MATLAB快速卷积函数fftfilt实现对xt的滤波。绘图显示滤波器的频响特性曲线、滤波器输出信号的幅频特性图和时域波形图。

   (3)改用等波纹最佳逼近法设计滤波器,滤波器指标不变,调用MATLAB函数remezord和remez设计FIR数字滤波器。并比较两种设计方法设计的滤波器阶数和滤出来的波形效果。

(4)修改程序:将步骤(2)中用窗函数设计的低通滤波器参数改为fp=100; fs=110,单独滤出上边带频谱线,并绘制波形图,

(5)修改程序:将步骤(3)中用等波纹设计的低通滤波器改为带通滤波器,单独滤出下边带频谱线,根据带通滤波器的参数选取通、阻带截止频率,带通滤波器的设计指标为:

fsl=95;fpl=105; fpu=115;fsu=125;

fb=[fsl,fpl,fpu,fsu];m=[0,1,0];

dev=[10^(-As/20),(10^(Rp/20)-1)/(10^(Rp/20)+1),10^(-As/20)]

并绘制波形图。

四、实验程序清单

   1.信号产生函数xtg程序清单

function xt=xtg(N)

%实验五信号x(t)产生,并显示信号的幅频特性曲线

%xt=xtg(N) 产生一个长度为N,有加性高频噪声的单频调幅信号xt,采样频率Fs=1000Hz

%载波频率fc=Fs/10=100Hz,调制正弦波频率f0=fc/10=10Hz.

Fs=1000;T=1/Fs;Tp=N*T;

t=0:T:(N-1)*T;

fc=Fs/10;f0=fc/10; %载波频率fc=Fs/10,单频调制信号频率为f0=Fc/10;

mt=cos(2*pi*f0*t);  %产生单频正弦波调制信号mt,频率为f0

ct=cos(2*pi*fc*t);  %产生载波正弦波信号ct,频率为fc

xt=mt.*ct;          %相乘产生单频调制信号xt

nt=2*rand(1,N)-1;   %产生随机噪声nt

%设计高通滤波器hn,用于滤除噪声nt中的低频成分,生成高通噪声

fp=150; fs=200;Rp=0.1;As=70;  % 滤波器指标

fb=[fp,fs];m=[0,1];   % 计算remezord函数所需参数f,m,dev

dev=[10^(-As/20),(10^(Rp/20)-1)/(10^(Rp/20)+1)];

[n,fo,mo,W]=remezord(fb,m,dev,Fs); % 确定remez函数所需参数

hn=remez(n,fo,mo,W);    % 调用remez函数进行设计,用于滤除噪声nt中的低频成分

yt=filter(hn,1,10*nt);      %滤除随机噪声中低频成分,生成高通噪声yt

%======================================================

xt=xt+yt;           %噪声加信号

fst=fft(xt,N);k=0:N-1;f=k/Tp;

subplot(2,1,1);plot(t,xt);grid;xlabel('t/s');ylabel('x(t)');

axis([0,Tp/5,min(xt),max(xt)]);title('(a) 信号加噪声波形')

subplot(2,1,2);plot(f,abs(fst)/max(abs(fst)));grid;title('(b) 信号加噪声的频谱')

axis([0,Fs/2,0,1.2]);xlabel('f/Hz');ylabel('幅度')

   2、实验程序清单

   %《数字信号处理(第三版)学习指导》第10章实验5程序exp5.m

   % FIR数字滤波器设计及软件实现

   clear all;close all;

%调用xtg产生信号xt, xt长度N=1000,并显示xt及其频谱

   N=1000;xt=xtg(N);

   fp=120; fs=150;Rp=0.2;As=60;Fs=1000;   % 输入给定指标

   % (1) 用窗函数法设计滤波器============================

   wc=(fp+fs)/Fs;    %理想低通滤波器截止频率(关于pi归一化)

   B=2*pi*(fs-fp)/Fs;  %过渡带宽度指标

   Nb=ceil(11*pi/B);    %blackman窗的长度N

   hn=fir1(Nb-1,wc,blackman(Nb));

   Hw=abs(fft(hn,1024)); % 求设计的滤波器频率特性

   ywt=fftfilt(hn,xt,N);   %调用函数fftfilt对xt滤波

   %以下为用窗函数法设计法的绘图部分====

subplot(2,1,1);    %绘制低通滤波器幅频特性曲线

myplot(hn,1);     

title('(a)低通滤波器幅频特性');

subplot(2,1,2);     %绘制滤除噪声后的信号波形

yt='y_w(t)';        

tplot(ywt,T,yt);

title('滤除噪声后的信号波形')

% (2) 用等波纹最佳逼近法设计滤波器=====================

   fb=[fp,fs];m=[1,0];    % 确定remezord函数所需参数f,m,dev

   dev=[(10^(Rp/20)-1)/(10^(Rp/20)+1),10^(-As/20)];

   [Ne,fo,mo,W]=remezord(fb,m,dev,Fs); % 确定remez函数所需参数

   hn=remez(Ne,fo,mo,W);    % 调用remez函数进行设计

   Hw=abs(fft(hn,1024));    % 求设计的滤波器频率特性

   yet=fftfilt(hn,xt,N);       % 调用函数fftfilt对xt滤波

%以下为用等波纹设计法的绘图部分=================

subplot(2,1,1);        %绘制低通滤波器幅频特性曲线

myplot(hn,1);

title('(a)低通滤波器幅频特性');

subplot(2,1,2);         %绘制滤除噪声后的信号波形

yt='y_w(t)';

tplot(ywt,T,yt);

title('滤除噪声后的信号波形')

五、实验程序运行结果

  用窗函数法设计滤波器,滤波器长度 Nb=184。滤波器损耗函数和滤波器输出yw(nT)分别如图10.5.2(a)和(b)所示。

   用等波纹最佳逼近法设计滤波器,滤波器长度 Ne=83。滤波器损耗函数和滤波器输出ye(nT)分别如图10.5.2(c)和(d)所示

图10.5.2

图10.5.2

用窗函数法设计低通滤波器滤出上边带频谱滤波器损耗函数和滤波器输出yw(nT)分别如图10.5.3(a)和(b)所示。

用等波纹最佳逼近法设计带通滤波器滤出下边带频谱滤波器损耗函数和滤波器输出yw(nT)分别如图10.5.3(c)和(d)所示。


图10.5.3

六、实验心得及体会

   1、通过本次实验我学会了调用MATLAB函数设计和实现FIR数字滤波器,理解了窗函数法设计FIR数字滤波器的原理,和等波纹最佳逼近法设计FIR数字滤波器的原理和方法。

   2、FIR数字滤波器和IIR数字滤波器的设计方法有很大差别,IIR数字滤波器的设计方法是利用模拟滤波器成熟的理论和设计图表进行设计的,只考虑了幅频特性,没考虑到相位特性,所设计的一般是某种特定的非线性相位特性。而FIR数字滤波器在保证幅频特性满足技术要求的同时,很容易做到有严格的线性相位特性。

  3、窗函数法和等波纹最佳逼近法这两种方法设计的滤波器都能有效地从噪声中提取信号,用等波纹最佳逼近法设计的滤波器,其通带和阻带均为等波纹特性,且通带最大衰减和阻带最小衰减可以分别控制,所以其指标均匀分布,没有资源浪费,所以期阶数低得多,当然滤波实现的运算量以及时延也小得多,从图10.5.2(b)和(d)可以直观地看出时延差别。

 


第二篇:dsp实验报告五


DSP 实 验 报 告

(实验五)

班级:

学号:

姓名:

 

实验五 混合编程

一、实验目的

1. 学习使用实时运行库;

2. 熟悉用C和汇编混合编程的方法;

3. 掌握混合编程的调试方法。

 

二、实验环境

1. 集成开发环境Code Composer Studio 2.0(简称CCS)

2. 实验程序mix.c,mix.h(由程序自动加载,可不加,后同),mix.cmd,addfun.s54,rts.lib(有C的混合编程需要有库文件),c5402.gel(要有,有C的混合编程要用gel初始设置。选芯片时设置已自带,可不添加;如无则加)

三、实验步骤

1. 改设置:Build option子菜单linker中Basic项Autoinit Model 改为load-time Initialization或Run-time Initialization(不同的设置,SP初始值将不同。No Initialization也可以,但效果不如前两个好)。

2. 为使效果更明显,屏蔽前两条printf( )语句(可与第三条对比,编译后将出现警告,可忽略),编译项目文件得到.out程序。另外装载程序前,在Edit->Memory->Fill中,对Data Memory从0x0000到0xFFFF用全0x1111或0x2222等填充(注意:填充后必须对Gel文件重新Load一次)。然后装载程序,了解在混合编程环境下变量、函数的定义方法以及项目文件的编译方法。

3. 打开View Memory,用SP值(Debug_>Go main后的值)作为开始察看地址,从主程序main开始用Single Step方式调试程序,观察程序的执行过程。尤其是在C程序中调用汇编子函数以及返回的过程,注意当前SP和PC的变化。

4. 看懂代码,比较结果,并画出程序流程图;

四、实验结果

1、从主程序main开始用Single Step方式调试程序,观察程序的执行过程。尤其是在C程序中调用汇编子函数以及返回的过程,观察到当前SP和PC的变化为:

PC从地址0X0000205D一直进行自加,单步执行一次就加1;SP值在从main开始就一直保持0X0C86保持不变,直到return语句执行完后才变为0X0C9D,跳出主程序后SP值开始自减执行push语句,执行完后,紧接着在执行POP时继续进行自加。执行过程如下:

开始执行Goto main:

执行return后:

由此可见:PC值反映当前执行地址值;SP值只有在调用PUSH或POP等语句时才发生相应的变化。

2、程序分析及流程图:

#include <stdio.h>

#include "mix.h"

int mix_func_c(int *wl, int *wr, int val)  //定义求数组最小值的子函数;

{

       int i, val_min, tmp[8];   //定义变量

       for(i=0; i<8; i++)

              tmp[i] = wl[i] * wr[i];   //两数相乘

       val_min = val;        //置初值,设定val_min最小值为val即100

       for(i=0; i<8; i++)      //比较,求出两数相乘后乘积的最小值

       {     

              if(val_min>tmp[i])

                     val_min = tmp[i];

       }

              return val_min;

}

void main()        //执行主函数

{      int val, i, wl[8], wr[8];

       int min_asm, min_c;

       //register setting       //C中嵌套ASM语言

       asm("     stm        #0, SWWSR");

       asm("     stm        #0x00A0, PMST");

//    min_asm=1900;

//    min_c=2000;

       //call system function

       val = -100;        //定义val值

       val = abs(val);

       printf("val = %d\n", val);  

       //call asm function

       for(i=0; i<8; i++)     //对wl与wr数组赋初值

       {

              wl[i]=i;

              wr[i]=2*i+1;

       }

       min_asm = mix_func(wl, wr, val);  //调用混合编程程序,在C中映射汇编

       printf("val = %d\n", min_asm);      

       min_c = mix_func_c(wl, wr, val);   //在C函数中输出C

       printf("val = %d\n", min_c);    

       return;

五、实验结果分析

1. 实时运行库

实时运行库提供了标准C中的大部分函数,帮助建立C语言的环境,同时也提供一些基本的调试手段,如printf( )等。

2. 程序接口

参数传递是混合编程中非常重要的一部分:第一个参数放置在寄存器A中,其他参数按照逆序压入堆栈;返回的数据放置在寄存器A中。

3. 局部数据

局部数据是在堆栈中开设的,程序返回前消除。

4. 关于堆栈保护

在子程序addfun中,由于需要改变ST1中的数值,所以在子程序入口处先用语句pshm   ST1  ; ST1的值在堆栈中保护起来;

在子程序返回前,再用语句popm  AR1  ;恢复ST1原来的值。

注:例程见目录 \\ 71_mix.

mix.cmd中段设置说明:

1.  The .cinit section contains tables for initializing variables and constants.

2.  The .const section contains string constants and data defined with the C/C++ qualifier const (provided the constant is not also defined as volatile).

3.  The .text section contains all the executable code as well as string literals and compiler-generated constants.

4.  The .bss section reserves space for global and static variables. When you specify the -c linker option, at program startup, the C/C++ boot routine copies data out of     the .cinit section (which can be in ROM) and stores it in the .bss section.

5.  The .data section is normally used to contain tables of data or preinitialized variables.

六、实验心得体会

本次实验目的是我们通过研究一个程序代码学习使用实时运行库、熟悉用C和汇编混合编程的方法;并掌握混合编程的调试方法。

在上课的时候,老师就告诉我们关于混合编程的几种方法,当时由于时间有限,老师只是简单的叙述了这几种方法,记忆力不好,所以做的过程中很吃力,在助教和同学的帮助下,最后成功的完成了本次实验。

    本次实验,让我对DSP的混合编程有了更深刻的理解,更加熟练的使用DSP这个软件,让我受益匪浅。

更多相关推荐:
数字信号处理实验报告

南京信息工程大学数字信号处理实验报告学院:电子与信息工程学院班级:11通信1班学号:XXX姓名:XX指导教师:XX20XX/12/6实验一Matlab基本知识和信号处理工具箱一、实验目的1、了解Matlab的基…

数字信号处理实验报告 - 1

数字信号处理第一次实验报告学院:信息工程学院专业:电子信息工程二班学号:***姓名:实验一:系统响应及系统稳定性1.实验目的(1)掌握求系统响应的方法。(2)掌握时域离散系统的时域特性。(3)分析、观察及检验系…

数字信号处理实验报告

数字信号处理实验报告专业电子信息工程学号111308336姓名张强伟实验一数字滤波器的结构一实验目的1加深对数字滤波器分类与结构的了解2明确数字滤波器的基本结构及其相互间的转换方法3掌握用MATLAB进行数字滤...

数字信号处理实验报告

北京信息科技大学实验报告课程名称数字信号处理实验项目IIR数字滤波器设计实验仪器计算机MATLAB软件学院信息与通信工程学院班级姓名学号实验日期指导老师实验成绩实验二IIR数字滤波器设计一实验目的1熟悉用双线性...

数字信号处理实验报告一

西南大学学生实验报告姓名杨剑学号2220xx3220xx058班级1班专业电科实验日期20xx年9月29日实验学时2学时实验名称基本信号的产生和序列的基本运算实验目的学习使用MATLAB产生基本信号绘制信号波形...

哈工大 数字信号处理实验报告

实验一用FFT作谱分析实验目的1进一步加深DFT算法原理和基本性质的理解因为FFT只是DFT的一种快速算法所以FFT的运算结果必然满足DFT的基本性质2熟悉FFT算法原理和FFT子程序的应用3学习用FFT对连续...

数字信号处理实验报告2

实验一序列的产生姓名高洪美学号0819xx9213班级生医5班一实验目的熟悉MATLAB中产生信号和绘制信号的基本命令二实验环境基于WindowsPC的MATLAB三实验内容1单位样本和单位阶跃序列2指数信号3...

数字信号处理实验报告

数字信号处理实验报告姓名学号0905130129专业班级通信工程1301班学院信息科学与工程学院指导老师李宏目录实验一常见离散时间信号的产生和频谱分析3一实验目的3二实验原理3三实验内容及要求6四实验用MATL...

数字信号处理实验报告

数字信号处理实验南京信息工程大学数字信号处理实验报告01学院电子与信息工程学院班级11通信1班学号20xx1334020姓名杨丹指导教师乔杰20xx1261数字信号处理实验目录实验一Matlab基本知识和信号处...

数字信号处理实验报告6

学院系名称计算机与通信工程学院实验报告

武汉科技大学《数字信号处理》实验报告三

信息科学与工程学院数字信号处理实验报告三专业班级姓名学号

数字信号处理实验报告——离散系统的差分方程、冲激响应和卷积分析

实验2离散系统的差分方程冲激响应和卷积分析实验目的加深对离散系统的差分方程冲激响应和卷积分析方法的理解实验原理离散系统其输入输出关系可用以下差分方程描述Nk0dkynkMk0pkxnkxnxmnm输入信号分解为...

数字信号处理实验报告(35篇)