DSP原理与应用 第10章 C55x典型应用系统设计

Slides:



Advertisements
Similar presentations
现代电子技术实验 ——综合实验之单片机部分
Advertisements

什么是SOPC: SOPC是英文System On a Programmable Chip的缩写,称为片上可编程系统。SOPC将传统的EDA技术、计算机系统、嵌入式系统、数字信号处理等融为一体,综合了各自的优势,且在结构上形成一块芯片。 为什么用SOPC:SOPC是现代电子技术和电子系统设计的发展趋势,建立了电子系统设计的新模式。用户利用SOPC开发平台,自行设计高速、高性能的DSP处理器、特定功能的CPU及其外围接口电路,创建结构最为简洁的电子系统。
实验四 利用中规模芯片设计时序电路(二).
第8章 机床操作 主讲:臧红彬 博士.
第10章 FPGA硬件设计 <EDA技术与应用> 课程讲义
计算机基础知识 丁家营镇九年制学校 徐中先.
C8051F MCU V1.0.
电工电子实验中心.
EPF10K10TI144-4晶片燒錄.
DSP原理与应用 第10章 C55x典型应用系统设计
Netduino 程式設計教學 國立豐原高中 郭再興.
VHDL數位電路實習與專題設計 文魁資訊-UE301
PIC16F1827介紹 以微控器為基礎之電路設計實務-微處理器實驗室.
Timer & KEYPAD 11/24.
第二讲 搭建Java Web开发环境 主讲人:孙娜
EDA原理及应用 何宾
Block diagram BB —逻辑 —音频 —电源管理 HW interface. Block diagram BB —逻辑 —音频 —电源管理 HW interface.
I2C使用 AIC23数字回音实验.
Roy Wan PCI MS/s 14-bit 高速数字化仪 Roy Wan
走进编程 程序的顺序结构(二).
初始化串列通訊埠 在啟始串列傳輸介面時有以下3個步驟:假設傳輸的通訊協定為9600bps,傳送8個位元資料,沒有同位位元,1個停止位元。
DM81X 视频采集处理 ——简单采集显示例程讲解 广州创龙电子科技有限公司
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月20日.
SPI驱动 广州创龙电子科技有限公司 Guangzhou Tronlong Electronic Technology Co., Ltd.
KeyStone I DSP[C665x 与 C6678] 视频教程
基于Arduino单片机的简易示波器 Arduino Based Simple Oscilloscope
I2C驱动 广州创龙电子科技有限公司 Guangzhou Tronlong Electronic Technology Co., Ltd.
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
深圳市藏海科技有限公司—CH7852 建议零售价格:140元 上市时间:2017年 12 月 11 日
逆向工程-汇编语言
《手把手教你学STM32》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:
实验六 积分器、微分器.
CPU结构和功能.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
移相正弦信号发生器设计 采用直接数字综合器DDS发生器的设计 原理:图1是此电路模型图
    使用Arduino量測交流(AC)電壓    林品成 月.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
8.4 ADC0809接口电路及程序设计.
通訊實驗 實驗三 遙控車程式流程圖 姓名:顏得洋 學號:B
第四章 MCS-51定时器/计数器 一、定时器结构 1.定时器结构框图
K60入门课程 02 首都师范大学物理系 王甜.
通訊實驗 實驗三 遙控車程式流程圖 姓名:顏得洋 學號:B
(Random Access Memory)
微机原理与接口技术 西安邮电大学计算机学院 杨锐.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
K60入门课程 06 首都师范大学物理系 靳熙芃.
信号量(Semaphore).
实验三 16位算术逻辑运算实验 不带进位控制的算术运算 置AR=1: 设置开关CN 1 不带进位 0 带进位运算;
核探测与核电子学国家重点实验室 中国科学技术大学近代物理系 王照琪
实验二 带进位控制8位算术逻辑运算实验 带进位控制8位算术逻辑运算: ① 带进位运算 ② 保存运算后产生进位
LOGIX500软件入门 西安华光信息技术有限公司 2008年7月11日.
College of Computer Science & Technology
HSC高速输出例程 HORNER APG.
UART通信实验(二) McBSP软件模拟异步通信
外部存储器接口 键盘扫描实验.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
外部存储器接口 SDRAM实验.
汽车单片机应用技术 学习情景1: 汽车空调系统的单片机控制 主讲:向楠.
单片机应用技术 (C语言版) 第4章 C51程序设计入门
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
信号发生电路 -非正弦波发生电路.
通訊實驗 實驗三 遙控車程式流程圖 姓名:顏得洋 學號:B
亚博科技 Arduino视频教程 第1讲 Hello World!
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
上节复习(11.7) 1、定时/计数器的基本原理? 2、定时/计数器的结构组成? 3、定时/计数器的控制关系?
工业机器人入门使用教程 ESTUN机器人 主讲人:李老师
DSP技术与应用 电子与信息技术系.
Presentation transcript:

