语音合成的思路、语音的声学特征、声音采样的一些资料

语音合成:把语音波形文件重现,以一种灵活的方式,只用极少数的基础数据,比如元音辅音的语音参数,那么首先需要研究元音辅音的语音学性质。

先从元音开始,根据相关资料,不同的元音是由相同的原始声带音通过不同的共振腔(由声腔形状的变化决定)产生不同的共振效果,导致其频谱发生很大变化而得以区分。一般来说每个频谱都有三个振幅比较强的频率区,在频谱上呈现为波峰状,称为“共振峰”(formant),从低频到高频顺序排列为第一共振峰、第二共振峰和第三共振峰,简称为F1、F2、F3,还可以有F4、F5,不过与语音关系不大,因此忽略。

原始声带音的基本特点是,谐波的频率越高,振幅就越小,频谱的振幅曲线从高到低,形成明显的斜坡,原始声带音的频率称为基频F0(疑问:原始声带音的频谱图中有多个频率,哪一个是基频?难道都是?)

元音的共振峰频率和基频之间没有相互依存的关系。基频由声带颤动的频率决定,共振峰频率则取决于共振腔的形状,两种频率的变化是彼此独立的。

要注意对频谱图和波形图的对照使用:二维频谱所表现的只是频率和振幅的二维关系,并没有包括时间因素,分析一个音段,不论切分得多么小,都必然占有一段时间,只有能够反映频率、振幅、时间三维关系的频谱,才能够把一个音段的声学特征全部表现出来。比如现代语音学研究常用的语图仪就是这样一种动态频谱仪,语图仪输出的语图中,横坐标是时间,单位毫秒,纵坐标是频率,单位HZ,振幅的强弱通过图形痕迹的浓度来表示,颜色越深,说明振幅越强,颜色越浅,说明振幅越小,振幅的单位是分贝dB。

波形图用来描述时域信号,横轴为时间(可以直观地看到波形周期),纵轴为振幅;频谱图用来描述频域信号,横轴为频率,纵轴为dB化的幅值,时域信号和频域信号可以通过FFT、IFFT算法来转换(快速傅里叶变换和快速傅里叶变换的逆变换),有很多在时域无法完成的信号处理算法可以在频域上轻松处理。缺点是使用FFT会出现频谱泄露。

频谱图:

频谱图

频谱图来自 http://www.innovateasia.com/cn/win_2008/CN321.htm

 

语图(下面的图,上面那个是波形图):

语图I

语图来自 中国社会科学院语言研究所语音研究室(http://ling.cass.cn/yuyin/spectrum/spectrum.htm)


http://www.it9000.cn/tech/CTI/wav.html

WAV文件格式介绍

文件是Windows标准的文件格式,WAV文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange FileFormat的缩写,每个WAV文件的头四个字节便是“RIFF”。WAV文件由文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分。WAV文件各部分内容及格式见附表。常见的声音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH); 而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。WAV文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAV文件是由样本组织而成的。在单声道WAV文件中,声道0代表左声道,声道1代表右声道。在多声道WAV文件中,样本是交替出现的。

WAV文件格式说明表

文件头 偏移地址 字节数 数据类型 内 容
00 H 4 char "RIFF"标志
04 H 4 long int 文件长度
08 H 4 char "WAV"标志
0C H 4 char "fmt"标志
10 H 4   过渡字节(不定)
14 H 2 int 格式类别(10H为PCM形式的声音数据)
16 H 2 int 单声道为1,双声道为2通道数
18 H 2 int 采样率(每秒样本数),表示每个通道的播放速度
1C H 4 long 波形音频数据传送速率,其值为通道数×每秒数据位数×每样 本的数据位数/8。播放软件利用此值可以估计缓冲区的大小
22 H 2   每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多 个声道,对每个声道而言,样本大小都一样。 24H 4 char 数据标记符"data" 28H 4 long int 语音数据的长度

PCM数据的存放方式:

样本1  样本2

8位单声道 0声道 0声道

8位立体声 0声道(左) 1声道(右) 0声道(左) 1声道(右)

16位单声道 0声道低字节 0声道高字节 0声道低字节 0声道高字节

16位立体声 0声道(左)低字节 0声道(左)高字节 1声道(右)低字节 1声道(右)高字节

PCM数据的存放方式:

WAV文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需 的最小字节数。首先存储低有效字节,表示样本幅度的位放在i的高有效位上, 剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。

样本大小 数据格式 最大值 最小值
8位PCM unsigned int 225 0
16位PCM int 327 67

 

http://210.28.216.200/cai/dmtjishu/course2/course2-1.htm#nowhere

一. 模拟音频和数字音频

  1.模拟音频

语音合成的思路、语音的声学特征、声音采样的一些资料  物体振动产生声音,为了记录和保存声音信号,先后诞生了机械录音(以留声机、机械唱片为代表)、光学录音(以电影胶片为代表)、磁性录音(以磁带录音为代表)等模拟录音方式,二十世纪七、八十年代开始进入了数字录音的时代。

  声音是机械振动在弹性介质中传播的机械波。声音的强弱体现在声波压力的大小上,音调的高低体现在声音的频率上。声音用电表示时,声音信号在时间和幅度上都是连续的模拟信号。声音信号的两个基本参数是频率和幅度。频率是指信号每秒钟变化的次数,用Hz表示。幅度是指信号的强弱。

  2.数字音频

  数字音频主要包括两类:波形音频和MIDI音频。

  模拟声音在时间和幅度上是连续的,声音的数字化是通过采样、量化和编码,把模拟量表示的音频信号转换成由许多二进制数1和0组成的数字音频信号。数字音频是一个数据序列,在时间和幅度上是断续的。

  计算机内的基本数制是二进制,为此我们要把声音数据写成计算机的数据格式。将连续的模拟音频信号转换成有限个数字表示的离散序列(即实现音频数字化),在这一处理技术中,涉及到音频的采样、量化和编码。

  二.数字音频的采样和量化

语音合成的思路、语音的声学特征、声音采样的一些资料  声音进入计算机的第一步就是数字化,数字化实际上就是采样和量化。连续时间的离散化通过采样来实现,如果每隔相等的一小段时间采样一次,称为均匀采样(uniform sampling);连续幅度的离散化通过量化(quantization)来实现,把信号的强度划分成一小段一小段,如果幅度的划分是等间隔的,就称为线性量化,否则就称为非线性量化。

  在数字音频技术中,把表示声音强弱的模拟电压用数字表示,如0.5V电压用数字20表示,2V电压是80表示。模拟电压的幅度,即使在某电平范围内,仍然可以有无穷多个,如1.2V,1.21V,1.215V…。而用数字来表示音频幅度时,只能把无穷多个电压幅度用有限个数字表示。即把某一幅度范围内的电压用一个数字表示,这称之为量化。

  计算机内的基本数制是二进制,为此我们也要把声音数据写成计算机的数据格式,这称之为编码,模拟电压幅度、量化、编码的关系举例如下表。

模拟电压、量化和编码
电压范围(V)
量化(十进制数)
编码(二进制数)
0.5~0.7
2
011
0.3~0.5
3
010
0.1~0.3
1
001
-0.1~0.1
0
000
-0.3~-0.1
-1
111
-0.5~-0.3
-2
110
-0.7~-0.5
-3
101
-0.9~-0.7
-4
100

声音数字化需要回答两个问题:①每秒钟需要采集多少个声音样本,也就是采样频率(fs)是多少,②每个声音样本的位数(bit per sample,bps)应该是多少,也就是量化精度。

  1. 采样频率

  采样频率是指将模拟声音波形数字化时,每秒钟所抽取声波幅度样本的次数,采样频率的计算单位是kHz。通常,采样频率越高声音失真越小,但用于存储音频的数据量也越大。

  音频实际上是连续信号,或称连续时间函数x(t)。用计算机处理这些信号时,必须先对连续信号采样,即按一定的时间间隔(T)取值, 得到x(nT)(n为整数)。T称采样周期,1/T称为采样频率。称x(nT)为离散信号。离散信号 x(nT) 是从连续信号 x(t) 上取出的一部分值。

  采样定理:设连续信号x(t)的频谱为x(f),以采样间隔T采样得到离散信号x(nT),如果满足:

    当|f|≥fc时,fc是截止频率

    T≤ 1/2fc 或fc≤ 1/2T

    则可以由离散信号x(nT)完全确定连续信号x(t)。

    当采样频率等于1/(2T)时,即fN =1/2T,称fN为奈奎斯特频率。

  采样频率的高低是根据奈奎斯特理论(Nyquist theory)和声音信号本身的最高频率决定的。奈奎斯特理论指出,采样频率不应低于声音信号最高频率的两倍,这样就能把以数字表达的声音还原成原来的声音,这叫做无损数字化(lossless digitization)。

  通常人耳能听到频率范围大约在20Hz~20kHz之间的声音,根据奈奎斯特理论,为了保证声音不失真,采样频率应在40kHz左右。常用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等。


  2. 量化精度(也称量化位数、量化级、样本尺寸、采样精度等)

  量化是将经过采样得到的离散数据转换成二进制数的过程,量化精度是每个采样点能够表示的数据范围,在计算机中音频的量化位数一般为4、8、16、32位(bit)等。例如:量化精度为8bit时,每个采样点可以表示256个不同的量化值,而量化精度为16bit时,每个采样点可以表示65536个不同的量化值。量化精度的大小影响到声音的质量,显然,位数越多,量化后的波形越接近原始波形,声音的质量越高,而需要的存储空间也越多;位数越少,声音的质量越低,需要的存储空间越少。

  采样精度的另一种表示方法是信号噪声比,简称为信噪比(signal-to-noise ratio,SNR),并用下式计算:

   SNR= 10 log [(Vsignal)2 / (Vnoise)2]=20 log (Vsignal / Vnoise) 
   其中,Vsignal表示信号电压,Vnoise表示噪声电压;SNR的单位为分贝(db)

   例1:假设Vnoise=1,采样精度为1位表示Vsignal=21,它的信噪比SNR=6分贝。 
   例2:假设Vnoise=1,采样精度为16位表示Vsignal=216,它的信噪比SNR=96分贝。

  量化采样的过程如下:先将整个幅度划分成为有限个小幅度(量化阶距)的集合,把落入某个阶距内的样值归为一类,并赋予相同的量化值。

  如果量化值是均匀分布的,我们称之为均匀量化,也称为线性量化。

