基于dsp的 f.i.r低通滤波器设计

基于dsp的 f.i.r低通滤波器设计,第1张

题目:利用DSP的FIR滤波器设计

数字处理器(DSP)有很强的数据处理能力,它在高速数字信号处理领域有广泛的应用,例如数字滤波、音频处理、图像处理等。相对于模拟滤波器,数字滤波器没有漂移,能够处理低频信号,频率响应特性可做成非常接近于理想的特性,且精度可以达到很高,容易集成等。使用可编程的DSP芯片实现数字滤波可以通过修改滤波器的参数十分方便地改变滤波器的特性,下面主要说明利用TMS320VC54x DSP芯片设计实现FIR数字滤波器。

设计目的意义

一个实际的应用系统中,总存在各种干扰,所以在系统设计中,滤波器的好坏将直接影响系统的性能。使用DSP进行数字处理,可以对一个具有噪声和信号的混合信号源进行采样,再经过数字滤波,滤除噪声,就可以提取有用信号了。所以说,数字滤波器是DSP最基本的应用领域,熟悉基于DSP的数字滤波器能为DSP应用系统开发提供良好的基础。

技术指标

1、数字滤波器的频率参数主要有:①通带截频:为通带与过渡带的边界点,在该点信号增益下降到规定的下限。②阻带截频:为阻带与过渡带的边界点,在该点信号衰耗下降到规定的下限。③转折频率:为信号功率衰减到1/2(约3dB)时的频率,在很多情况下,也常以fc作为通带或阻带截频。④当电路没有损耗时,固有频率:就是其谐振频率,复杂电路往往有多个固有频率。

2、增益与衰耗

滤波器在通带内的增益并非常数。①对低通滤波器通带增益,一般指ω=0时的增益;高通指ω→∞时的增益;带通则指中心频率处的增益。②对带阻滤波器,应给出阻带衰耗,衰耗定义为增益的倒数。③通带增益变化量指通带内各点增益的最大变化量,如果通带增益变化量以dB为单位,则指增益dB值的变化量。

3、阻尼系数与品质因数

阻尼系数α是表征滤波器对角频率为ω0信号的阻尼作用,是滤波器中表示能量衰耗的一项指标,它是与传递函数的极点实部大小相关的一项系数。

4、灵敏度

滤波电路由许多元件构成,每个元件参数值的变化都会影响滤波器的性能。

5、群时延函数

在滤波器设计中,常用群时延函数评价信号经滤波后相位失真程度。

以上的几个技术指标是一般滤波器的特性,但在实际应用中,数字滤波器通常用来实现选频 *** 作,因此在利用DSP实现数字滤波器设计中要求的技术指标主要为在频域中给出的幅频响应和相频响应。如下图所示

幅频响应和相频响应特性曲线

对于幅频响应,它的含义是信号通过系统之后的输出信号的幅度与它输入时的信号的幅度的比值,一般以分贝值表示。对于相频响应,含义是信号通过系统之后的输出信号的相位与它输入时的信号的相位之差,在运用线性相频响应指标进行滤波器设计具有如下优点:①只包含实数算法,不涉及复数运算;②不存在延迟失真,只有固定数量的延迟;③可以采用FFT算法,从而提高运行效率;④由于FIR滤波器的单位脉冲响应是有限长序列,故FIR滤波器没有不稳定的问题,且误差较小。

基本原理

利用DSP实现FIR滤波器的设计方法主要有窗函数法和频率抽样法,其中窗函数法是基本的设计方法,这里采用窗函数法设计FIR滤波器。设希望得到的滤波器理想响应为 ,那么FIR滤波器的设计就在于寻找一个传递函数

去逼进 ,设

这里 就是傅立叶级数的系数。在这种逼近中,最直接的一种方法就是从单位脉冲响应 入手,使 逼近理想的单位脉冲响应 。由于 是一个无限长序列,因此,最简单的方法就是对 做截尾处理,即得到一个近似的传递函数

上式中,Q就是最终确定FIR滤波器的阶数,Q越大,近似程度就越高。对 截尾,实际上就是对 乘上一个矩形窗口 ,即