DSP原理与应用 第10章 C55x典型应用系统设计 刘忠国:liuzhg@sdu.edu.cn 电话:18764171197 ; 微信: jnliuzg 山东大学生物医学工程

网站: http://course.sdu.edu.cn/G2S/dsp.cc http://www.ti.com 任课教师:刘忠国 网站: http://course.sdu.edu.cn/G2S/dsp.cc http://www.ti.com TMS320C55x DSP CPU Reference Guide (SPRU371F, 2004年版) TMS320VC5509A Fixed-Point Digital Signal Processor-Data Manual (SPRS205K,2008年版) TMS320VC5503/5507/5509 DSP External Memory Interface (EMIF) Reference Guide (SPRU670) TMS320VC5507/5509 DSP Analog-to-Digital Converter (ADC) Reference Guide (SPRU586B)

第10章 C55x典型应用系统设计 10.1 典型DSP板的硬件设计 10.2 CPLD电路模块设计 10.3 DSP板测试程序 10.4 综合设计实例1: 自适应系统辨识 10.5 综合设计实例2: 数字式有源抗噪声耳罩

10.1 典型DSP板的硬件设计 10.1.1 概述 基于TMS320VC5509A的通用数字信号处理板: 包括VC5509A芯片、复位电路、时钟电路、JTAG接 口电路以及电源电路等基本电路模块。 通过EMIF外扩了FLASH、SDRAM等存储器模块。 通过McBSP0、McBSP1和I2C外扩了2片AIC23B,使 该系统具有4路模拟输入和4路模拟输出。

10.1.2基本电路模块 参考:图9-8 TPS767D301双路电源 1. 电源电路 ,Vref=1.1834V

2.复位电路 Y = A 单施密特反相器芯片SN74AHC1G14 3.时钟电路

10.1.3 FLASH电路模块 参考图 9-16 C5509A PGE与S29AL008D连接示意图 S29AL008D: 8M bit (1Mx8Bit, 512K x16Bit) CMOS Flash 1为字模式 CE1 参考图 9-16 C5509A PGE与S29AL008D连接示意图

A0与A14在EMIF中异或输出, A0不用,则该引脚就是A14 参考图9-19 C55x与64M位(4M×16) SDRAM的连接图

block C5509有SROM, C5509A没有SROM, block block 外部扩展存储空间(CE3) 当MPNMC=1时有效

10.1.5 数模转换电路 x1,x2为线性电压输入端; y1,y2为线性电压输出端 CS=0: 地址0011010 MODE=0 选择2线模式

10.1.6 SD卡接口电路

10.1.7 USB接口电路

10.1.8 自启动电路模块 系统复位时, 程序会自动跳转到0xFF8000处运行, 在这里固化着出厂时的引导程序。这段程序中系统会读取GPIO0~3的状态, 然后确定引导方式: 表10-1 GPIO引脚与系统上电引导方式表 GPIO0 GPIO1 GPIO2 GPIO3 说明 1 来自于Mcbsp0的串行EEPROM引导方式(24bit地址) USB接口引导方式 EHPI(多元引导)方式 EHPI(非多元引导)方式 来自于外部16bit异步内存的引导方式 来自于Mcbsp0的串行EEPROM引导方式(16bit地址) 并行EMIF引导方式(16bit异步内存) 来自Mcbsp0同步串行引导方式(16bit数据) 来自Mcbsp0同步串行引导方式(8bit数据)

10.1.8 自启动电路模块

10.2 CPLD电路模块设计 10.2.1 概述 CPLD芯片选用了XILINX公司的XC95144XL, 主要用于: DSP复位逻辑控制; 外部存储器FLASH高位地址扩展; 系统外扩等。 CPLD代码使用VHDL语言编写。

XC95144XL输入输出引脚的定义 100-pin TQFP(81 user I/O pins) 144-CSP (117 user I/O pins) XC95144XL输入输出引脚的定义

10.2.2 复位逻辑 1. 输入信号: 2.输出信号: 电源芯片复位信号PWR_RSTn; 按键复位信号BTN_RST; 外部复位信号X_RSTn; 2.输出信号: VC5509A芯片系统复位信号DSP_RSTn; FLASH芯片复位信号FLASH_RSTn; 复位指示灯信号DSP_RSTn_LED。