语音合成的思路、语音的声学特征、声音采样的一些资料均匀量化

  如果大输入信号采用大的量化间隔,小输入信号采用小的量化间隔,这样就可以在满足精度要求的情况下使用较小的位数来表示。数据还原时采用相同的原则。量化值是非均匀分布的,我们称之为非均匀量化,也称非线性量化。

语音合成的思路、语音的声学特征、声音采样的一些资料 非均匀量化


  3. 声道数  

  记录声音时,如果每次生成一个声波数据,称为单声道;每次生成两个声波数据,称为双声道。使用双声道记录声音,能够在一定程度上再现声音的方位,反映人耳的听觉特性。

  4. 声音质量与数据率

  根据声音的频带,通常把声音的质量分成5个等级,由低到高分别是电话(telephone)、调幅(amplitude modulation,AM)广播、调频(frequency modulation,FM)广播、激光唱盘(CD-Audio)和数字录音带(digital audio tape,DAT)的声音。在这5个等级中,使用的采样频率、样本精度、通道数和数据率列于下表。
表: 声音质量和数据率
质量

采样频率(kHz)

样本精度(bit/s)

单道声/立体声

数据率(kB/s) (未压缩)

频率范围

TEL

8

8

单道声

8

200~3400 Hz

AM

11.025

8

单道声

11.0

50~7000Hz

FM

22.050

16

立体声

88.2

20~15000Hz

Adobe SystemsCD

44.1

16

立体声

176.4

20~20000 Hz

DAT

48

16

立体声

192.0

20~20000 Hz


  5. 数字音频的存储

  一般来说,采样频率、量化位数越高,声音质量也就越高,保存这段声音所用的空间也就越大。立体声(双声道)是单声道文件的两倍。
  即:文件大小(B)=采样频率(Hz)×录音时间(S)×(量化精度/8)×声道数(单声道为1,立体声为2)

  如:录制1分钟采样频率为44.1KHz,量化精度为16位,立体声的声音(CD音质),文件大小为:
    44.1×1000×60×(16/8)×2=10584000B≈10.09M

  三. 数字音频的文件格式

  声音数据有多种存储格式,这里我们主要介绍WAV 文件、MIDI文件。

  1. WAV 文件  

  WAV 文件主要用在PC上,是微软公司的音频文件格式,又称为波形文件格式,它来源于对声音模拟波形的采样,用不同的采样频率对声音的模拟波形进行采样可以得到一系列离散的采样点,以不同的量化位数把这些采样点的值转换成二进制数,然后存盘,就产生了声音的WAV文件。

  声音是由采样数据组成的,所以它需要的存储容量很大。用前面我们介绍的公式可以简单的推算出WAV文件的文件大小。


  2. MIDI文件  

  MIDI是Musical Instrument Digital Interface的首写字母组合词,可译成“电子乐器数字接口”。用于在音乐合成器(music synthesizers)、乐器(musical instruments)和计算机之间交换音乐信息的一种标准协议。MIDI是乐器和计算机使用的标准语言,是一套指令(即命令的约定),它指示乐器即MIDI设备要做什么,怎么做,如演奏音符、加大音量、生成音响效果等。MIDI不是声音信号,在MIDI电缆上传送的不是声音,而是发给MIDI设备或其它装置让它产生声音或执行某个动作的指令。当信息通过一个音乐或声音合成器进行播放时,该合成器对系列的MIDI信息进行解释,然后产生出相应的一段音乐或声音。

  记录MIDI信息的标准格式文件称为MIDI文件,其中包含音符、定时和多达16个通道的乐器定义以及键号、通道号、持续时间、音量和击键力度等各个音符的有关信息。由于MIDI文件是一系列指令而不是波形数据的集合,所以其要求的存储空间较小。


  3. WAV文件和MIDI文件的区别


  WAV文件记录的是声音的波形,要求较大的数据空间;MIDI文件记录的是一系列的指令,文件紧凑占用空间小,预先装载比WAV容易,设计播放所需音频的灵活性较大。WAV文件可编辑性好于MIDI,音质饱满。

  WAV文件适合于:
    (1) 计算机资源足够处理数字文件。
    (2) 有语言会话的需要。 
    (3) 对回放设备没有特定要求。

  MIDI文件适合于: 
    (1) 没有足够的RAM、硬盘空间或CPU处理能力 
    (2) 具备符合要求的回放设备 
    (3) 具有高质量的声源 
    (4) 没有语言对话的需要

表: 常见的数字声音文件扩展名

文件的扩展名

说明

au

Sun和NeXT公司的声音文件存储格式(8位μ律编码或者16位线性编码)

Aif

Apple计算机上的声音文件存储格式(Audio Interchange File Format)

ape

Monkey's Audio

mid

Windows的MIDI文件存储格式

mp3

MPEG Layer III

rm

RealNetworks公司的流放式声音文件格式(RealMedia)

ra

RealNetworks公司的流放式声音文件格式(RealAudio)

voc

声霸卡存储的声音文件存储格式(Creative Voice)

wav

Windows采用的波形声音文件存储格式

wrk

Cakewalk Pro软件采用的MIDI文件存储格式

四.音频信号的特点

  音频信号处理的特点如下:
  (1) 音频信号是时间依赖的连续媒体。因此音频处理的时序性要求很高,如果在时间上有 25ms 的延迟,人就会感到断续。
  (2) 理想的合成声音应是立体声。由于人接收声音有两个通道(左耳、右耳),因此计算机模拟自然声音也应有两个声道,即立体声。
  (3) 由于语音信号不仅仅是声音的载体,同时情感等信息也包含其中,因此对语音信号的处理,要抽取语意等其它信息,如可能会涉及到语言学、社会学、声学等。

  从人与计算机交互的角度来看音频信号相应的处理如下:
  (1) 人与计算机通信(计算机接收音频信号)。音频获取,语音识别与理解。
  (2) 计算机与人通信(计算机输出音频)。 音频合成( 音乐合成,语音合成)、声音定位(立体声模拟、音频/视频同步)。
  (3) 人—计算机—人通信:人通过网络,与处于异地的人进行语音通信,需要的音频处理包括:语音采集、音频编码/解码、音频传输等。这里音频编/解码技术是信道利用率的关键。

 

http://www.chinaaet.com/article/index.aspx?id=14965

语音信号产生模型的建立及应用

王莉华 时间:2009年06月09日

关键词: 语音信号 语音产生模型 数字滤波器 特征参数 线性预测编码

    摘 要:从人类语音产生的机理出发,介绍了语音信号的特征和语音信号的语谱图,引出了语音信号的产生模型。同时讨论了在语音信号产生的模型应用中,线性预测编码方法及语音产生模型在语音合成和语音识别中的应用原理,体现了语音产生模型在语音处理技术方面的重要地位。
    关键词:模型;频率;线性预测编码

 

    语音由一连串的音所组成,这些音及其相互间的过渡就是代表信息的符号。这些符号的排列由语音的规则所控制。对这些规则及其在人类通信中的含义的研究属于语言学的范畴。但对语音信号加以处理以改善或提取信息时,有必要对语音产生的机理进行讨论。
    图1为发音器官示意图。声道起始于声带的开口(即声门处)而终止于嘴唇,它包含了咽喉(连接食道和口)和口(或称为口腔)。声道的截面积取决于舌、唇、颌以及小舌的位置,它可以从0 (完全闭合)变化到约20 cm2,鼻道则从小舌开始到鼻孔为止。当小舌下垂时,鼻道与声道发生声耦合而产生语音中的鼻音。另外,图中还包含了由肺、支气管、气管组成的次声门系统,这个次声门系统是产生语音能量的源泉。当空气从肺里呼出时,呼出的气流由于声道某一地方的收缩而受到扰动,语音就是这一系统在此时辐射出来的声波。

 

语音合成的思路、语音的声学特征、声音采样的一些资料


    语音的声音按其激励形式的不同可分为三类:浊音、摩擦音和爆破音。浊音:当气流通过声门时,如果声带的张力刚好使声带发生张弛振荡式的振动,就能产生准周期的空气脉冲,这一空气脉冲激励声道得到浊音,如音标中的“U”、“d”、“w”、“i”、“e”等为浊音。摩擦音或称为清音:如果声道在某处(一般在接近嘴的那端)发生收缩,同时迫使空气以高速冲过这一收缩部分而产生湍流,从而得到摩擦音,此时建立的宽带噪声源激励了声道,如音标中的“∫”就是摩擦音;爆破音:如果使声道前部完全闭合,在闭合后建立起气压,然后突然释放,这样就得到了爆破音,如音标中的“t∫”就是爆破激励产生的。
