首页> 中国专利> 基于DSP和USB的实时语音存储系统及存储方法

基于DSP和USB的实时语音存储系统及存储方法

摘要

本发明的基于DSP和USB的实时语音存储系统,包括语音信号采集模块、处理模块和存储模块,特征在于:语音信号采集模块包括预处理电路和语音编解码模块,语音信号处理模块包括DSP处理器和存储器,语音信号存储模块包括USB接口芯片和USB接口电路。本发明的存储方法,特征在于:采用9个以上的语音数据缓冲区对采集的语音数据进行存储,采用数目至少为语音数据缓冲区2倍的U盘数据缓冲区,存储语音数据缓冲区中的数据转化为U盘数据格式之后的数据。本发明的系统具有存储速度快、功耗低、体积小、方便使用等优点。本发明的存储方法,具有高速、实时和连续语音采集和存储特点,可实现不间断的语音数据采集,不会丢失语音样点,保证了语音记录的完整性。

著录项

  • 公开/公告号CN102969011A

    专利类型发明专利

  • 公开/公告日2013-03-13

    原文格式PDF

  • 申请/专利权人 山东省计算中心;

    申请/专利号CN201210377016.5

  • 申请日2012-10-08

  • 分类号G11B20/10(20060101);G11C7/10(20060101);

  • 代理机构37218 济南泉城专利商标事务所;

  • 代理人李桂存

  • 地址 250014 山东省济南市历下区科院路19号山东省计算中心

  • 入库时间 2024-02-19 17:37:56

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2015-08-12

    授权

    授权

  • 2013-04-10

    实质审查的生效 IPC(主分类):G11B20/10 申请日:20121008

    实质审查的生效

  • 2013-03-13

    公开

    公开

说明书

技术领域

本发明涉及一种基于DSP和USB的实时语音存储系统及存储方法,更具体的说,尤其涉及一种对语音信号高速不间断采集的同时可将语音数据连续、完整地保存至USB移动设备中的基于DSP和USB的实时语音存储系统及存储方法。 

背景技术

DSP实时语音信号处理系统,经常需要对处理后的语音信号进行分析、显示等工作,而这些复杂而繁重的工作需要在PC机上进行。将DSP系统与PC通过USB直连,可以实现以上功能,但是该方案只适用于DSP终端少的情况。如果需要分析的终端较多,每个终端都连接一台PC机,因成本上升、体积庞大而不适用。将DSP系统处理后的语音数据先存储到移动设备中,然后再拷贝的PC机上进行分析、显示等工作,是一个很好的方案。但是DSP的USB接口只支持从模式,无法作为USB主机直接与USB移动存储设备相连。 

要想使DSP实时语音存储系统具有USB主机功能,不仅需要其具有识别USB移动存储设备的功能,而且还需要其在高速语音信号采集的同时,能将采集的语音信息实时、连续和完整的保存至USB移动存储设备中。然而,在通过USB接口芯片进行数据存储的过程中,存储速度不均匀,如果单纯采用现有的存储方法,将不能连续地保存采集的语音数据,会造成语音数据样点的丢失。 

发明内容

本发明为了克服上述技术问题的缺点,提供了一种对语音信号高速不间断采集的同时可将语音数据连续、完整地保存至USB移动设备中的基于DSP和USB的实时语音存储系统及存储方法。 

本发明的基于DSP的实时语音存储系统,包括语音信号采集模块、语音信号处理模块和语音信号存储模块,其特别之处在于:所述语音信号采集模块包括用于调整声源幅度的预处理电路和用于模/数转化并进行编码的语音编解码模块,预处理电路的输出端与语音编解码模块的输入端相连接;所述语音信号处理模块包括DSP处理器和与DSP处理器相连接的存储器,所述语音信号存储模块包括USB接口芯片和与USB移动存储设备直接相连的USB接口电路,USB接口芯片的输出端与USB接口电路相连接;DSP处理器接收和处理语音编码模块输出的语音数据,并将处理后的数据通过USB接口芯片和USB接口电路发送至USB移动存储设备。 