SystemResetn<='0‘ when PWR_RSTn='0' or X_RSTn= '0' or BTN_RST = '1' 3. 代码: SystemResetn<='0‘ when PWR_RSTn='0' or X_RSTn= '0' or BTN_RST = '1' else '1'; DSP_RSTn<= '0' when SystemResetn = '0' DST_RST_LED<='0‘ when SystemResetn='0' FLASH_RSTn<='0‘ when SystemResetn='0' 4.功能: 当PWR_RSTn(低电平有效)、X_RSTn(低电平有效) 、BTN_RST (高电平有效)有一个有效时, 即产生有效的复位信号DSP_RSTn (低电平有效)、FLASH_RSTn(低电平有效) 、DSP_RSTn_LED (低电平有效)。

10.2.3 控制寄存器的地址生成 用户寄存器和FLASH高位地址寄存器FHA与VC5509A通过EMIF接口联系, 其地址分别为0x400601、0x400602。 地址生成代码: REGCEn<='0' when DSP_CE2n='0' and DSP_ADDRH(13 downto 10)="0011" else '1'; GENERATE_ADDR: process(DSP_ADDRL) begin case DSP_ADDRL(4 downto 1) is when "0001"=> ChipEnables <="00000001“ ;-- USER REG 0x400601 when "0010"=> ChipEnables <="00000010“ ;-- FLASH REG 0x400602 when others=> ChipEnables <="00000000“ ; end case; end process; USER_REGCS<='1' when ChipEnables(0)='1' and REGCEn='0' else '0'; -- FLASH_REGCS<=1' when ChipEnables(1)='1' and REGCEn='0‘ else '0'; --

10.2.4 用户寄存器 用户寄存器用于控制LED灯和读拨码开关状态, 长度为8位。高4位对应引脚USER_SW4~USER_SW1,用于读拨码开关状态; 低4位对应引脚USER_LED4~USER_LED1, 用于控制LED灯。 代码: process(SystemResetn,USER_REGCS,DSP_DQ,DSP_AWEn) begin if SystemResetn='0' then USER_REG(3 downto 0)<="1010"; elsif DSP_AWEn'EVENT and DSP_AWEn = '1' then -- _↑ ¯ if (USER_REGCS = '1') then USER_REG(3 downto 0) <= DSP_DQ(3 downto 0); end if; end process; USER_REG(7 downto 4) <= USER_SW(4 downto 1); -- read SW state USER_LED(4 downto 1)<=not USER_REG(3 downto 0);-- output LED state

10.2.5 FLASH高位地址寄存器 该模块用于生成FLASH的高位地址信号A18~A13。 代码: FLASH_CEn<= DSP_CE1n; FLASH_WEn<= DSP_AWEn; FLASH_OEn<= DSP_AOEn; process(SystemResetn, FHA_REGCS,DSP_DQ,DSP_AWEn) begin if SystemResetn = '0' then FHA_REG (5 downto 0) <= "000000"; -- elsif DSP_AWEn'EVENT and DSP_AWEn = '1' then-- __↑¯¯ if (FHA_REGCS = '1') then -- FHA_REG (5 downto 0) <= DSP_DQ(5 downto 0); end if; end process; FLASH_ADDR(18 downto 13) <= FHA_REG (5 downto 0);

10.2.6 控制寄存器数据的输出 下列代码可将对应控制寄存器中的内容送出供DSP读取: -- Mux the read data from all the registers and output for reads process(DSP_ADDRL,USER_REG,FLASH_REG) begin case DSP_ADDRL(4 downto 1) is when "0001" => MuxD <= USER_REG; when "0010" => MuxD <= "00" & FLASH_REG; when others => MuxD <= "ZZZZZZZZ"; end case; end process; DSP_DQ <= MuxD when (REGCEn = '0') and (DSP_AREn = '0') and (DSP_AOEn = '0') else "ZZZZZZZZ";

10.3 DSP板测试程序 10.3.1 LED灯和拨码开关测试程序 对于LED灯和拨码开关的操作是通过对CPLD上的用 户寄存器USER_REG进行读写来完成的。 用户寄存器地址为0x400601, 各位的定义: 7 6 5 4 3 2 1 SW4(W) SW3(W) SW2(W) SW1(W) LED4(R) LED3(R) LED2(R) LED1(R) 测试程序功能:让LED灯依次点亮, 然后再依次熄灭。然后让LED灯闪烁3次, 最后循环读取SW1~SW4的值送LED1~LED4显示。

