测量船指挥调度系统语音文件的读取及软件实现

2013-08-22 08:02苏仕强
科技视界 2013年6期
关键词:均方滤波器滤波

苏仕强

(中国卫星海上测控部,江苏 江阴 214431)

0 引言

新测量船指挥调度系统可对指挥语音进行全过程录音,但在回放录音文件时发现播放出来的语音声音小、噪音多,从而效果并不理想。虽然采取了升级录音线、提高话音音量等措施,但仍不能达到预期效果。技术人员在处理录音过程中,发现录音文件为wave语音文件,希望通过对WAVE文件进行提取研究,能找到解决语音效果不理想的问题。

WAVE文件是语音文件中的一种,它被广泛地使用在语音技术研究中,当用其进行语音技术研究时,必须正确提取语音文件中的实际数据,在MATLAB中有一个自带函数可以返回实际语音数据。若使用其它语言进行程序开发时,就必须清楚WAVE语音文件的格式及其在计算机中的存储结构,才能正确地读取实际数据,本文先分析讨论了WAVE文件的存储结构,然后说明如何使用Visual C++6.0实现WAVE文件读取及滤波等操作。

1 WAV文件

1.1 WAVE文件的存储结构[1]

WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写,WAVE文件由文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分。

表1 1 8KHz采样16比特量化的线性PCM语音信号的WAVE文件头格式

常见的声音文件主要有两种,分别对应于单声道(11.025kHz采样率、8Bit的采样值)和双声道(44.1kHz采样率、16Bit的采样值)。采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。对于单声道声音文件,采样数据为8位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高8位和低8位分别代表左右两个声道。WAVE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE文件是由样本组织而成的。在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本是交替出现的。

表1为其中一种WAVE文件格式。

1.2 WAVE文件读取程序实现

typedef struct

{WORD wFormatag;//编码格式;

WORD nChannls;//声道数,单声道为1,双声道为2;

DWORD nSamplesPerSec;//采样频率;

DWORD nAvgBytesperSec;//每秒的数据量;

WORD nBlockAlign;//块对齐;

}WAVEFORMAT;

BYTE*GetData (Cstring*pString)//获取声音文件数据的函数,pString参数指向要打开的声音文件;

{if(pString==NULL)

return NULL;

HMMIO file1;//定义HMMIO文件句柄;

file1=mmioOpen((LPSTR)pString,NULL,MMIO_READWRITE);//以读写模式打开;

if(file1==NULL)

{MessageBox("WAVE文件打开失败!");

return NULL;}

char style[4];//定义一个四字节的数据,用来存放文件的类型;

mmioSeek(file1,8,SEEK_SET);//定位到WAVE文件的类型位置;

mmioRead(file1,style,4);

if(style[0]!='W'||style[1]!='A'||style[2]!='V'||style[3]!='E')

//判断该文件是否为"WAVE"文件格式;

{MessageBox("该文件不是WAVE格式的文件!");

return NULL;}

PCMWAVEFORMAT format;//定义 PCMWAVEFORMAT结构对象,用来判断WAVE文件格式;

mmioSeek(file1,20,SEEK_SET);

//对打开的文件进行定位, 指向 WAVE文件的PCMWAVEFORMAT结构的数据;

mmioRead(file1,(char*)&format,sizeof(PCMWAVEFORMAT));//获取该结构的数据;

if(format.wf.nChannels!=2)//判断是否是立体声声音;

{MessageBox("该声音文件不是双通道立体声文件");

return NULL;}

mmioSeek(file1,24+sizeof(PCMWAVEFORMAT),SEEK_SET);

//获取WAVE文件的声音数据的大小;

long size;

mmioRead(file1,(char*)&size,4);

BYTE*pData;

pData=(BYTE*)new char[size];//根据数据的大小申请缓冲区;

mmioSeek(file1,28+sizeof(PCMWAVEFORMAT),SEEK_SET);//对文件重新定位;

mmioRead(file1,(char*)pData,size);//读取声音数据;

mmioClose(file1,MMIO_FHOPEN);//关闭WAVE文件;

return pData;}

2 WAVE文件滤波

2.1 滤波算法[2]