语音信号采集模块实现语音信号的采集和编码,预处理电路将外界的声源信号转化为电信号,并将其调整为语音编解码模块可以识别的电平,语音编解码模块将模拟语音信号编码为数字语音信号。语音信号处理模块实现语音信号的接收和存储,DSP处理器实现采集、运算和存储作用,存储器实现数据变量和程序的存储功能。语音信号存储模块用于接收DSP处理器发送的语音数据,并将其转存到USB移动存储设备中。 

本发明的基于DSP的实时语音存储系统,所述DSP处理器、语音编解码模块和USB接口芯片采用的芯片型号分别为TMS320VC5509A、TLV320AIC23和CH376,存储器包括FLASH存储器和SDRAM存储器;DSP处理器通过多通道缓冲串口McBSP与语音编解码模块相连接,DSP处理器通过EMIF接口与FLASH存储器、SDRAM存储器和USB接口芯片相连接。 

TMS320VC5509A芯片具有2个乘法器(MAC),4个累加器(ACC),40位、16位的算术逻辑单元各一个,这大大增强了DSP的运算能力;且具有多通道缓冲串口McBSP和EMIF接口,便于实现与语音编解码模块、存储器和USB接口芯片的连接。TLV320AIC23芯片是一个高性能的多媒体数字语音编解码器,它的内部ADC和DAC的转换模块带有完整的数字滤波器。CH376芯片是一种USB总线通用接口芯片,兼容USBV2.0,支持动态切换主机方式与设备方式。 

本发明的基于DSP的实时语音存储方法,其特别之处在于:包括数据处理存储主流程和语音数据采集子流程;在语音数据采集子流程中,采用9个以上的语音数据缓冲区对采集的语音数据进行存储,以保证实时、连续和完整的保存语音数据;采用数目至少为语音数据缓冲区2倍的U盘数据缓冲区,存储语音数据缓冲区中的数据转化为U盘数据格式之后的数据;在数据处理存储主流程中,依次将U盘数据缓冲区中的语音数据存储到USB移动存储设备中。设置9个以上的语音数据缓冲区,在有效实现对语音数据的不间断采集的同时,解决了因USB接口芯片在存储过程中速度时快时慢造成的语音样点数据丢失的问题,保证了采集的语音数据的连续性。采用数目至少为语音数据缓冲区2倍的U盘数据缓冲区,有效地实现了采集的语音数据到U盘数据格式的转化。 

本发明的基于DSP的实时语音存储方法,设语音信号的采样频率为 KHz,采样宽度为bit,一帧语音数据包含的样点数为FRAME_SIZE个; 

所述数据处理存储主流程具体包括以下步骤:

a.定义变量,定义temp、flag、out_data_ready分别为已处理帧数、接收总帧数、语音样点数满一帧标志位; 定义in_index、temp1分别为帧内索引值、缓冲区内索引值;并将定义的所有变量清零;b.建立多个语音数据缓冲区,建立9个用于暂存语音数据的语音数据缓冲区,每个语音数据缓冲区的大小与一帧语音数据的大小相等,为FRAME_SIZE*n bit;c.建立U盘数据缓冲区,建立char类型的数目为语音数据缓冲区2倍的U盘数据缓冲区;d.判断采集样点数是否满一帧,判断语音样点数满一帧标志位out_data_ready是否为1,如果为1,则表明语音数据缓冲区中有至少一帧未处理的语音数据存在,执行步骤e;如果out_data_ready为0,则表明语音数据缓冲区中没有新的满一帧语音数据,执行步骤d;e.判断是否有且仅有一帧语音数据待处理,判断接收总帧数flag与已处理帧数temp之差是否为1,如果为1,则表明语音数据缓冲区中仅有一帧语音数据未处理,并将语音样点数满一帧标志位out_data_ready清零;如果不为1,执行步骤f;f.判断是否有语音数据被覆盖,如果接收总帧数flag大于或等于已处理帧数temp与9的之和,则表明语音数据缓冲区中已有或即将有数据被覆盖,退出主流程;否者,执行步骤g;g.判断待处理语音数据缓冲区,通过获取已处理帧数temp除以9之后的的余数,来判断语音数据缓冲区中待处理的语音数据缓冲区,余数为多少就代表第几个语音数据缓冲区待处理;h.存储数据,将U盘数据缓冲区中与待处理语音数据缓冲区相对应的数据存储至USB移动存储设备中;同时,将已处理帧数temp做加1操作;i.计时判断,通过已处理帧数temp的大小判断语音数据采集时间是否已到,如果已到,则退出主流程;如果总时间没到,则继续执行主流程;