令z= ,则

其脉冲响应系数为 , ,…, , , ,…, , 。为使 具有因果性,延时Q个样值,可得:

令n+Q=k,上式成为

令 ,N=2Q,得

式中, 是脉冲响应系数,这里 …, ,…, 。

一般来说,FIR数字滤波器输出 的Z变换形式 与输入 的Z变换形式之间的关系如下:

实现结构如下图所示:

Z变换结构图

从上面的Z变换和结构图可以很容易得出FIR滤波器的差分方程表示形式,即对上式进行反Z变换得:

上式为FIR数字滤波器的时域表示方法,其中x(n)是在时间n的滤波器的输入抽样值,根据上式即可对滤波器进行设计。

硬件设计

1、DSP芯片

根据设计原理,实现的核心器件采用美国德州仪器公司生产的低功耗定点数字信号处理器芯片TMS320C5402。选择该芯片主要是因为它是目前最常用的低成本DSP芯片,而且包括以下主要特点:

⑴运算速度快,最快可达532MIPS;

⑵多总线结构,片内共有8 条总线(1条程序存储器总线、3条数据存储总线和4条地址总线);

⑶CPU采用冯 诺依曼并行结构设计,使其能在一条指令周期内,高速地完成多项算术运算;

⑷片内集成了4K×16bitROM和16K×16bit的双存取RAM;

⑸丰富的片上外围电路(通用I/O 引脚,定时器,时钟发生器, HPI 接口,多通道缓冲串行口McBSP)使其与外部接口方便;

⑹33V I/O电压,18V核点压,工作电流平均值为75mA,其中核45mA,I/O约30mA;

⑺144脚BGA封装,使体积减少,功耗降低。

2、AD和DA电路

在本数字滤波器系统中选择了TI公司的TLV1570芯片作为模数转换器件,8通道10位27到55 V低电压模数转换芯片。TLVl570在3V电压下的采样频率为625KSPS,输入信号最高频率不能超过300K。

由于模数转换选择了10位器件,为了简化程序代码,减少DSP 的运算工作量,在本数字滤波器系统中选择了TI公司的TLV5608芯片,它是一款8通道10位27到55V低电压数模转换芯片。

3、电源电路

根据DSP芯片工作的电压电流需求,及芯片采用双电源供电对加电顺序的要求,考虑使用TI公司的电源转换芯片TPS73HD318,其输出电压为一路33V、一路18V,每路电源的最大输出电流为750mA,能满足本系统的供电需求。而且TPS73xx具有非常低的静态电流,能使稳压器输出稳定。

4、时钟电路

C54xx系列的时钟端子为X1和X2/CLKIN,采用无源晶振提供时钟信号,由于DSP有一组端子可以用来调整其工作频率的高低,故对晶振频率大小的选定没有特别的要求,这里选用10Mhz的晶振。

5、复位电路

为了克服DSP系统因时钟频率较高导致在运行时可能发生的干扰和被干扰的现象,最好是使用具有监视(Watchdog)功能的自动复位电路,于是采用专门的自动复位芯片MAX706。MAX706的电源为31V~50V,低电平复位输出,复位门限为308V。

6、未用端子处理

根据使用DSP芯片的相关原则,以及芯片手册具体决定未用端子是接上拉电阻还是悬空。

7、基于上述的各部分电路组成,可以得出DSP数字滤波器的整体硬件电路连线图,如下所示

程序设计

1、设计思路

⑴在DSP进行数字滤波运算前首先要进行初始化,只有正确设置了DSP的初始状态才能保证芯片能正常运行。本系统主要进行以下两方面的初始化:

①寄存器初始化:状态寄存器ST0、状态寄存器ST1、处理器模式控制寄存器PMST、软件等待状态寄存器SWWSR、组交换控制寄存器BSCR和时钟模式寄存器等。

②中断矢量表初始化:根据DSP芯片对各中断矢量的设置位置编写一个子程序;设置PMST控制寄存器;连接时将矢量表重定位到IPTR指定的地址。

⑵其次就是FIR 数字滤波的子程序设计,主要步骤如下:

①查询SPCR11寄存器的第二位,当为1时说明read ready,将DRR11的值读入AR3所指向的地址,该值为最新的采样值。

②将最新的采样值减去200h,然后AR3的值减1。

③执行MAC指令。

④将累加器的值送给变量Y,并将Y加上200h。

⑤查询SPCR20寄存器的第二位,当为1时说明writeready,将Y值赋给DXR10,该值为滤波器输出值。

⑥循环执行上面步骤。

2、程序流程图

依据上述程序设计思路可以得到利用DSP实现FIR滤波器设计的程序流程图,如下

3、程序代码

由于初始化程序部分过于庞大繁杂,这里只给出用MAC指令编程实现FIR低通滤波器的程序片断:

FILT_task1

LD Store_SICX,A

STLM A,ar4

STM #1,ar0 ;间址

STM #28,bk

LD DEM_Out,A

STL A,ar4+% ;输入信号:实部

STM #Coef_Tab1,ar5 ;滤波器实部系数地址

LD #0,A

STM #27,brc

RPTB SICXU-1

MAC AR4+0%,AR5+,A

SICXU LD A,-16,A ;低通滤波结果

LD C7FFF,B

MIN A

NEG B

MAX A

STL A,DEM_Out

LDM AR4,A

STL A,Store_SICX

RET

Coef_Tab1

word 100 ;h(0)

word 7 ;h(1)

… ;脉冲响应系数

word -248

word -71 ;h(N-1)

end

总结

通过利用DSP的FIR滤波器设计,对DSP芯片的使用,以及利用DSP芯片组成的基本系统的相关电路有了比较深的认识。熟悉DSP芯片的系统设计和应用开发流程,并利用图书馆、网络、询问同学等方式查找资料和解决相关的难题,这是最基础的工作,也是最关键的步骤。这样做可以培养自己的动手解决问题的能力和独立思考的处事方法,使自己具有技术人员的气质和工作态度,为将来的就业增加优势。

数字滤波器是DSP的典型应用,学会了有助于触类旁通,利于进一步的学习研究,能做到理解其他基于DSP的系统的功能和工作原理。掌握了基于DSP的应用开发,开阔了视野,增长了知识,是进入现代数字信号处理领域重要技能,乃至大规模集成电路的开发也是会用到的基础,今后要予以重视并积极努力去学习。

您好,1 首先是接口的预定义

----------------------------------------------

#define LCD_DATA (((volatile Uint16 )0x0070E0)) // GPIOA7-A0对应DB7-DB0

#define RS GpioDataRegsGPBDATbitGPIOB0

#define RW GpioDataRegsGPBDATbitGPIOB1 //别弄错0 1 2

#define EN GpioDataRegsGPBDATbitGPIOB2 // 实际接线要对应

void InitGpio(void)

{

EALLOW;

GpioMuxRegsGPAMUXbitPWM1_GPIOA0 = 0; // 设置为普通GPIO使用

GpioMuxRegsGPADIRbitGPIOA0 = 1; // 设置为输出

GpioMuxRegsGPAMUXbitPWM2_GPIOA1 = 0;

GpioMuxRegsGPADIRbitGPIOA1 = 1;

GpioMuxRegsGPAMUXbitPWM3_GPIOA2 = 0;

GpioMuxRegsGPADIRbitGPIOA2 = 1;

GpioMuxRegsGPAMUXbitPWM4_GPIOA3 = 0;

GpioMuxRegsGPADIRbitGPIOA3 = 1;

GpioMuxRegsGPAMUXbitPWM5_GPIOA4 = 0;

GpioMuxRegsGPADIRbitGPIOA4 = 1;

GpioMuxRegsGPAMUXbitPWM6_GPIOA5 = 0;

GpioMuxRegsGPADIRbitGPIOA5 = 1;

GpioMuxRegsGPAMUXbitT1PWM_GPIOA6 = 0;

GpioMuxRegsGPADIRbitGPIOA6 = 1;

GpioMuxRegsGPAMUXbitT2PWM_GPIOA7 = 0;

GpioMuxRegsGPADIRbitGPIOA7 = 1;

GpioMuxRegsGPBMUXbitPWM7_GPIOB0 = 0;

GpioMuxRegsGPBDIRbitGPIOB0 = 1;

GpioMuxRegsGPBMUXbitPWM8_GPIOB1 = 0;

GpioMuxRegsGPBDIRbitGPIOB1 = 1;

GpioMuxRegsGPBMUXbitPWM9_GPIOB2 = 0;

GpioMuxRegsGPBDIRbitGPIOB2 = 1;

EDIS;

}