语音滤波的最终效果度量是人耳的主观感觉,所以在语音滤波中可以利用人耳感觉特性来减少运算的代价,利用自适应滤波器可以获得令人满意的解。

自适应横向滤波器具有以下功能:

1)按照某种自适应算法自动调节滤波系数的横向滤波器:分别以W1(n)…Wn(n)表示各个滤波器所在时刻的权系数。

2)调节这些系数的过程:首先自动调节滤波器系数的自适应训练步骤,然后利用滤波系数加权延迟线抽头上的信号来产生输出信号,将输出信号与期望信号进行对比,所得误差值通过一定的自适应控制算法再来调整权值,以保证滤波器处在最佳状态,达到实现滤波目的。

图1 自适应横向滤波器结构图

令 W(n)=[W1(n),W2(n),…,Wm(n)],x(n)=[x(n),x(n-1),…,x(n-m+1)]T

则输出信号:

误差序列:

其中d(n)为期望信号。显然,自适应滤波器控制机理是用误差序列e(n)按照某种准则和自适应算法对其系数{Wi(n)},=1,2,3,…m进行调节,最终使自适应滤波器的目标函数最小化达到最佳滤波状态。按照均方误差(MSE)准则定义:

将e(n)=d(n)-y(n)带入上式,均方误差函数重写为:

当滤波器系数固定时,均方误差函数又可写成:

其中:R=E[X(n)XT(n)]是输入信号的自相关矩阵;P=E[d(n)X(n)]是期望信号与输入信号的互相关矢量;将上式对W求导,并令其等于零,同时假设R是非奇异的,由此可得最佳滤波系数W0为:

由式可见,均方误差 ξ(n)是权矢量{Wj(n)},i=1,2,…,M 的二次函数它代表以{w,(n)},i=1,2,…,M 为自变量的一个“超抛物面”,均方误差ξ(n)达到最小值ξmin。几何上这相当于超抛物面的最小点。在一般情况下,滤波器在迭代过程中或当输入过程统计特性发生变化时,权矢量W并不正好等于W,而是处于某一最佳值W(n)上。为了减小误差,一个显然的方法是找出该工作点处使均方误差ξ(n)减小速率最大的方向,亦即梯度的负方向,然后令权矢量w(n)沿着梯度的负方向修正。令▽(n)代表n时刻的M×I维梯度矢量,则权矢量W(n+1)可用下列简单递归关系计算:

式中,u是一个正实数,通常称它为自适应收敛系数或步长因子。根据梯度矢量定义,▽(n)可写成:

可计算出滤波系数更新值:

上式是最陡下降法的数学公式,由此公式信号流程图图2。

图2 最陡下降算法的信号流图

2.2 最陡下降算法计算步骤

算法计算步骤如下:

1)根据所处理信号的特征,选取滤波器的阶数M及收敛因子u。

2)令W(0)=0,W(0)表示一维数为M,各分量为0的向量。

3)for(k=M;k<=N;k++)

X=[x(k),…,x(k-M+1)]T

y(k)=W(k)*X

e(k)=x(k)-y(k)

W(k+1)=W(k)+2*u*e(k)*X

3 结束语

本文分析讨论WAVE文件的存储结构以及其样本数据的存储结构,用VC++6.0语言实现PCM编码的WAVE文件的读取,滤波以及存储,得到了正确的结果。

[1]WAV波形文件的结构及其应用实践[J].微计算机信息,2005,21(8):114-119.

[2]张贤达,保铮.通信信号处理[M].北京:国防工业出版社,2002:258-270.

猜你喜欢
均方滤波器滤波
一类随机积分微分方程的均方渐近概周期解
Beidou, le système de navigation par satellite compatible et interopérable
从滤波器理解卷积
开关电源EMI滤波器的应用方法探讨
基于Canny振荡抑制准则的改进匹配滤波器
基于TMS320C6678的SAR方位向预滤波器的并行实现
基于抗差最小均方估计的输电线路参数辨识
RTS平滑滤波在事后姿态确定中的应用
基于线性正则变换的 LMS 自适应滤波
基于随机牵制控制的复杂网络均方簇同步