所述语音数据采集子流程具体包括以下步骤:

1).产生中断,语音编解码模块根据采样频率为Hz,每过s时刻产生一次中断;2) .样点语音数据采集,DSP处理器将接收到的语音编解码模块的数据存储到相应的语音数据缓冲区上,每进行一次语音数据采集,将帧内索引值in_index和缓冲区内索引值temp1均加1;3).数据格式转化,将每次采集的语音数据转化为可存储到USB移动存储设备中的格式,将转化后的数据存储到U盘数据缓冲区中;4).判断语音数据缓冲区是否已满,判断缓冲区内索引值temp1是否达到9*FRAME_SIZE的大小,如果达到,则标示所有的语音数据缓冲区已满,将temp1置零,以便采集的语音数据重新从第一个语音数据缓冲区开始存储;如果没有达到9*FRAME_SIZE的大小,则执行步骤5);5).判断采样点数是否满一帧,判断帧内索引值in_index是否达到FRAME_SIZE的大小,如果已经达到,则将in_index置零、将out_data_ready置1以及将flag加1;如果没有达到,则不做任何操作。

本发明的基于DSP的实时语音存储方法,所述采样频率为8 KHz,采样宽度为16bit,一帧语音数据包含的样点数为750个,单个语音数据缓冲区的大小为750*16bit。 

本发明的基于DSP的实时语音存储方法,所述步骤3)中的数据格式转化方法为:将采集的16位语音数据的低8位赋值给char类型的U盘数据缓冲区的某一存储空间,将16位语音数据的高8位赋值给U盘数据缓冲区的下一存储空间。 

本发明的基于DSP的实时语音存储方法,所述数据处理存储主流程、语音数据采集子流程为不同的线程,在线程中采用了多缓冲区的数据存储模式,以避免因USB接口芯片的存储速度不均匀而造成语音数据样点的丢失。 

本发明的有益效果是:本发明的实时语音存储系统,通过预处理电路、语音编解码模块构成的语音信号采集模块,有效地实现了对声源的语音信号采集和编码;通过DSP处理器和存储模块构成的语音信号处理模块,高效地实现了语音信号的处理、暂存,并且具有USB主机接口的功能,保证了语音的采集与存储并行,避免了语音数据的丢失;通过USB接口芯片和USB接口电路,有效地将采集的语音数据存储到USB移动存储设备中。本发明的系统具有存储速度快、功耗低、体积小、方便使用等优点,可以作为精度要求较高的实时语音信号的采集终端,便于数据的存储。 

本发明的实时语音存储方法,通过建立9个以上的语音数据缓冲区,有效地实现了对外界语音数据的不间断采集,防止了语音数据的丢失;保证了存储数据的连续性。通过建立数目为语音数据缓冲区2倍的U盘数据缓冲区,有效地实现了对采集的语音数据的转化,保证了存储到USB移动存储设备中数据的正确性。本发明的存储方法,具有高速、实时和连续语音采集和存储特点,可实现不间断的语音数据采集,不会丢失语音样点,保证了语音记录的完整性。本发明存储方法中的数据处理存储主流程和语音数据采集子流程为不同的线程,在线程中采用了多缓冲区的数据存储模式,可有效避免因USB接口芯片的存储速度不均匀而造成语音数据样点的丢失问题。 

附图说

图1为本发明的基于DSP的实时语音存储系统的电路组成框图;

图2为本发明的语音存储方法中数据处理存储主流程的流程图;

图3为本发明的语音存储方法中语音数据采集子流程的流程图。

图中:1语音信号采集模块,2语音信号处理模块,3语音信号存储模块。 

具体实施方式

下面结合附图与实施例对本发明作进一步说明。 