----------------------------------------------

一般液晶的控制线是直接对I/O口的位进行 *** 作,数据线是按字进行 *** 作。在这容易出错的是:(1)数据线地址的对应。DSP的GPIO数据地址一般为16位一个地址(F28335有的是32个GPIO一组,给出了一个地址,实际上是有两个地址的,给出的那一个地址是低16位的)。需要注意的是,液晶数据线一般为8位,那么把八位数据送出的时候,实际给的是DSP的16位数据的低八位,所以接线上要接低八位的GPIO;如果接高八位的GPIO,软件上要用下面一行程序进行移位 dat = dat << 8; //左移8位,向高位移动。(2)在进行GPIO初始化和预定义的时候,一般都会复制,但是别忘记改一些0 1 2 3等数,接线上也要一一对应,仔细检查。

2 51程序移植到DSP的时序问题

----------------------------------------------

void Display_Data_All(uchar hz)

{

while(hz != '\0')

{

WriteData12864(hz);

hz++;

delay(20);//2就不够!!!!!!

}

}

----------------------------------------------

由于51单片机的晶振一般为110592MHz,而DSP等控制器的晶振为30MHz,实际执行起来最高有150MHz,而液晶为低速外设,所以移植后可能会不显示,显示乱码等情况。我在调试12864液晶的时候就出现过只显示乱码数字不显示汉字的情况,这不是字库损坏,而是因为写汉字的时间要比写数字的时间长,而程序中延时过短。上面程序中把delay(2)改为delay(20)就解决问题了。

实际上,真正造成影响的是,程序执行过快。它认为显示完一个字之后,又很快进入下一个字的 *** 作;实际上液晶要一定的时间才能写完(见液晶 *** 作时序图),所以写数据的程序中要加长延时。至于RS、RW、EN等控制引脚,延时与否影响不大。

3 240128液晶的调试

240128液晶有busy和int返回信号,实际上不需要接即可。程序中也可以不测忙。。程序中写控制指令两者中间也要加长延时,更不用说写数据之间的延时。

----------------------------------------------

void lcd_regwrite(Uint16 regname,Uint16 regdata) // 写控制指令

{

lcd_regwr(regname);

delay(10); // 加长延时

lcd_regwr(regdata);

}

void lcd_character(uchar cha,int count) // 显示中文或字符

{

int i;

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

{

delay(10); // 加长延时

lcd_datawrite(cha);

++cha;

}

}

create database 数据库的名称

use 数据库的名称

create table 表的名称

(

字段1 int,

字段2 varchar(20)

)

这久是最简单的建库和建表

dsp2的n次方可以写作2dsp^n。编写一个以C 语言为基础的DSP程序 .实验目的 ,学习用标准C语言编制程序;了解常用的C语言程序设计方法和组成部分。 学习编制连接命令文件,并用来控制代码的连接。所以说,dsp2的n次方可以写作2dsp^n。

#define CLKMD (unsigned int )0x58 内存地址0x58 通常 是一些 端口号 之类的 定义

asm(" STM #0000h,CLKMD "); C里 插入 汇编 语句(混合模式) ,STM #0000h,CLKMD

至于什么作用,你要看一些 文档,应该有一个 datasheet 的东西

以上就是关于基于dsp的 f.i.r低通滤波器设计全部的内容,包括:基于dsp的 f.i.r低通滤波器设计、DSP28335控制12864液晶,读取LCD数据,lcd_read_data程序应该怎么编写、有谁会用DSP汇编语言编写实现卷积运算的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9794679.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存