1 语音信号的特征和语谱图
    图1中声道和鼻道都表示为非均匀截面的声管,当声音产生以后就顺着声管传播,它的频谱形状会被声管的选择性所改变。这类似于人们在管风琴或管乐器中所看到的谐振现象。在此将声道管的谐振频率称为共振峰频率。共振峰频率和声道的形状与大小有关,每种形状都有一套共振峰频率作为其特征。改变声道的形状就产生不同的声音,因此,当声道形状改变时,语音信号的谱特性也随之改变。
    语谱图是通过语谱仪画出的、以显示语音信号的通用图。它的垂直方向表示频率,水平方向表示时间。图2表示了一段英语语句的语音信号。

 

语音合成的思路、语音的声学特征、声音采样的一些资料


    获得这些图的原理大致如下:
    首先把语音信号拆成短的时段,一般为2 ms~40 ms,然后在合适的窗口长度上使用FFT找每一短时段的频谱。图中每一点表示在给定时间和给定频率范围内频谱的能量。段的长度是根据频率分辨率和时间分辨率要求折中选择的。目前数字信号处理技术水平已能够实时处理语音频谱随时间的变化,这就意味着, FFT和显示处理能够在下一段数据捕获前完成。例如,采样频率为8 kHz(由采样定理知,信号带宽的上限为4 kHz),一段长度内有256个采样点,FFT和显示处理时间必须小于32 ms。
    从英文字“rain”中字母a的实例表明:语音信号有周期的时域波形,如图2(a)所示;它的频谱类似于一串有间隔的谐波,如图2(b)所示。同样,字“storm”中的字母s的实例表明:摩擦音时域信号为噪声,如图2(c)所示,它的频谱如图2(d)所示。这个频谱证明对声音的2个主要源都存在共振峰频率的影响。
    在图3中,图的下半部分是相应的语谱图,语音能量由颜色的深浅来表示,颜色越深,语音能量越强。

 

语音合成的思路、语音的声学特征、声音采样的一些资料


    由图3可知,语音样例“他去无锡市,我到黑龙江”的每一个汉字的发音对应一组频谱,有其基音和谐波。基音和谐波的宽度不等说明有共振峰频率的影响。从短时稳定的频谱存在说明语音信号存在短期相关性,即尽管模拟声道的数字滤波器参数是随时间改变的,但是在很短的时间(如几毫秒)内,由于存在确定的周期性频谱,因而可以认为,在该段时间内,数字滤波器参数不随时间而变化。可以使用线性预测方法,即一个语音采样值能够由前面若干个采样值的组合逼近,故称为线性预测。因此,每一个汉字语音对应一组线性预测系数,也就是对应一组确定的声道数字滤波器系数。
2  语音信号的产生模型
    根据上面的分析,可以用近期所有语音合成和识别技术采用的人类语音模型来模拟语音信号的产生,如图4所示。

 

语音合成的思路、语音的声学特征、声音采样的一些资料

 

    用随机噪声发生器产生噪声源模拟摩擦音(汉语称清音),利用音调或称基音周期控制脉冲串产生器模拟元音(汉语称浊音)。用增益函数表示声音振幅。模拟声道的数字滤波器是一个线性时变滤波器。
3  线性预测编码(LPC)
    线性预测编码LPC( Line Predictive Coding )方法在语音信号产生模型应用中是至关重要的,下面给出它的物理概念和方法。采样后的语音是离散信号,可以利用Z变换进行分析计算。设声道滤波器为一个全极点滤波器,其传递函数为V(z),则输出信号为:
    S(z)=E(z)×V(z)=G×E(z)/A(z)                              (1)
式中,E(z)为声道滤波器的激励e(n)的Z变换;A(z)为声道滤波器的逆滤波器,是全零点滤波器;G为增益函数,表示声音振幅的一个参数;S(z)为合成的语音。在已知激励和滤波器参数后,可得到合成语音,故(1)式称为合成模型。由(1)式可得:
    E(z)=S(z)×A(z)                                           (2)
(2)式为(1)式的逆运算,故称为语音分析模型。
    若逆滤波器为A(z),输入语音信号为S(z),则输出即为激励信号E(z)。然而,A(z)是未知的,需要使用线性预测的方法求得。
    因为A(z)是全零点滤波器,其结构如图5所示。通过证明可得:
    
    即A(z)是由M节滤波器组成,式中i是滤波器的阶数,ai是逆滤波器的系数,有待确定。把(3)式代入(2)式,并将Z变换的式子转换为离散值来写,则有:
    
    (4)式说明对样本序列值S(n),n时刻序列值由它前面M个样本线性预测得到。即:
    
    同时表示,激励信号e(n)是语音信号S(n)与预测信号之差,称为预测误差。(5)式可写为Z变换形式:
    
式中,F(z)为预测滤波器值,若输入A(z),输出即为预测值,见图5。

 

语音合成的思路、语音的声学特征、声音采样的一些资料

 

    可见,这里存在2个滤波器,1个是预测滤波器F(z),可用来求预测值;另一个为逆滤波器,它等于1-F(z),可用来从激励信号求出重建的语音信号。使用这2个滤波器关键是求系数ai。利用公式(4),预测误差e(n)越小,预测值越接近信号值S(n)。可采用e(n)的最小均方误差准则来确定ai的系数。若S(n)已知,在短时间范围内(如20 ms),在8 kHz采样频率下就有160个S(n)样本点,利用它来训练预测滤波器A(z),系数ai就可以确定。系数ai是时变的,但在短的时限内是不变的。因此,在线性预测算法中,系数ai的计算每帧都要进行1次,当前帧系数ai计算值作为下一次计算时用。
4  语音产生模型的应用
    语音产生模型说明一个短时的语音信号可以用3个参数来定义:(1)从周期性波和随机噪声中选择1个作为激发态;(2)如果使用周期性波,必须选择1个频率作为基音;(3)模拟声道响应所使用的数字滤波器系数。
4.1 语音产生模型在语音合成技术中的应用
    早期产品中应用到的连续语音合成技术,是借助于大约以每秒40次速度修改上述的短时语音信号的3个参数来实现的。如适合儿童学习的“说和拼音机”。由于它仅仅采用26个英文字母作为音库,因而这种语音合成的声音质量不高,声音非常机械。
    此后,用汉字语音作为库,用波形拼接方法进行语音合成,效果有所改进,但是库的存储量太大。解决的方案是,使用语音分析方法,即利用语音产生模型概念,把一个语音信号分解成下列特性参数:线性预测系数(取10个)、基音周期范围、基音周期数目(基音持续时间)和清音存在时间等。根据ITU-T G.729语音编码方法,一帧语音信号特征参数仅需80 bit,即80个16 bit样本压缩为80 bit,缩小16倍。到合成需要该音时,再利用语音产生模型由所存的特征参数实时转换为语音。
4.2 语音产生模型在语音识别技术中的应用
    与机器进行语音交流,让机器明白你说什么,这是人们长期以来梦寐以求的事情。语音识别技术就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的技术。其原理是:由于每一个短时语音信号包含一串语音特性参数,不同的汉字音有不同的特征参数,所以利用特征参数的差别来识别不同的汉字音。
    近20年来,语音识别技术取得显著进步,开始从实验室走向市场。预计未来10年内,语音识别技术将进入工业、家电、通信、汽车电子、医疗、家庭服务、消费电子产品等各个领域。
参考文献
[1] 拉宾纳  L R,谢弗  R W. 语音信号数字处理[M]. 北京:科学出版社,1983.
[2] 戴逸民,梁晓雯,裴小平. 基于DSP的现代电子系统设计[M]. 北京:电子工业出版社,2002.
[3] 奥本海姆. 信号与系统[M]. 刘树棠,译 . 西安:西安交通大学出版社,1998.

[4] 何苏勤,王忠勇.TMS320C2000系列DSP原理及应用技术[M].北京:电子工业出版社,2003.



http://www.innovateasia.com/cn/win_2008/CN321.htm

Profile - CN321


CN321

基于语音识别及RFID的多重安防门禁监控系统

广西师范大学
物理与电子工程学院






Advisor

Name: 王志高

Members

No. Name English Name
1 甘宇健 Gan Yujian
2 王明娟 Wang Mingjuan
3 彭宇林 Peng Yulin

Project Paper

1. 设计概述 (Preliminary Paper)

随着生物识别产品的不断问世,其在安防门禁系统的应用将越来越多,生物识别产品的高安全性和防盗等特性正被越来越多的客户接受。由此可预见,在不久的将来,生物识别产品必将成为安防门禁系统前端识别设备的强大力量,在安防领域必将发挥越来越大的作用。

生物识别技术是利用人体生物特征进行身份认证的一种技术。生物特征是识别人身体上唯一的与他人不同,可以测量或可自动识别和验证的生理特征或行为方式。