for(i = 0; i < 8; i++) //将LED灯依次点亮,再依次熄灭 { //因数组已定义LEDcode[8]={0,1,3,7,15, 7, 3,1,0} LedDisp(LEDcode[i]); Delay_ms(300) ; //延时300ms函数 } for(i = 0;i < 0x03;i++) //让LED灯闪烁3次 { LedDisp(0x00); //该函数将0送USER_REG中使灯全灭 Delay_ms(300); LedDisp(0x0F); //将0F送USER_REG中使灯全亮 while(1) //循环读取拨码开关的键值,送LED显示 readvalue = SwithRead();// SwithRead读取拨码开关的值 LedDisp(readvalue); //送LED灯显示

10.3.2 LED灯和拨码开关测试程序 GPIO0~GPIO3与拨码开关相连,在系统复位时用于 选择系统引导方式,当系统引导完毕后即可作为普通 GPIO来使用。 GPIO4、GPIO6、GPIO7以及XF连接了LED灯,输 出为0时点亮LED灯,输出为1时关闭LED灯。 注意: C5509A 的PGE封装无GPIO5引脚(BGA封装有) 测试程序功能: 先让GPIO4、XF、GPIO6、GPIO7闪烁3次, 然后循环检测GPIO0~GPIO3的值, 依次送GPIO4、XF、GPIO6和GPIO7显示。 以下程序所用到的函数部分可在CSL安装目录的库文件中查找:\C55xxCSL\lib\csl55xx.src, 类似前面用到的: D:\ti\ccsv5\tools\compiler\c5500_4.4.1\lib\rtssrc.zip(解压)

GPIO_RSET(IODIR,0xF0); //使GPIO0-3为输入,GPIO4-7为输出 for(i = 0;i<0x03;i++) { GPIO_RSET(IODATA,0x0f); //使GPIO4-7都输出0, 使3灯亮 CHIP_FSET(ST1_55,XF,0); //XF灯也点亮 Delay_ms(300); GPIO_RSET(IODATA,0xff); //3灯全灭 CHIP_FSET(ST1_55,XF,1); //XF灯也熄灭 } while(1) readvalue=GPIO_RGET(IODATA) & 0x0F; //读取GPIO0-3的值 GPIO_RSET(IODATA,readvalue<<4); //给GPIO4(6, 7)赋值 CHIP_FSET(ST1_55,XF,(readvalue & 0x02) >> 1); //将GPIO1的值与GPIO5(C5509A PGE无)对应, 赋给XF //GPIO_RSET设置IODIR值为0xF0 //设置IODATA值为0x0f 无GPIO5引脚 //CHIP_FSET设置ST1_55的XF=0 有关函数或宏定义在片上支持库安装文件夹C55xxCSL的csl55xx.src中 #define GPIO_RSET(Reg,Val) _PREG_SET(GPIO_ADDR(##Reg),Val) #define _PREG_SET(PregAddr, Val) PREG16(PregAddr) = (Uint16)Val #define PREG16(addr) (*(volatile ioport Uint16*)(addr)) #define CHIP_FSET(Reg,Field,Val) _CHIP_##Reg##_FSET(##Field,Val) 在csl55xx.src中依次可追究出对ST1_55的XF位清0 GPIO_RGET(IODATA)的追源: #define GPIO_RGET(Reg) _PREG_GET(GPIO_ADDR(##Reg)) #define _PREG_GET(PregAddr) PREG16(PregAddr) #define PREG16(addr) (*(volatile ioport Uint16*)(addr))

10.3.3 SDRAM测试程序 SDRAM占用两个空间: CE0和CE1, FLASH与SDRAM复用CE1空间。当CE1_1寄存器中的MTYPE为001b时, 表示CE1空间为16位异步存储器; 当MTYPE为011b时, 表示CE1空间为16位SDRAM。 测试程序功能:首先配置好EMIF,然后向SDRAM中写入1000个数据,接着将写入的数据读出,验证读出的数据是否正确,并对错误的数据个数进行计数。

EMIF_config(&emiffig); //初始化SDRAM psrc = (Uint16 * )0x200000; //指向将要读写的地址 for(ii = 0;ii < 1000;ii++) //向对应地址中写入数据 { * psrc++ = ii; } psrc = (Uint16 * )0x200000; //重新指向将要读写的地址 if((* psrc) != (ii - 1)) error++; * psrc++; if(error == 0) printf("SDRAM test completed! No Error!"); while(1); //*psrc = ii; //psrc++;