如图1所示,给出了本发明的基于DSP的实时语音存储系统的电路原理图,其包括语音信号采集模块1、语音信号处理模块2和语音信号存储模块3,语音信号采集模块1由预处理电路和语音编解码模块组成;语音信号处理模块2由DSP处理器和存储器组成,存储器又包括FLASH存储器和SDRAM存储器;语音信号存储模块3由USB接口芯片和USB接口电路组成,USB接口电路用于直接与USB移动存储设备相连接。所示的语音编解码模块的输出与DSP处理器的输入端相连接,以便DSP处理器对编码后的语音信号进行采集;所示的DSP处理器的输出与USB接口芯片的输入端相连接,以便将采集的语音数据通过USB接口芯片存储到USB移动存储设备中。 

语音信号采集模块主要由预处理电路和语音编码模块两部分组成。预处理电路的主要作用是将声源信号的幅度进行调整,使得输入的音频信号满足语音编码模块的电平要求。语音编码模块采用的是TI公司的TLV320AIC23,该芯片是一个高性能的多媒体数字语音编解码器,它的内部ADC和DAC的转换模块带有完整的数字滤波器。数据传输宽度可以是16位、20位、24位和32位,采样频率范围支持8Khz到96Khz。 

语音信号处理模块主要由DSP处理器、FLASH存储器和SDRAM存储器组成。DSP处理器采用的是TI公司的TMS320VC5509A定点DSP芯片,作为系统的运算处理单元,该芯片具有2个乘法器(MAC),4个累加器(ACC),40位、16位的算术逻辑单元各一个,这大大增强了DSP的运算能力。TMS320VC5509A提供了高速多通道缓冲串口McBSP(Multi-channel Buffered serial ports),在本系统中DSP处理器通过McBSP与语音编码模块TLV320AIC23相连。McBSP具有全双工通信,双缓冲数据寄存器,允许传送连续的数据流,能够向CPU发送中断,可设置帧同步脉冲和时钟信号的极性等功能,这大大方便了DSP处理器采集音频信号。除此之外,TMS320VC5509A还提供了更为高效的外部存储器接口(EMIF),该接口可以与外设无缝连接,使得DSP处理器外部存储空间扩大到满足系统要求。DSP处理器通过EMIF接口与FLASH存储器、SDRAM存储器和USB接口芯片CH376相连接。FLASH存储器可以采用AMD公司的AM29LV800B,其容量为512K×16bits,在该系统的主要作用是存储程序代码。上电后,DSP处理器从外部FLASH存储器中加载并执行程序代码,使系统能够脱机运行。本系统中的SDRAM存储器采用的是HYNIX公司的HY57V161610E,容量为2Banks×512K×16bits,作为RAM的扩展,大大增强了DSP存储器的存储与运算能力。 

语音信号存储模块主要由USB接口芯片CH376和USB接口电路组成。CH376芯片是一种USB总线通用接口芯片,兼容USBV2.0,支持动态切换主机方式与设备方式。而且该芯片内置了USB通讯协议的基本固件和处理Mass-Storage海量存储设备的专用通讯协议的固件。CH376支持三种通讯接口:8位并口、SPI接口和异步串口,本系统中CH376通过并口与DSP相连接。CH376通过USB接口电路与USB外部移动设备相连接,对外设进行存取操作。 

如图2和图3所示,分别给出了语音存储方法中数据处理存储主流程和语音数据采集子流程的流程图;设语音信号的采样频率为=8KHz,采样宽度为=16bit,一帧语音数据包含的样点数为FRAME_SIZE=750个; 

所示的数据处理存储主流程具体包括以下步骤:

a.定义变量,定义temp、flag、out_data_ready分别为已处理帧数、接收总帧数、语音样点数满一帧标志位; 定义in_index、temp1分别为帧内索引值、缓冲区内索引值;并将定义的所有变量清零;

b.建立多个语音数据缓冲区,建立9个用于暂存语音数据的语音数据缓冲区,每个语音数据缓冲区的大小与一帧语音数据的大小相等,为FRAME_SIZE*n bit;

c.建立U盘数据缓冲区,建立char类型的数目为语音数据缓冲区2倍的U盘数据缓冲区;