用于生物识别的生物特征有指纹,掌纹,脸形,虹膜,视网膜,脉搏,耳廓等,行为特征有签字,声音,按键力度等,基于这些特征,人们已经发展了指纹识别,掌纹识别,面部识别,发音识别,虹膜识别等多种生物识别技术,也相应地生产了各种生物识别产品。目前市场上使用的最多是指纹仪,其次是脸形识别产品,掌纹仪,虹膜仪和声纹仪,生物识别产品具有以下特点:

1)高安全性;

2)技术先进;

3)不易仿冒;

4)防盗取。

由于生物识别产品具有技术先进,安全性能高,身份确认唯一等特点,目前越来越多的集成使用在安防门禁系统中,生物识别产品采用的技术不同于传统的RFID技术的门禁系统,因此将生物识别产品集成使用在采用传统RFID技术的门禁中,是一项合理且创新的尝试。

鉴于实际应用,需要考虑人类特征符合身份认证的要求,从安全性,可接受性,生产成本,实时性能方面, 本设计采用了一种易获取的生物特征——语音,并结合射频识别技术的多重身份认证保障用户的更高安全防范,从而确保人生财产的安全。相对于传统的磁卡及IC卡技术,RFID具有非接触、阅读速度快、无磨损等特点,在最近几年里得到快速发展。

本系统设计理念新颖,其软硬件均可裁剪,主要分为高端和低端两种设计方案(实际系统设计制作以高端型为制作蓝本),故应用非常广泛。高端型系统具有语音识别、RFID卡识别、动态随机密码保护等多重安防功能。高端型系统设计主要面向安全级别要求较高的原子能实验室,生产基地等场所。经过软硬件裁剪,本系统也可应用于图书馆,住宅小区等安全要求相对较低的场所。

本系统整体设计基于DE2开发平台,采用基于Nios IISOPC技术。Nios II 软核集成在FPGA内部,采用这种解决方案的优点是实现了片上系统,减少了系统的物理体积和总体功耗;同时系统控制核心都在FPGA内部实现,可以极为方便地更新和升级系统,大大地提高了系统的通用性和可维护性。此外,由于本系统需要大量的高速数据运算,在设计中我们充分利用了Cyclone II 芯片的丰富的硬件乘法器,实现了语音信号的端点检测模块,FFT快速傅立叶变换模块,DCT离散余弦变换模块等硬件设计模块。为了提高系统的整体性能,我们充分利用了FPGA的高速并行的优势,以及配套开发环境中的Avalon总线自定义硬件外设,使系统处理数字信号的能力大大提高,其性能远优于传统的微控制器和普通DSP芯片。综上所述,我们采用了基于Cyclone II的系统设计方案。

 

(Revision: 4 / 2008-06-15 17:48:54)

2. 功能描述 (Final Project Paper)

    本系统采用SOPC系统设计,控制方式灵活。以下为本系统在实际运用中的示例图(如图1所示)。

 

 1  实际应用示范图

本系统采用SOPC系统设计实现了语音识别及RFID的多重安防门禁监控系统:一方面主要对 语音信号实时采集,存储,并通过各种DSP运算模块进行分析和处理;另一方面主要实现射频识别。

其功能描述如下:
1 .实时语音信号采集模块
话筒线入输入,语音通过音频编解码芯片 WM8731 ,以 8KHZ A/D 采样率转换成 16 PCM 码缓存。 
 
2 .语音信号预处理模块
算法处理的一部分,主要功能是把缓存区的数据归一化,一阶高通滤波,分帧,按帧计算短时能量和短时过零量,去除首尾的静音和噪声,得到有效语音帧,存入 SRAM 。为语音特征提取做准备。
 
3 .语音信号特征提取模块
按帧读取 SRAM 中的语音数据,经过 FFT 模块得到一帧数据的功率谱,功率谱在 24 MEL 滤波器组加权后取对数,再经过 DCT 离散余弦变换模块,得到 12 维倒谱域特征矢量,作为测试模版。这样把一帧多维时域数据压缩至 12 维倒谱域数据,为模板匹配提供了高效处理,降低了识别的难度和计算量。
 
4 .随机密码模块
为了提高安全防范,用户将限制在系统的指示范围内录音,随机密码模块每次都会给出三个随机码的排列组合,用户只能按照提示,录制语音数据,避免了他人盗取客户声音录制数据而非法闯入系统。 
 
5 .语音识别模块
用户预先录制语音样本,并运用PC机上的MATLAB平台对这些语音样本进行特征参数提取,最终以文件形式存入SD卡。Nios II控制SD卡驱动获取所有用户模板,在Nios II上实现软件算法DTW动态时间规整,将测试模板与SD卡中的用户模板比较欧式距离,得到设置的语音密码识别结果。
 
6 .LCD液晶屏显示模块
完成菜单显示,提示用户进行ID卡鉴别,进而回显系统产生的随机密码,提示用户根据随机密码进行语音输入操作,待处理完成,送识别结果回显,提示用户的合法性。
 
7 .射频识别模块
      射频识别系统由两部分组成:射频卡和读卡器。射频卡用作承载用户信息载体,读卡器具有读 / 写功能,本系统通过 Nios II 处理器读 / 写射频识别模块的数据信息,在语音识别前开启门禁系统的第一重身份认证,再通过语音识别控制门禁控制器最终开启门禁系统, 突破传统安防系统单一射频识别的缺点,提高安防性能。
 
 8 .监控模块
监控模块包括有温度,烟雾等受监控环境的常见参数监控。通过 CAN 总线远程与 Nios II 进行数据交互,再经过以太网为监控中心提供环境参数,便于调整受控环境。
(Revision: 19 / 2008-09-14 22:45:35)

3. 性能参数 (Final Project Paper)

 1. 资源使用情况

(1)  系统设计资源使用情况如图:
图2  系统资源利用率
(2) Frequency:116.75MHZ(fmax)
 
2.  作品性能参数
 
2.1  系统语音识别率
试验用户数:10个
试验次数: 20次/人
识别率: 93%
拒识率: 7%
 
2.2 系统运行速度对比
为了显示本系统设计性能的优越性,我们选择 PC 机与之对比。 PC 的配置性能如下:
表1 PC机配置

品牌
CPU
时钟(主频)
内存
软件平台
联想
Inter Pentium D 940
双核处理器
3.2Ghz
1024 Mbyte
DDR2
MATLAB 6.5

 
2.2.1 语音 MFCC 特征提取:
PC  MATLAB 6.5 上运行耗时截图:
 
图3  PC  MATLAB 6.5 上计算一次MFCC耗时截图
在本系统中, MFCC 系数提取采用纯硬件描述语言实现,其工作在 50Mhz 下时,计算一帧 MFCC 系数所用的时间约为 60us 。运行速度对比如下表:
表2 PC与DE2平台运行MFCC系数提前速度对比

测试平台
处理对象
时钟
处理耗时
DE2 平台性能提升
PC
MFCC 系数提取
3.2Ghz
47ms
783
DE2 开发平台
50Mhz
60us

 
2.2.2 语音端点检测:
运行速度对比如下表:
表3 PC与DE2平台运行端点检测速度对比

测试平台
处理对象
时钟
处理耗时
DE2 平台性能提升
PC
语音端点检测
3.2Ghz
62ms
33.2
DE2 开发平台
50Mhz
27Mhz
1.87ms

 
2.2.3  从语音录入到识别结果输出:
语音识别的运行时间与端点检测后截取出来的语音帧长有关,在本系统中,将语音信号以 256 个语音采样数据为一帧( 8Khz 采样率)。以下运行时间对比是基于三段分别为 13 13 16 帧的语音数据进行的运行时间对比:
运行速度对比如下表:
表4 PC与DE2平台对三段语言识别运行时间对比

测试平台
处理对象
时钟
处理耗时
DE2 平台性能提升
PC
三段语音识别
3.2Ghz
2.45s
6.2
DE2 开发平台
50Mhz
397ms

MFCC 系数提取中,包含大量的复杂运算: FFT 运算、取对数、浮点乘除法等等,尽管 PC 机的主频很高,但其在这些复杂的数字信号处理中运算效率不够高,计算一次需要几个时钟周期,而我们设计的基于 FPGA 的数字信号处理采用并行处理方式,以较少的资源消耗换取了较大的性能提升。
而在端点检测中,只有 Fir 滤波部分需要大量的乘法运算,其他部分大致都是加法和判断处理状态转移过程,此时 PC 主频高的优势得以发挥,拉近了与硬件实现方法的差距。
在最后的性能对比中,由于识别算法 DTW 是基于 Nios II 实现,并非全硬件实现,所以最终两者性能差距大致在 6 倍左右,这已是一个非常好的成绩,完全满足本系统设计的要求了。
 
2.3  与竞争方案的性能对比
我们选择了较为有说服力的:国家自然科学基金资助项目 ( 90407017)  、北京市教委基金资助项目 (KP2701200201) ,来与我们实现的方案进行对比。该项目在《小型微型计算机系统》 2007 8 月第 8 期,发表的论文《基于 FPGA  的嵌入式语音识别控制系统》展示其设计的系统。该系统基于 Xilinx 公司的 Virtex II Pro50 FPGA 芯片,处理器为芯片内部的硬核 Power PC 405 。我们将两个方案进行对比:
表5 本方案与竞争方案对比
 
本系统设计方案
同类竞争方案
价格
功耗
较高
特征提取时间(模板形成时间)
 短  (0.003s)