10.3.4 FLASH测试程序 测试程序功能: 首先配置好EMIF,然后擦除整片FLASH。接着进行写操作, 先在0x4202000开始的地址写入1000个数据,然后在0x4204000开始的地址写入1000个数据。最后读取两块数据, 验证数据是否正确,并对错误的个数进行计数。 EMIF_config(&emiffig);//配置EMIF success = Flash_Erase_all();//需要大约14s才能擦除完毕 if(success == 1) printf("Flash erase successfully!!\n"); Flash_Write_init();//向flash中写入数据,有换页操作 for(ii=0;ii<1000;ii++) { Flash_Write(0x202000+ii,ii); }

for(ii = 0;ii < 1000;ii++) { Flash_Write(0x204000 + ii, ii+1); //写入的数据与上面略有不同 } Flash_Write_end(); for(ii = 0;ii < 1000;ii++) //读取写入flash中的数据,并验证 if(Flash_Read(0x202000 +ii) != (ii - 1)) error++; if(Flash_Read(0x204000+ii) != ii+1) error++; if(error == 0) printf("FLASH test completed! No Error!"); while(1);

10.3.5 AIC23B测试程序 板上共有2片AIC23B。控制接口部分使用I2C总线, 两个芯片的地址分别为0x1A和0x1B;数字接口部 分使用了两个McBSP接口:McBSP和McBSP1。 测试程序功能:首先对AIC23B进行初始化,配置 启动McBSP0和McBSP1,然后进入一个循环。在 循环中,等待数据接收,待接收完毕后将其存入 一个数组,再将接收到的数据发送出去。

AIC23_Init(); //AIC23B初始化 hMcbsp0=MCBSP_open(MCBSP_PORT0, MCBSP_OPEN_RESET); //打开McBSP0 hMcbsp1=MCBSP_open(MCBSP_PORT1, MCBSP_OPEN_RESET); //打开McBSP1 MCBSP_config(hMcbsp0, &McbspConfig);//配置McBSP0 MCBSP_config(hMcbsp1, &McbspConfig);//配置McBSP1 MCBSP_start(hMcbsp0, MCBSP_RCV_START|MCBSP_XMIT_START, 0x3000); //开启McBSP0发送和接收 MCBSP_start(hMcbsp1, MCBSP_RCV_START|MCBSP_XMIT_START, 0x3000); //开启McBSP1发送和接收

while(1) {for(i=0;i<LENGTH;i++) {while(!MCBSP_rrdy(hMcbsp0)) {}; //判断是否有数据收到,若无则 等待 aic23data = MCBSP_read32(hMcbsp0); //接收数据 aic0R[i]=(unsigned int) aic23data & 0xffff;//AIC23B0右声道数 据 aic0L[i]=(unsigned int)(aic23data>>16)&0xffff;//AIC23B1左 声道数据 while(!MCBSP_xrdy(hMcbsp0)){};//判断是否准备好发送,若无则等 待 MCBSP_write32(hMcbsp0,aic23data);//发送数据 while(!MCBSP_rrdy(hMcbsp1)){};//判断是否有数据收到,若无则等 待 aic23data=MCBSP_read32(hMcbsp1); //接收数据 aic1R[i]=(unsigned int)aic23data&0xffff;//AIC23B1右声道数据 aic1L[i]=(unsigned int)(aic23data>>16)&0xffff;//AIC23B1左 声道数据 while(!MCBSP_xrdy(hMcbsp1)){};//判断是否准备好发送,若没有则 等待 MCBSP_write32(hMcbsp1,aic23data);//发送数据 }

10.4 综合设计实例1:自适应系统辨识 10.4.1 基于LMS算法的自适应滤波器

10.4.2 自适应系统辨识算法 算法收敛后,N为辨识长度 :

10.4.3 辨识系统硬件设计

10.4.4 辨识系统软件设计 1.主程序

#include "5509.h" // 5509片上资源声明 #include "util.h" #include "math.h" int n_iden,N_iden; //声明辨识计数器和辨识时间长度 int L; // 声明滤波器阶数 int timer_flag; // 声明定时器状态标志位 float Fs,Ts; // 声明采样频率与采样时间 float Mu;// 声明收敛因子 float *w; // 声明自适应滤波器系数指针 float *x; // 声明自适应滤波器参考输入向量指针 float desizedSignal; // 声明期望信号 float ErrorSignal; // 声明误差信号 int whiteNoise; // 声明白噪声信号

void PLL_Init(); //声明锁相环配置函数 void wait(unsigned int cycles); //声明延时函数 void SDRAM_Init(); //声明存储器配置函数 void AIC23_Init(); //声明AIC23B配置函数 void INTR_Init(); //声明中断初始化函数 void TIMER_Init(); //声明定时器初始化函数 void TIMER_Start(); //声明定时器启动函数 void interrupt Timer(); //声明定时器中断服务程序 void LMS_Filter(); //声明自适应滤波程序

void main() { int temp; /*------------------------------------------------------------*/ /* VC5509A初始化 */ /*--------------------------------------------------------*/ PLL_Init(144); //锁相环配置,CPU时钟频率设置为144MHz wait(30); //延时 SDRAM_Init(); //存储器配置 INTR_Init(); //中断初始化 TIMER_Init(); //定时器初始化 /*-----------------------------------------------------------------*/ /* 变量初始化 */ n_iden=0; // 辨识计数器清0 N_iden=8000; //辨识时间长度赋值

L=200; // 滤波器阶数赋值 Fs=2000; // 采样频率赋值 Ts=1/Ts; // 计算采样时间 timer_flag=0; //定时器状态标志位初始化 Mu=0.01;//收敛因子赋值 TIMER_Start();//启动定时器 while(n_iden 1 <N_iden) { if(timer_flag==1) timer_flag=0; whiteNoise=rand()-0x4000; //生成白噪声信号,取值范围-16384至+16383 Write(pMCBSP0->dxr2, whiteNoise); //发送噪声数据到AIC23B(0)左输出通道

while(!ReadMask(pMCBSP0-> spcr2, SPCR2_XRDY)); //是否准备好接收数据, 若无则等待 temp=Read(pMCBSP0->ddr2); //通过AIC23B(0)左输入通道引脚读取待辨识系统的输出信号 desizedSignal=(float)temp/32768; //对输入信号进行类型转换及归一化得到期望信号 LMS_Filter();//调用LMS自适应滤波程序 n_iden= n_iden+1; } while(1){}; //辨识完成,可取滤波器系数作为待辨识系统的冲击响应

2.自适应滤波子程序 LMS_Filter() {PC55XX_MCSP pMCBSP0=(PC55XX_MCSP)C55XX_MSP0_ADDR; int i; float alpha; for(i=L;i<0;i--) //构造当前时刻参考信号向量 { x[i] = x[i-1]; } x[0]=(float)whiteNoise/32768; //对白噪声信号进行类型转换及归一化得到参考信号 float y=0.0; for(i=0;i<L;i++) //滤波器计算 { y = y + w[i]*x[i]; } ErrorSignal = desizedSignal - y; alpha=Mu*ErrorSignal; for(i=0;i<L;i++) //更新滤波器系数 { w[i]=w[i]+ alpha*x[i]; } }

3.定时器中断服务程序 4. 其它程序 void interrupt Timer() //中断服务程序 { timer_flag=1; } 本例主要代码放在main函数中,定时器中断服务 程序只是设置timer_flag=1,告知主程序新的采样 时间到。 4. 其它程序 限于本书篇幅,其它程序模块不再赘述。

10.5 综合设计实例2:数字式有源抗噪声耳罩 10.5.1 概述 工作原理:利用传声器监测待消除的噪声信号,由控制器进行处理后发出一个与原噪声信号幅度相同、相位相反的反噪声信号,使二者相互抵消,从而达到消除噪声的目的 特点:低频抗噪效果好、重量轻、透气性好、不影响正常通讯等

10.5.2 系统工作原理和控制算法 1. 工作原理 图10-17 有源耳罩(单耳)示意图

S(z)为次级通道,包括反噪声输出通道的数模转换、重构滤波、功率放大器、扬声器,从扬声器Y到误差传声器M2的声通道,以及误差信号通道的传声器、放大、抗混叠滤波、模数转换等环节。 P(z)为初级通道,包括参考噪声信号通道的模数转换、抗混叠滤波、放大、传声器,从参考传声器M1到误差传声器M2的声通道,以及误差信号通道的传声器、放大、抗混叠滤波、模数转换等环节。 W(z)为控制器,通常取有限冲击响应(FIR)结构。 2.控制算法 次级通道S(z) 的模型,需要进行估计或辨识。 为叙述简单起见,本系统采用有源噪声控制中常用的FXLMS算法。 图10-18 FXLMS算法