d.判断采集样点数是否满一帧,判断语音样点数满一帧标志位out_data_ready是否为1,如果为1,则表明语音数据缓冲区中有至少一帧未处理的语音数据存在,执行步骤e;如果out_data_ready为0,则表明语音数据缓冲区中没有新的满一帧语音数据,执行步骤d;

e.判断是否有且仅有一帧语音数据待处理,判断接收总帧数flag与已处理帧数temp之差是否为1,如果为1,则表明语音数据缓冲区中仅有一帧语音数据未处理,并将语音样点数满一帧标志位out_data_ready清零;如果不为1,执行步骤f;

f.判断是否有语音数据被覆盖,如果接收总帧数flag大于或等于已处理帧数temp与9的之和,则表明语音数据缓冲区中已有或即将有数据被覆盖,退出主流程;否者,执行步骤g;

g.判断待处理语音数据缓冲区,通过获取已处理帧数temp除以9之后的的余数,来判断语音数据缓冲区中待处理的语音数据缓冲区,余数为多少就代表第几个语音数据缓冲区待处理;

h.存储数据,将U盘数据缓冲区中与待处理语音数据缓冲区相对应的数据存储至USB移动存储设备中;同时,将已处理帧数temp做加1操作;

i.计时判断,通过已处理帧数temp的大小判断语音数据采集时间是否已到,如果已到,则退出主流程;如果总时间没到,则继续执行主流程;

所示的语音数据采集子流程具体包括以下步骤:

1).产生中断,语音编解码模块根据采样频率为Hz,每过s时刻产生一次中断;

2) .样点语音数据采集,DSP处理器将接收到的语音编解码模块的数据存储到相应的语音数据缓冲区上,每进行一次语音数据采集,将帧内索引值in_index和缓冲区内索引值temp1均加1;

3).数据格式转化,将每次采集的语音数据转化为可存储到USB移动存储设备中的格式,将转化后的数据存储到U盘数据缓冲区中;

4).判断语音数据缓冲区是否已满,判断缓冲区内索引值temp1是否达到9*FRAME_SIZE的大小,如果达到,则标示所有的语音数据缓冲区已满,将temp1置零,以便采集的语音数据重新从第一个语音数据缓冲区开始存储;如果没有达到9*FRAME_SIZE的大小,则执行步骤5);

5).判断采样点数是否满一帧,判断帧内索引值in_index是否达到FRAME_SIZE的大小,如果已经达到,则将in_index置零、将out_data_ready置1以及将flag加1;如果没有达到,则不做任何操作。

为了充分、详细地说明本发明的实时语音存储方法,下面给出采用C语言编写的具体程序代码: 

#include <stdio.h>

#include <string.h>

#include "Macro.h"

#include "HAL.H"

#include "DEBUG.H"

#include "FILE_SYS.H"

#include "5509.h"

#include "util.h"

#include "myapp.h"

#include "function.h"

#include "Basic_op.h"

#define FRAME_SIZE  750      /*一帧语音数据包含的数据样点数为  750*/

unsigned long int temp;   /*已处理帧数的索引值*/

long int in_index=0;       /*帧内索引值*/

unsigned long int  flag=0;  /*接收总帧数的索引值*/

int out_data_ready=0;      /*语音样点满一帧的标志位*/

short total=0;             /*数据格式转化的索引值*/

char FileDataBuf[18*FRAME_SIZE];  /*往U盘中存储的数据的 总 缓冲区*/

char mybuffer[2*FRAME_SIZE]; /*每次往U 盘中 存储的 数据数组*/

#pragma DATA_SECTION(message, ".buff1");

#pragma DATA_SECTION(in_data, ".buff1");

#pragma DATA_SECTION(out_speech, ".buff1");

short message[9*FRAME_SIZE]; /*采集数据存储的缓冲区间   共 9个缓冲区*/

 short temp1=0;             /* 缓冲区内索引值*/