长  (0.69s)
DTW计算时间
较长 (0.39s)
短  (0.02s)
整体响应时间
短   (0.4s)
稍长 (0.7s)
分析两方案的异同,本方案采用相对流行的 MFCC 语音特征提取办法,而对比方案采用 LPCC 语音特征提取办法。就计算复杂程度而言, MFCC 的运算量较多。本系统充分利用 Cyclone II 的资源和 SOPC 的设计理念,设计了基于 Avalon 总线的 MFCC 系数提取模块,并用 DMA 进行数据搬运。这使得更为复杂的语音特征提取时间较竞争方案的时间更短。
在识别部分,两方案均采用 DTW 识别算法。而竞争方案采用了硬件实现的方法,性能较我们好。
就总体情况而言,若同为 10 个参考模板,本方案模板形成与识别的总时间在 0.4s 左右,而竞争方案模板形成与识别的总时间在 0.7s 左右。我们以合理的设计思路、较低的设计成本取得了良好的性能参数。
 
2.4  系统误差分析
 
2.4.1  MFCC 特征提取误差分析:
为了验证 MFCC 模块运算正确,我们构造了一个 256 元素的一维数组进行 MFCC 系数提取: [1,2,3,4,0,0,0,0 …… ,0,0,0] ;以下为该矩阵分别在 MATLAB Nios IDE 平台运算后提取出来的数据:
            

       图4  MATLAB运算结果                                                     图5  MFCC模块运算结果

左图为在 MATLAB 6.5 上对上述矩阵进行 MFCC 系数提取后的截图,而右图为在 Nios IDE 软件平台上采用 Nios 处理器从 AVALON 总线上读取上述矩阵进行 MFCC 系数提取后的数据截图。从图中的数据可以看到,两者间的绝对误差大约保持在 0.0001 左右,这个精度已经可以满足本系统的要求。
 
2.4.2  CORIC 对数运算单元误差分析:
CORIC 对数运算是属于 MFCC 系数提取模块的一个部分,尽管上文已经对 MFCC 特征提取误差范围做出了评价,但由于在整个 MFCC 系数提取中,只有对数运算没有采用标准的直接求取法来求解(事实上也很难采用直接求解法在硬件平台上求解对数),所以对其做误差评价也是很有必要的。
根据 CORDIC 的计算原理,我们在 MATLAB 上建立了一个 CORDIC 对数运算的仿真模型,该仿真模型的计算结构与 FPGA 端一致。
下图为 CORDIC 对数运算模型与 MATLAB 标准对数运算函数结果对比图:
图6  CORDIC对数运算误差分析图
图中蓝线为标准对数运算的结果,而红线为我们在 FPGA 端设计的对数运算结果。从图中可以看出,我们设计的 CORDIC 对数算法仅在约 2.97—3.03 的范围内产生误差,其最大误差产生在输入值为 3 的时候,此时: ln(3) = 1.0986 , 而我们设计的 CORDIC 对数运算为: 1.1080 ,其绝对误差为 0.0094 ;相对误差为 0.86% 。这个精度已经满足本设计的需求,而且除了 2.97—3.03 这个范围外的 CORDIC 对数运算与实际的对数运算相比基本上没有误差。
注:在此只进行 2.000 —— 3.999 数据的效验是因为 CORDIC 对数运算的数据输入范围为: (2.000 —— 3.999)*2n ln(x*2n)=ln(x)+n*ln(2) ,所以只需验证 2.000 —— 3.999 CORDIC 对数运算结果即可。详细的设计论证请参考本文第四部分的设计方法。

 

(Revision: 4 / 2008-09-15 17:59:14)

4. 设计结构 (Preliminary Paper)

1.系统主要框架设计:

系统设计充分利用Cyclone II芯片及DE2开发板硬件资源。系统主要硬件模块为:射频识别模块,SD卡读写模块,音频采集模块,RS232通信模块,以太网控制模块,液晶显示屏等。而系统主要软件模块包括:基于Verilog HDL的高速语音信号预处理模块,基于Nios II的语音信号匹配识别模块,RFID识别模块,液晶显示控制模块,以太网控制模块,SD卡文件系统控制模块等。系统主要框图(如图7所示):

 

系统总体结构

2.主要算法流程设计:

高速语音信号处理模块由以下几部分组成:语音端点检测模块,语音特征提取模块。语音端点检测模块主要包括:FIR滤波器的设计,能量的计算,过零率的计算。语音提取模块主要包括:基2256FFT模块设计,MEL滤波器组的设计,DCT离散余弦变换模块等。

这部分处理采用Verilog HDL设计,应用流水线和乒乓操作,实现了数据的高速处理。

网络模块通过以太网技术,利用TCP/IP通信协议实现DE2实验板与监控中心的PC机系统终端的网络传输。系统终端利用.NET应用软件实现网络通信GUI接口,以实现上位机与下位机的网络通信,以便管理系统用户数据库。算法主要流程(如图8所示):

 

8  算法流程图

 

(Revision: 4 / 2008-09-14 21:58:14)

5. 设计方法 (Final Project Paper)

           本系统基于DE2开发板进行设计,充分利用了DE2板上丰富的资源,系统的TCP/IP网络通信基于DM9000A芯片,语音采集基于WM8731语音编解码芯片,语音的加密数据保存于SD卡,并采用了板上的LCD 作人机友好交互。同时系统利用DE2的外扩插槽扩展自己设计的射频识别读卡器和CAN总线接收器。

在设计过程中,充分考虑SOPC系统的特色,充分发挥了SOPC系统在数字信号处理中的并行运算优势和Nios自定义指令加快程序运行速度的优势。下图为本系统的SOPC builder定制图:

图9  系统SOPC builder定制图
系统硬件设计
 
1.1  识别模块设计实现方法
RFID 识别模块采用的是ZLG500B系列的射频识别模块,而Mifare 卡则采用NXP公司的MF1S50系列射频卡。该模块基于NXP高集成度读卡芯片MFRB500。当读卡模块初始化工作完成后,便开始监测 Mifare卡,Mifare卡一共有五种状态,以下是Mifare卡的状态转移图。

图10  Mifare卡的状态转移图
ID  卡是客户身份卡,装载客户的ID信息和自行设定的48bit密码,当客户刷卡成功,蜂鸣器提示一重认证通过,开启语音识别认证,确保门禁系统的安全。
 
1.2  环境参数监控模块设计实现方法
本模块模拟监控实验室温度的过程,由于在实际实验室中,各种干扰信号及通讯距离较远,故本模块采用CAN总线进行通讯。CAN(Controller Area Net)是一种现场总线,主要用于各种过程检测及控制,其具有抗干扰性强、通信距离较远等优点。在本模块的设计框图如下:

图11  环境参数监控模块原理图
本模块采用SJA1000做为CAN总线控制器,CAN总线收发器则采用CTM1050T高速隔离收发器。在实物设计中,我们选择对环境的温度进行实时监控,如果要对其他的环境参数进行监控,只需更换传感器即可。
环境参数实时采集卡的设计基于AT89S51单片机,单片机采集温度数据后,将温度h数据通过CAN总线发送到Nios II。下图为环境参数采集卡CAN总线网络连接图:

 

 

图12  CAN总线网络连接图
 
1.3  语音采集与预处理模块
本模块要实现的功能是采集语音信号,并对其进行FIR滤波、语音数据归一化、语音的端点检测处理。
 
1.3.1 语音采集单元:
语音采集部分采用DE2板上的WM8731进行设计,通过I2C总线设置后,WM8731就会一直工作在设定的模式中。语音采集单元包含一个PLL,一个I2C总线控制器、一个左对齐模式下的语音采集控制器。
PLL 给予WM8731工作在18.4Mhz的时钟频率下,通过I2C总线控制器设置WM8731工作在8Khz的采样频率下。下图为在嵌入式逻辑分析仪(SignalTap II Logic Analyzer)下图语音采集控制器的采样图:

图13  语音采集控制器的采样图
从图中可见,左对齐语音采集过程一共有19个脉冲,其中前16个脉冲为有效语音数据提取脉冲,后三个脉冲为将来处理扩展预留。有效语音提取出来之后便存入SRAM中。本模块通过计数器,从启动录音开始,自动录制4s的语音信号。
 
1.3.2 语音归一化处理单元:
语音归一化处理典型的计算公式为:DATA/MAX(DATA),如果按照这种标准归一化处理,则需要消耗2个硬件乘法器资源。本着节约片上资源的设计理念,我们创新地提出了一种经过简化的归一化处理模型,该模型只需移位即可实现归一化运算。流程如下:
第一步:先取语音数据的最大值MAX(DATA)。
第二步:令m>= MAX(DATA)且m=2^n(n>=8),寻找一个最小值n。
第三步:将归一化运算由DATA/MAX(DATA)改为DATA/m。在数字电路中除以2^n只需简单的移位即可实现。
鉴于我们这里将16位的原始语音归一化为8位的小数,所以只要将每一个语音数据右移(n-8)位即可。当n小于8时,则无需再移位。
经过修改后的归一化运算,运行速度更快,资源消耗更少,其不足在于牺牲一点采样精度而已。
 
1.3.3  Fir 滤波器运算单元:
由于原始录入的语音高频部分的频谱比低频部分的成分少,为此要在预处理中加入预加重处理,预加重的目的是提升高频,使得信号的频谱变得平坦。一般采用的是一阶高通滤波器,系统函数为 。我们利用了DSP Builder设计了一阶FIR滤波器。方法如下:
第一步:由系统函数得到差分表达式:
第二步:在DSP Builder 中生成 Simulink 系统仿真图,并生成VHDL代码。
设计的FIR模型顶层文件如下:

图14  FIR模型顶层文件
从DSP builder的截图可以看出,Fir滤波器的输入是16位的Q8定点小数,运算后输出也取16位Q8定点小数。下图为Fir在Quartus II的仿真图:

图15  Fir仿真图
我们在MATLAB对该仿真结果进行验证:

图16  Fir仿真结果验证
 
1.3.4 语音端点检测运算单元:
由于原始数据中含有噪声和无声段以及静音段,为了获取有效语音数据,必须从原始数据中截取有效的语音数据。在端点检测中,我们把语音分为:静音段,过渡段,语音段,结束段。语音端点检测状态转移图如下所示:

 

图17  语音的端点检测状态图
端点检测后的语音数据仍保存于SRAM中。我们将DE2板上的512KB的SRAM划分为5个区:地址0——0x7fff为原始语音数据保存区,0x8000——0xffff为经端点检测后的第一段语音数据(在端点检测之前已对该段语音数据进行归一化处理与Fir滤波处理)保存区。0x10000——0x17fff为经端点检测后的第二段语音数据保存区。0x18000——0x1ffff为经端点检测后的第三段语音数据保存区。0x20000——0x3ffff(0x3ffff 是SRAM的最终地址)为将来扩展而预留。
下图为语音预处理模块处理我们录进去的“大家好“效果图。本图是通过DE2控制面板软件读取SRAM前256KB数据(地址:0——0x1ffff)在MATLAB软件上画出来的图形:
图18 语音的端点检测效果图
从图中可以看出语音预处理模块可以很好地完成Fir滤波、语音归一化、语音端点检测的任务。
 
1.4 MFCC 特征提取模块
在设计之初,我们曾计划将MFCC模块做成一个Nios II的指令,以此加快其对语音数据的处理速度。但是每次MFCC运算的输入数据为256Byte,如果将MFCC做成Nios II的指令,这就意味着需要Nios II从SRAM读取(搬运)这大量的语音数据。此时Nios II的工作效率和最终系统的运行速度将会大大降低,所以我们将MFCC模块做成了一个Avalon总线的从设备,使用DMA来为它搬运数据。设计结构图如下:

图19  识别部分整体设计结构图
在介绍MFCC中各运算单元实现步骤之前,有必要详细说明一下本系统的数据格式变换,数据变换的原因下文会有讲解。在上文中提到,语音经过归一化处理后,成为16位的Q8格式小数语音信号,整个MFCC数据格式变化如下图所示:

 

图20  FPGA中数据格式变化
MFCC 特征提取模块包含:FFT运算、数据取模运算、Mel滤波器运算、对数运算、DCT离散余弦变换、一阶倒谱提升。由于篇幅的关系,在此仅选择其中最复杂的三个部分进行介绍。
 
1.4.1  FFT 运算单元
 
(1) FFT 设计方案对比
在FFT运算单元设计之初,我们有两个设计方案:浮点型FFT和定点型FFT。两者的区别在于:前者计算的值的范围大,而后者所能计算的范围较小。在前文我们提到,在本系统中语音归一化处理后变为8位有效数据,如果采用浮点FFT,则得将原来的八位数据扩展为32位,而采用定点的FFT则只需在原来数据位宽的基础上扩充一倍即可。无论逻辑资源的消耗、乘法器资源的消耗还是FPGA内部存储资源的消耗都是定点型FFT比浮点型FFT来得少。基于上述原因,本系统采用定点FFT。
 
(2)  定点FFT的设计方法
定点FFT设计的关键就在于蝶形结单元的设计和地址产生逻辑的设计。蝶形结是FFT处理器的基本运算单元,本模块的蝶形结消耗了8个硬件乘法器,一半用于数据的实部相乘,另一半用于数据的虚部相乘。鉴于Cyclone II的乘法器均为9bit,因此我们在蝶形运算单元将原来的8位小数扩充为10位,组成高8位为整数位,低10位为小数位的Q10格式数据。这样即充分利用了现有资源又提高了FFT运算的精度。蝶形结采用流水线设计,数据输入到输出有6个时钟周期的延迟,由于蝶形运算数据的连续输入,所以每计算一次蝶形结只需一个时钟周期。
FFT 模块设计的难度主要在地址产生逻辑,地址产生逻辑的设计直接影响FFT模块的性能和FFT运算结构。我们的FFT地址产生模块按照标准FFT地址跳变方式设计并满足蝶形运算单元流水线运算的需要。为了得到高速的FFT处理速度,我们在FFT模块中开辟了两个RAM数据存储区,以此组成典型的乒乓操作模式:在FFT第一级运算中,数据从RAM1经蝶形单元计算存入RAM2,在第二级中则正好相反,依次类推……下图为FFT整体设计框图:

 

图21  FFT结构功能图
在这种设计结构下,计算一次蝶形运算只需要一个时钟,处理速度达到同类设计结构的最高极限。经Quartus II综合后FFT模块的时钟可达162Mhz,消耗的逻辑资源约为700多。在100Mhz时钟下,计算一个256点FFT的时间不到11us,达到了数据高速处理的目的。以下为FFT模块仿真图:

图22  Q10格式256点FFT时序仿真
对上面Q10格式的FFT仿真结果进行验证:从图中可以看到FFT运算结果的头几个数为:0x0A0000000,0x09FD3FE0C,0x09F0FFC19……按照Q10格式,这三个数分别为:10、9.9882-0.48828i、9.9404-0.97460i。而MATLAB计算的结果为:10、9.9849 - 0.49054i、9.9399 - 0.97911i,两者相差不大,定点FFT运算模块与MATLAB计算的结果相比存在小小误差。
为了更直观地验证FFT模块计算的正确性,对一帧实际语音数据进行FFT计算:下图中蓝色代表FFT 模块对一帧语音数据经过FFT 运算后的频谱图,红色代表同样的语音数据是用MATLAB 指令fft(data)运行的仿真图,可以看到我们自行设计的模块能达到应用的要求,并且与MATLAB软件有同样的效果。

图23  一帧语音数据的频谱图
 
1.4.2  MEL 滤波器的设计
MFCC (Mel-Frequency Cepstral Cofficients)的分析着眼于人耳的听觉特性,因为,人耳所听到的声音的高低与声音的频率并不成线性正比关系,而Mel频率尺度则更符合人耳的听觉特性。所谓Mel 频率尺度,它的值大体上对应于实际频率的对数分布关系。Mel频率与实际频率的具体关系可用下式表示:
Mel(f)=2595lg(1+f/700)
这里,实际频率f 的单位是Hz。根据Zwicher 的工作,临界频率带宽随着频率的变化而变化,并与Mel频率的增长一致,在1000Hz 以下,大致呈线性分布,带宽为100Hz左右;在1000Hz 以上呈对数增长。类似于临界频带的划分,可以将语音频率划分成一系列海明窗滤波器序列,即Mel 滤波器组。
在本系统中,此MEL滤波器组是一个24阶的海明窗滤波器,此滤波器系数是一个24X128的矩阵,而在这个滤波器系数组中,有许多的系数都是0,如下图示:

图24   部分MEL滤波系数在MATLAB软件上的截图
从图中可以清晰看到,MEL滤波系数组大部分元素均为0。对该系数组在MATLAB下调用plot函数绘图可以看到Mel滤波器系数组的图形:

图25  MEL24 阶的海明窗滤波系数组
从上图可以发现Mel滤波系数组每一阶的非零数据是不相同的。也就是说想在FPGA上构造一个与C语音类似的稀疏矩阵,难度很大。而如果将整个滤波系数矩阵的24*128个系数均存入FPGA的存储区中,又会造成非常大存储资源浪费。
为了以最少的资源、最快的速度实现Mel滤波器,我们将Mel滤波系数组设计成单一状态转移结构。即采用一个计数器,给予每一级Mel滤波一个特定的值,从Mel滤波计算开始,该计数器便开始计数,利用该计数器便可决定Mel滤波器的计算状态。采用这种设计方式便可在FPGA中仅仅保存Mel滤波系数中的非零系数,且综合后的运行速度可达180多Mhz。下图为Mel滤波器第一阶计算的结果:

图26  Mel滤波器第一阶计算仿真结果
 
1.4.3 对数运算单元设计
MFCC  中语音信号的幅度谱在每一个滤波器组中累加将得到一个较大的加权值,算法中需要对各个加权值取对数来达到压缩数据的目的。
 
(1)FPGA对数算法运算方案对比
通常情况下FPGA实现对数运算的方法一般采用一下三个:
方法一:采用查表的方式来实现
方法二:采用泰勒级数来近似这个函数,也就是:

方法三:基于坐标旋转数字式计算机(Coordinate Rotation Digital Computer,CORDIC)的算法。
对比三个方法,其中方法一的实现最为简单。但是方法一的计算精度与所制作的表的大小成正比,也就是说采用方法一实现较高精度的对数运算将要耗费巨大的存储器资源。显然在本系统中并不适用。
而方法二和方法三,在其收敛区间上均可以取得较好计算结果。在方法二中,每一个级数的计算需要3到4个的硬件乘法器。如果采用各级共享乘法器的设计方法,则计算一次对数需要较长的时间。而如果使用流水线结构设计,又会消耗大量的乘法器资源。
采用方法三的CORDIC算法具有突出的优势:不需要硬件乘法器,所有运算只有移位累加;可以使用流水线方法,以提高工作频率与效率;也可以使用循环迭代方法,以节约硬件资源。其计算精度与运算迭代次数成正比(也就是逻辑资源)。我们设计的15次流水线迭代的CORDIC对数运算单元消耗的LE约为1100左右。
对比方案二和方案三,显然方案三在各个方面都具有突出的优势。故本系统采用CORDIC算法实现对数运算。
 
(2)CORDIC对数运算实现方法
三角函数的CORDIC算法最初由Jack Volder提出,应用与实时导航的数字处理,John Walther等人将CORDIC理论进行了扩展。现在CORDIC算法已经应用与众多领域。
本文不涉及过多的理论,关于CORDIC的资料可以参考《A survey of CORDIC algorithms for FPGA based computers》一文。要实现CORDIC对数运算的关键就是找到它的迭代多项式。本系统采用的是利用CORDIC结构实现双曲线坐标变换,而双曲线函数可以很方便转换为对数函数,在本系统中采用的迭代方程推导如下:

进一步分析这一迭代方程,对该多项式迭代后的结果为:我们所需的ln(t)等于2* 。为了省去乘2这一步,我们再将迭代多项式优化为:

在此迭代多项式下,只需令x的初值等于t+1,y的初值等于t-1,z的初值等于0。经过n次迭代后,ln(t)= 。
通过对后一个多项式的迭代运算,我们就可以得到所需的对数运算结果。需要注意的是,在这个CORDIC迭代方程中无法满足整个自然域的实数运算,此时可以通过简化公式进行化简:
 
可以发现, 正好是浮点格式数据。也就是说,只要输入CORDIC对数运算的数据为浮点格式,就可以轻松处理大范围的实数。
为了对数运算的方便,本处没有采用标准浮点格式,而是针对CORDIC对数运算的需要设计了一个简单的浮点格式。该浮点格式表示规定为: 且 。这样定义的原因是:CORDIC对数运算方程y的初始输入变量为:t-1,当t趋近于1时,y趋于0,这样迭代结果就会产生较大误差。所以在此直接规定了t的取值范围,防止y=0的情况发生。又MEL滤波器输出的数据恒为正数,所以浮点的符号位也可忽略。最终这种简化的浮点格式为: 20bit 为t,后12bit为2的指数位(指数位为有符号数据)。
下图为对数运算在Quartus II仿真结果:

图27 CORDIC对数运算仿真
浮点格式0x20000800 = 2.0*2^(-2048),ln(2.0*2^(-2048))= -1418.87228,而CORDIC对数运算的仿真结果采用Q16定点小数表示,0xA752172 = -1418.86936 两者的绝对误差:0.003。
对后一个仿真结果的验证:浮点格式0x22000000 = 2.125*2^(0)=2.125,ln(2.125)= 0.7537718,仿真结果Q16定点数据:0xC106 =0.7539978 两者的绝对误差:0.0002。
 
(3)定点小数转浮点格式小数的实现方法
上文提到,在对数运算单元中,输入的数据为浮点制的格式。但我们之前的数据一直都采用定点小数格式,所以必须在对数运算之前将定点格式的数据转换成浮点格式的数据。
定点转浮点格式采用状态机的方法设计,下图是其状态转移图:

图28  定点转浮点格式状态转移图
按照这一流程便可将原来的32位Q16格式数据转换为CORDIC对数运算设计的浮点格式数据。
下图为定点格式转浮点格式的Quartus II仿真结果:

图29  定点格式转浮点格式仿真结果
从图中可以看到,输入32位Q16格式0x00011000=1.0625,
0x22000fff=2.125*2^(-1)=1.0625 。同理对后一个仿真结果验证:输入Q16格式0x12345678=4660.3377,0x2468A00B=2.275542*2^(11)=4660.3125。结果均在误差范围之内。
 
1.5  随机密码产生模块
随机密码产生模块采用伪随机序列(也称为m序列)的原理进行设计。伪随机序列在通信、雷达、导航以及密码学等重要的技术领域中获得了广泛的应用。在本系统中,随机密码起到了非常重要的作用,在每次语音识别之前,系统通过随机序列得到随机数,要求用户录入相对应的语音密码,这就相当于扩大了系统密码库。即相当于将10个语音密码扩展为1000个语音密码。伪随机序列采用移位反馈寄存器设计,下图为设计顶层结构图:

图30  随机密码产生顶层结构
在伪随机序列产生的这些移位寄存器中,不允许全零的状态出现。所以我们设置了一个延时复位单元,在系统上电后一段微小的时间后,图中的所有移位寄存器都会被置1。下图为随机密码模块仿真图:

图31  随机密码模块仿真
 
1.6  自定义指令
在本系统中,定制了基于Nios II的DTW计算指令,DTW的计算结果取值范围较大,一般从几百到几十万,而用于计算DTW的MFCC系数的值大多从0到正负十几之间,如果此时继续采用定点数据,显然已经无法满足系统要求。所以,我们自己设计定制了计算DTW的浮点Nios指令。
定制的指令包括:
1 )定点Q16格式数据转浮点格式数据
2 )浮点相加指令
3 )浮点欧式距离计算指令
4 )浮点数据大小比较指令
5 )浮点数相乘指令
指令定制截图:

图32  自定义指令
通过这些指令的定制,使得本系统在DTW识别算法的计算时间缩短了4.12倍:
表6  自定义指令运行时间对比
实现方法
运行时间
自定义指令速度提升
直接采用程序实现 DTW
1429ms
 
4.12
采用自定义指令实现 DTW
346ms
可见在Nios中自定义指令可以获得很好的性能提升幅度。需要注意的是,在Nios IDE中,如果直接定义浮点型变量无法直接输入到自定义指令中进行运算,所以本系统采用alt_u32型变量来“装载”浮点变量。当然,这样处理后,就不能在Nios IDE中直接采用+-*/等运算符直接对这些变量进行运算了,只能采用自定义的指令来操作。
 
2 .系统软件设计
本系统采用了两个Nios II处理器,一个负责识别算法实现,另一个则负责与上位机的TCP/IP网络通信等。
 
2.1  识别算法的程序流程(CPU_1)
系统上电复位后,液晶屏上将显示系统初始化成功,将等待用户刷卡,由串口接受合法用户的ID号,非法用户将无法进入下一步语音识别,并在液晶屏上显示非法ID,验证ID 合法后,产生随机密码并液晶回显,并开始采集四秒钟语音数据,进入语音识别验证。最后系统通过TCP/IP网络发送识别结果给远程监控中心。下图为CPU_1的程序流程图:

图33   CPU_1的程序流程图
 
2.1.1  DTW 识别程序设计
在孤立词语音识别中,最为常用的方法就是DTW 动态时间规整算法,它与其它识别算法如HMM算法在相同环境条件下,识别效果相差不大,但HMM算法的实现要复杂得多,这主要体现在HMM 算法在训练阶段需要提供大量的语音数据,通过反复计算才能得到模型参数,而DTW算法的训练中几乎不需要额外的计算。在本系统中考虑到算法复杂程度以及对系统速度性能的要求,选择兼顾识别效果和低复杂度的高效算法DTW。
算法实现流程:
(1)首先读取SD卡里面的语音模板库,客户的语音参数模板都是以经过特殊处理的二进制文件存放在SD卡内。Nios II读入文件,作为语音特征矢量R。
(2) 特征参数提取模块组件处理得到的实时采集的测试客户模板,作为语音特征矢量T。
(3) 比较T和R之间的相似度,即使计算累积距离,距离越小则相似度越高。这一失真距离,可采用动态规划的方法。下图是把测试模板的各个帧号在一个二维直角坐标系中的横轴标出,把参考模板的各个帧号在纵轴标出,通过这些帧号的整数坐标画出一些纵横线即可形成一个网络,交叉点表示测试模式中某一帧与训练模式中某一帧的交汇点。DP算法可以归结为寻找一条通过此网格中若干格点的路径,路径通过的格点即为测试和参考模板中进行距离计算的帧号。路径的选择必须从左下角出发,在右上角结束,且生长点的斜率必须在1/2到1之间。如下图所示。

图34  DTW搜索路径
以下是算法流程图:

图35  DTW 算法流程图
 
2.1.2  FAT 文件系统的移植与实现
FAT 是Microsoft推出的文件系统,具有高度兼容性,目前仍然广泛应用。FAT(File Allocation Table)是“文件分配表”的意思。顾名思义,就是用来记录文件所在位置的表格,它对于存储盘的使用是非常重要的,假若丢失文件分配表,那么存储盘上的数据就会因无法定位而不能使用了。
在本系统中,FAT文件系统在一张1G的SD卡中实现,所以选择移植FAT16文件系统。FAT16使用了16位的空间来表示每个扇区(Sector)配置文件的情形,故称之为FAT16。
要实现FAT16文件系统,最关键就是对FAT16目录项32个字节的操作,下表为该目录项32个字节的定义:
表7  FAT16目录项32个字节的定义
字节偏移(16进制)
字节数
定义
0x0~0x7
8
文件名
0x8~0xA
3
扩展名
0xB
1
属性字节
0xC~0x15
10
系统保留
0x16~0x17
2
文件的最近修改时间
0x18~0x19
2
文件的最近修改日期
0x1A~0x1B
2
表示文件的首簇号
0x1C~0x1F
4
表示文件的长度
在SD卡中进行读取二级目录文件的程序流程图:

图36  SD卡操作流程图
如果要进行三级目录文件读写,只需重复上述黄色部分的流程即可。而如果要进行根目录下文件读写,则只需去掉黄色部分流程。由此可见,其实文件夹在FAT16文件系统中将会占1个簇的存储空间。
 
2.2  网络通信的程序框架图(CPU_0)
CPU_0 负责的工作在实时操作系统下以多任务的形式是与电脑进行TCP/IP网络通信、收集实验室环境数据和门禁识别结果等。程序整体框架如下图所示:

图37 CPU_0程序整体框架
 
2.2.1  uC/Os II  操作系统的实现
Altera 公司已经为用户移植好了uC/Os-II实时操作系统,并将其像外设驱动一样当作一个软件模块集成到了Nios II IDE,在Nios II IDE环境下,用户不用修改其源文件对uC/Os-II的配置,只需通过图形界面就可以实现,使用起来非常方便。正是这些原因,在Nios系统中使用uC/Os-II操作系统非常方便。
 
2.2.2  LWIP 网络通信实现与应用
LWIP 全称为Lightweight IP TCP/IP stack,是一个轻量级的TCP/IP协议栈,其主要特性是以最小的资源占用实现完整的TCP/IP协议,因此特别适用于嵌入式系统。Altera公司已经在Nios处理器上为用户移植好了LWIP,并内嵌到Nios IDE中。所以在本系统的软件设计中,我们很方便地将uC/Os-II和LWIP结合到我们的系统中,并大大减少了系统开发的时间。
网络通信采用DE2板载DM9000A以太网控制器芯片。它集成了介质访问控制子层(MAC)和物理层的功能,它为嵌入式系统实现的以太网连接提供了良好、便捷的解决方案。
 
1 )DM9000A驱动与LWIP的衔接
DM9000A 与LWIP的衔接通过LWIP提供的几个重要的结构体实现,如下图所示:

图38 DM9000A与LWIP的衔接
例如:netif结构体作为LWIP中网络接口的基础数据类型,描述了网络接口的基本属性以及输入、输出函数。alt_lwip_dev结构体描述了符合LWIP规范的网络端口设备。alt_lwip_dev_list:设备链表。在LWIP定义的这些结构体类型的基础上,我们在主程序中定义了针对DM9000网络接口的一个结构体:alt_avalon_dm9k_if。有了这个结构体,DM9000的寄存器读写操作开始与LWIP的工作机制发生了联系。
总的设计思路是这样的:LWIP定义了一个全局变量alt_lwip_device_list,所有LWIP提供的API均可以对这一变量进行操作。而DM9000通过ALTERA_AVALON_DM9K_INSTANCE宏指令将DM9000作为alt_lwip_device_list中的一个alt_lwip_dev,使得LWIP的API函数的操作将转换为对DM9000的寄存器读写操作。
 
2 )网络应用程序的开发
移植成功LWIP后,就能够利用socket API来完成应用程序的设计。本系统基于Nios IDE提供的simple_socket_server模板进行网络应用扩展。这使得TCP/IP网络通信的实现更加简单。
网络Socket通讯过程:先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。
当连接建立后,我们就可以在sss_handle_receive()函数中建立自已在TCP/IP连接中所需的任务。如下图所示:

图39 TCP/IP新建任务流程图
当TCP/IP连接断开后,再把在TCP/IP连接中建立的任务删除即可。
 
2.2.3  RFID 射频识别的程序设计
RFID 选择现在最为常见的MF1S50系列。系统上电复位,读卡芯片装载正确的密钥到非易失性密匙存储器,等待有RFID卡的到来,启动卡的验证 ,将验证命令发送到卡,当从卡接收到第一个报文令牌后,微控制器必须检测通信状态标志。如果通信到目前为止保持成功,则启动卡验证的第二部分。卡将会以第二个报文令牌进行响应。然后微控制器必须检测通信状态标志。如果验证已成功,则与MIFARE卡继续进行CRYPTO1加密下的通信,读出ID,卡置为挂起状态,蜂鸣器响,发送ID号。 在RFID射频识别的设计中,需要注意的是:RFID射频识别的流程如下图所示:

图40  RFID射频识别的流程图
 
2.3  环境参数采集卡程序设计
在实际设计中,环境参数采集卡是安装在离主控板(DE2板)较远的地方,直接采用主控板进行数据采集显然不合理。所以在此我选择低价、应用普遍的89S51单片机完成环境参数采集的任务。采集卡的任务就是通过相应的传感器采集环境参数,再通过CAN总线将环境参数发送到主控模块中去。
其程序流程如下图所示:

图41  环境参数采集卡程序流程
 
2.4 . 上位机监控软件设计
本系统设计了一个简单的监控软件,对门禁系统实时进行远程监控。监控软件上可以看到门禁监控系统采集的环境参数变量和门禁识别结果。下图为软件运行截图:

图42  上位机监控软件运行截图
除了使用监控软件进行远程监控外,也可以使用Windows自带的远程登录命令登录到监控系统中。下图为采用windows自带的telnet命令登录本系统后的截图:

图43  DOS 命令截图
 
2.5  双Nios通信的实现方法
CPU1  和CPU2有各自的存储区,为了他们之间通信的方便,添加了一个共享的存储区以此来交换数据,为了避免两个CPU 同时访问共享的存储单元时引起资源冲突,而导致系统崩溃,这里添加了互斥核,在访问共享区时,任何一个CPU 都必需先打开互斥核,这时可以实现消息传递,然后关闭互斥核。另一CPU 同样可以通过这样的操作获取消息。设计框图如下图所示:

图44  双Nios II共享存储区交换数据
3.  系统整合与效果
本系统在语音识别部分的综合后时钟可达130Mhz左右,但在这一部分我们仅使用50Mhz的时钟,因为现在的处理速度已经能满足我们的要求,而且每次综合所得电路存在随机性,无论从稳定性还是系统功耗考虑,都是采用较低时钟。如果更换更高时钟,性能参数还能继续增加。
下面是作品在软硬件整合后运行的演示图:

 

图45  作品实物照片

 

(Revision: 13 / 2008-09-14 23:34:05)

6. 设计特点 (Preliminary Paper)

1.我们采用Nios II搭配自己设计的外设逻辑进行语音识别及RFID的多重安防门禁监控系统的设计和开发,利用FPGA的并行优势,控制系统全部集成于一片FPGA实现。这与使用MCU方案相比,系统更加小型化,集成度高、运行速度更快。除此之外,本系统设计减少了物理连接和节约了PCB面积,这样不仅降低了功耗,还增强了系统的稳定性。

2.由于我们的系统需要进行大量的数据运算,仅使用CPU进行软件计算远远无法满足速度的要求,因此我们采用Verilog HDL设计了语音识别的处理模块,本模块充分利用了Cyclone II芯片中的丰富的乘法器资源,并且在设计的过程中采用合理的流水线设计和乒乓操作,其运行处理速度完全优于现在流行的DSP处理平台。

3.我们把语音识别和无线电识别巧妙的结合在一起共同实现安全系统的防范技术,这是市场上正刚刚兴起的新型技术的结合应用,使得社会价值和市场效益将会有很大的发展空间,也是本系统设计的最大亮点,非常具有社会效益和经济价值。

4.我们充分利用了DE2板上丰富的接口资源,例如网络接口,音频接口,SD卡接口,串口,外部扩展接口等,这样解决了独立外设带来的接线复杂与互相干扰等问题,有利于我们针对性地基于FPGA设计功能强大的系统。

 

(Draft / 2008-06-12 18:09:22)

7. 总结 (Final Project Paper)

        首先感谢Altera 公司提供了本次比赛的机会,以及在比赛过程中对我们所遇到的问题所提供的帮助和支持。经过连续两个多月的学习,我们对SOPC系统有了更加深入的了解。在系统设计中使用了SOPC Builder中提供的常用IP 核,大大节省了系统开发时间,让我们的设计工作变得更加有针对性。SOPC Builder灵活的自定义组件功能充分发挥了我们的系统性能,针对我们的语音识别系统,需要实时采集大量的语音数据,也需要实时对它们处理,我们把最重要也是难度要求最高的数字语音预处理,特征提取,全部用硬件实现,并通过SOPC Builder 的友好自定义图形用户向导轻松构建了合适的SOPC 系统。

        通过此次比赛,我们对基于Nios的SOPC系统有了更深入的了解,深刻感受到了SOPC系统设计构架的博大精深。在短暂的学习过程中,我们完成了复杂的系统构架,充分利用了Altera 公司提供给我们的自由空间,比如双核协同工作,复杂IP设计,操作系统的移植,自定义指令加速软件运行时间等等。

         另外,在此次比赛过程中,我们了解到团队合作的重要性,正是因为我们在设计过程中的分工合作,每个人都负责自己熟悉的部分,并及时交流沟通,使得我们收到了事半功倍的效果,最后顺利完成了预期的整个系统。

        最后,感谢指导老师对我们的指导,也感谢所有在这段时间给予我们支持的老师和同学。

(Draft / 2008-09-14 17:38:39)

你可能感兴趣的:(wav,采样)