Udisk( ) {

  UINT16        i, s,j;

  P_FAT_DIR_INFO   pDir;

  UINT8 TarName[64];

   PC55XX_MMR pMMR=(PC55XX_MMR)C55XX_MMR_ADDR;

 /*----------中断初始化----------------------*/

  INT_init();

/*-----------------音频初始化-----------------------*/

  AIC23_Init();

/*-----------------CH376初始化-------------------*/

    #if 1

  mDelaymS( 100 );  /* 延时100毫秒 */

  puts( "Start\n" );

  s = mInitCH376Host( );  /* 初始化CH376 */ 

  mStopIfError( s );

     puts( "Wait Udisk/SD\n" );

     while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) { 

        mDelaymS( 100 );

     }

     mDelaymS( 200 );  /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */

     for ( i = 0; i < 100; i ++ ) { /* 最长等待时间,100*50mS */

        mDelaymS( 50 );

        puts( "Ready \n" );

        s = CH376DiskMount( );  /* 初始化磁盘并测试磁盘是否就绪 */

        if ( s == USB_INT_SUCCESS ) break;  /* 准备好 */

        else if ( s == ERR_DISK_DISCON ) break;  /* 检测到断开,重新检测并计时 */

        if ( CH376GetDiskStatus( ) >= DEF_DISK_MOUNTED && i >= 5 ) break;  /* 有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试5*50mS */

     }

     if ( s == ERR_DISK_DISCON ) {  /* 检测到断开,重新检测并计时 */

        puts( "Device gone\n" );

     }

/*-----------------创建文件-----------------------*/

    strcpy( TarName, "\TEST.PCM" ); 

     puts( "Create\n" );

     s = CH376FileCreate( TarName ); 

     mStopIfError( s );

     puts( "Write...\n" );

  #endif

   /*-------------------------初始化一些变量------------*/  temp=0;

  temp1=0;

  flag=0;

  in_index=0;

  filter_index=0;

  filter_ready=0;

  out_data_ready=0;

   /*--------------------------开中断-------------------*/

  asm(" BSET INTM");

    pMMR->ier0=0x0020; /*enable debug xint0*/

  asm(" BCLR INTM ");

   while(1){/* 主程序的循环  将接收到的语音数据存储到U盘中*/

            if(out_data_ready==1)  /*至少有 一帧 数据的缓冲区已满*/

      { 

              if(flag==(temp+1)) /*如果在中断中接收的帧数flag 等于处理的帧数 temp+1 则说明 已满的缓冲区  即将处理完毕  ,将数据帧 满一帧 的标志out_data_ready清0;*/         

             {

              out_data_ready=0;

             }

             if(flag>=(temp+9)) /*如果在中断中接收的帧数flag 大于等于处理的帧数 temp+9,则造成 未处理的数据 被覆盖,则显示报错信息,并退出主程序*/

             {             

                puts( "data overlap\n" );

                 break;

             }    

         if((temp%9)==0)   /*判断  待处理的数据 是第一个缓冲区中的数据吗  如果是 将第一个缓冲区中的数据  FileDataBuf 数组  拷贝到  mybuffer 数组中*/

              {                  

              memcpy(mybuffer,FileDataBuf,2*FRAME_SIZE);

               }

         else if((temp%9)==1)   /*判断  待处理的数据 是第2个缓冲区中的数据吗  如果是 将第2个缓冲区中的数据  FileDataBuf+FRAME_SIZE*2 数组  拷贝到  mybuffer 数组中*/

           { 

                memcpy(mybuffer,FileDataBuf+FRAME_SIZE*2,2*FRAME_SIZE);

             }

          else if((temp%9)==2)  /*判断  待处理的数据 是第3个缓冲区中的数据吗  如果是 将第3个缓冲区中的数据  FileDataBuf+FRAME_SIZE*4 数组  拷贝到  mybuffer 数组中*/

          { 

               memcpy(mybuffer,FileDataBuf+FRAME_SIZE*4,2*FRAME_SIZE);

           }

        else if((temp%9)==3)  /*判断  待处理的数据 是第4个缓冲区中的数据吗  如果是 将第4个缓冲区中的数据  FileDataBuf+FRAME_SIZE*6 数组  拷贝到  mybuffer 数组中*/

          {    

              memcpy(mybuffer,FileDataBuf+FRAME_SIZE*6,2*FRAME_SIZE);

            }

        else if((temp%9)==4)  /*判断  待处理的数据 是第5个缓冲区中的数据吗  如果是 将第5个缓冲区中的数据  FileDataBuf+FRAME_SIZE*8 数组  拷贝到  mybuffer 数组中*/

          { 

           memcpy(mybuffer,FileDataBuf+FRAME_SIZE*8,2*FRAME_SIZE);

            }

       else if((temp%9)==5)  /*判断  待处理的数据 是第6个缓冲区中的数据吗  如果是 将第6个缓冲区中的数据  FileDataBuf+FRAME_SIZE*10 数组  拷贝到  mybuffer 数组中*/

          {    

              memcpy(mybuffer,FileDataBuf+FRAME_SIZE*10,2*FRAME_SIZE);

           }

          else if((temp%9)==6) /*判断  待处理的数据 是第7个缓冲区中的数据吗  如果是 将第7个缓冲区中的数据  FileDataBuf+FRAME_SIZE*12 数组  拷贝到  mybuffer 数组中*/

          { 

             memcpy(mybuffer,FileDataBuf+FRAME_SIZE*12,2*FRAME_SIZE);

          }

          else if((temp%9)==7) /*判断  待处理的数据 是第8个缓冲区中的数据吗  如果是 将第8个缓冲区中的数据  FileDataBuf+FRAME_SIZE*14 数组  拷贝到  mybuffer 数组中*/

          { 

            memcpy(mybuffer,FileDataBuf+FRAME_SIZE*14,2*FRAME_SIZE);

          }

          else if((temp%9)==8) /*判断  待处理的数据 是第9个缓冲区中的数据吗  如果是 将第9个缓冲区中的数据  FileDataBuf+FRAME_SIZE*16 数组  拷贝到  mybuffer 数组中*/

          { 

           memcpy(mybuffer,FileDataBuf+FRAME_SIZE*16,2*FRAME_SIZE);

            }

        s=CH376ByteWrite( mybuffer, 2*FRAME_SIZE, NULL );  /*将mybuffer中的数据 直接存储到U盘中*/

           mStopIfError( s );         

          temp++;   /*处理的数据帧数 加1 */

         if(temp==(32250/FRAME_SIZE)*15*50)  /*如果处理帧数 达到一定的值后,即时间达到50分钟时 则退出循环*/

          break;

          }

      }

        #if 1

     puts( "Close...\n" );      /*关闭U盘*/

     s = CH376FileClose( TRUE );  

     mStopIfError( s );

     puts( "U disk operation is complete!\n" );  /*U盘 操作结束*/

     puts( "Please remove U disk!\n" );

     while ( CH376DiskConnect( ) == USB_INT_SUCCESS ) {  /* 检查U盘是否连接,等待U盘拔出 */

        mDelaymS( 100 );

     }

     mDelaymS( 200 );

          #endif

}

interrupt void rint0Isr( void )

{

  PC55XX_MCSP pMCBSP0 = (PC55XX_MCSP)C55XX_MSP0_ADDR;     

  message[temp1]=Read(pMCBSP0 -> ddr1); /*right channel  采集语音样点 保存到缓冲 区中*/

     FileDataBuf[total]  =0; /*往U盘中存储的数据 清0*/

     FileDataBuf[total+1]=0; /*往U盘中存储的数据 清0*/

   FileDataBuf[total]=(char)((message[temp1])&0x00ff);  /*将采集的语音样点 转换成往U盘中存储的格式 将语音样点的低八位 赋值给  FileDataBuf  */ FileDataBuf[total+1]=(char)((message[temp1]&0xff00)>>8); /* 将采集的语音样点 转换成往U盘中存储的格式 将语音样点的高八位 赋值给  FileDataBuf*/

       in_index++;

      temp1++;  /*样点数 加1*/

    if(temp1==9*FRAME_SIZE) /*九个缓冲区满了 清0*/

      temp1=0;   

     total=total+2;      

    if(total==18*FRAME_SIZE)

         total=0;

  if(in_index==FRAME_SIZE) {   /*是否满一帧*/

        in_index=0;

        flag++;

       out_data_ready=1;                

       }

} 。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号