当前位置:首页 >> 信息与通信 >>

语音信号盲分离


I 武汉理工大学《基础群课设》课程设计报告书

《基础群课设》课程设计任务书
学生姓名: 指导教师: 题 目: 王成刚 黄 峥 专业班级: 工作单位: 通信 0906 班 信息工程学院

语音信号的盲分离

主要目的就是对学生进行基础课程、基本技能、基本动手能力的强化训练, 提高学生的基础理论知识、基本动手能力

,提高人才培养的基本素质。

一、 训练内容和要求
设计任务:根据盲信号分离原理,用 matlab 采集两路以上的语音信号,选择合适的混合矩 阵生成若干混合信号。选取合适的盲信号分离算法(如独立成分分析 ICA 等)进行训练学 习,求出分离矩阵和分离后的语音信号。 设计要求: (1) 用 matlab 做出采样之后语音信号的时域和频域波形图 (2) 选择合适的混合矩阵,得到混合信号,并做出其时域波形和频谱图 (3) 采用混合声音信号进行训练学习,求出分离矩阵,编写出相应的确 matlab 代码。 (4)用求出的分离矩阵从混合信号中分离出原语音信号,并画出各分离信号的时域波形和 频谱图。 (5)对结果进行对比分析。

二、 初始条件
计算机;Microsoft Office Word 软件;MATLAB 软件

三、 时间安排
1、 2012 年 6 月 18 日,作基础强化训练具体实施计划与报告格式要求的说 明;学生查阅相关资料,学习原理。 2、 2012 年 6 月 19 日,算法设计。 3、 2012 年 6 月 20 日至 2012 年 6 月 22 日,运用 MATLAB 软件仿真 4、 2012 年 6 月 23 日,上交基础强化训练成果及报告,进行答辩。

指导教师签名: 系主任(或责任教师)签名:

年 年

月 月

日 日

I

II 武汉理工大学《基础群课设》课程设计报告书





摘 要........................................................................................................................................... III Abstract ...........................................................................................................................................IV 1 Matlab 软件的简介...................................................................................................................... 1 2 语音信号的产生与获取............................................................................................................... 3 3 语音信号的处理........................................................................................................................... 5 3.1 语音信号的时域分析 ....................................................................................................... 5 3.1.1 语音信号的采集 ................................................................................................... 5 3.1.2 语音信号的时域波形图 ....................................................................................... 6 3.2 原始信号的频域分析 ....................................................................................................... 7 4 盲信号处理................................................................................................................................. 10 4.1 盲信号处理的概述 .......................................................................................................... 10 4.1.1 盲信号处理的基本概念 ................................................................................... 10 4.1.2 盲信号处理的方法和分类 ................................................................................. 10 4.1.3 盲信号处理技术的研究应用 ............................................................................. 11 4.2 盲源分离法..................................................................................................................... 12 4.2.1 盲源分离技术 ..................................................................................................... 12 4.2.2 盲分离算法实现 ................................................................................................. 12 4.2.3 盲源分离技术的研究发展和应用 ..................................................................... 13 4.3 独立成分分析................................................................................................................. 14 4.3.1 独立成分分析的定义 ......................................................................................... 14 4.3.2 ICA 的基本原理 .................................................................................................. 15 4.3.3 本文对 ICA 的研究目的及实现 ......................................................................... 17 4.3.4 分离结果分析 ...................................................................................................... 20 5 小结体会..................................................................................................................................... 23 附录 程序....................................................................................................................................... 25

II

III 武汉理工大学《基础群课设》课程设计报告书





语音信号盲分离处理的含义是指利用 BSS 技术对麦克风检测到的一段语音 信号进行处理。 混合语音信号的分离是盲分离的重要内容,目前的混叠语音分离 大 多 是 建 立 在 无 噪 环 境 中 的 混 叠 情 形 下 , 主 要 以 盲 源 分 离 (Blind Source Separation,BSS),根据信号的统计特性从几个观测信号中恢复出未知的独立源 成分。 本文重点研究了以语音信号为背景的盲处理方法, 在语音和听觉信号处理领 域中, 如何从混有噪声的的混叠语音信号中分离出各个语音源信号,来模仿人类 的语音分离能力,成为一个重要的研究问题。具体实现主要结合 ICA 技术,将 语音去噪作为一个预处理过程, 对带噪声的混叠语音盲分离进行了研究,本文详 细了介绍三种 FastICA 算法:SOBI 算法以及 CICA 算法,将三种算法应用于实 际的语音信号噪声分离中,并比较了传统算法和基于 ICA/BSS 算法在语音消噪 和增强方面的差异, 文章最后还介绍了分离效果评价准则, 并比较了 SNR 和 SIR 参数。 关键词 语音信号,语音信号噪声,盲源分离,独立成分分析

III

IV 武汉理工大学《基础群课设》课程设计报告书

Abstract
Blind separation of speech signal processing means is the use of BSS techniques microphone detects a voice signal processing. Separation of mixed speech signals is important for blind separation, the current separation of overlapping speech is built mostly in the absence of aliasing noise in the environment, under the circumstances, mainly in blind source separation (Blind Source Separation, BSS), the statistical characteristics of signal Several observations from the unknown signal to recover the independent source components; This article focuses on the background to the blind speech signal processing method, signal processing, speech and hearing, how the noise from a mixture of overlapping speech signal to separate the various audio source signals to mimic human speech separation ability become an important research question. Combination of concrete realization of the main ICA technology, speech denoising as a preprocessing of speech with noise-aliasing blind separation were studied, the paper introduces three kinds of FastICA algorithm: SOBI algorithm and the CICA algorithm, three kinds of algorithm application the actual noise in speech signal separation, and compared the traditional algorithm and the ICA / BSS algorithm in speech denoising and enhancement of the differences, the paper finally describes the separation evaluation criteria, and compared the SNR and SIR parameters. Keywords: Voice signal, voice signal noise, blind source separation, independent component analysis

IV

1 武汉理工大学《基础群课设》课程设计报告书

1 Matlab 软件的简介
一种语言之所以能如此迅速地普及,显示出如此旺盛的生命力,是由于它有 着不同于其他语言的特点。正如同 FORTRAN 和 C 等高级语言使人们摆脱了需 要直接对计算机硬件资源进行操作一样,被称作为第四代计算机语言的 MATLAB,利用其丰富的函数资源,使编程人员从繁琐的程序代码中解放出来。 MATLAB 的最突出的特点就是简洁。MATLAB 用更直观的、符合人们思维习惯 的代码,代替了 C 和 FORTRAN 语言的冗长代码。MATLAB 给用户带来的是最 直观、最简洁的程序开发环境。以下简单介绍一下 MATLAB 的主要特点。 ①语言简洁紧凑,使用方便灵活,库函数极其丰富。MATLAB 程序书写形 式自由, 利用其丰富的库函数避开繁杂的子程序编程任务,压缩了一切不必要的 编程工作。由于库函数都由本领域的专家编写,用户不必担心函数的可靠性。可 以说,用 MATLAB 进行科技开发是站在专家的肩膀上。 具有 FORTRAN 和 C 等高级计算机语言知识的读者可能已经注意到,如果 用 FORTRAN 或 C 语言去编写程序,尤其当涉及矩阵运算和画图时,编程会很 麻烦。 例如, 如果用户想求解一个线性代数方程, 就得编写一个程序块读入数据, 然后再使用一种求解线性方程的算法 (例如追赶法) 编写一个程序块来求解方程, 最后再输出计算结果。在求解过程中,最麻烦的要算第二部分。解线性方程的麻 烦在于要对矩阵的元素作循环, 选择稳定的算法以及代码的调试都不容易。即使 有部分源代码,用户也会感到麻烦,且不能保证运算的稳定性。解线性方程的程 序用 FORTRAN 和 C 这样的高级语言编写至少需要好几十行。再如用双步 QR 方法求解矩阵特征值,如果用 FORTRAN 编写,至少需要四百多行,调试这种几 百行的计算程序可以说很困难。以下为用 MATLAB 编写以上两个小程序的具体 过程。 用 MATLAB 求解下列方程,并求矩阵 A 的特征值。
? 32 13 45 67 ? ?1 ? ? ? ? ? 23 79 85 12 2 ? ,b ? ? ? A ? ? ?3 ? ? 43 23 54 65 ? ? ? ? ? ?4? ? 98 34 71 35 ? ? ?
1

Ax ? b ,

2 武汉理工大学《基础群课设》课程设计报告书

解为:x=A\b;设 A 的特征值组成的向量为 e,e=eig(A) 。 可见,MATLAB 的程序极其简短。更为难能可贵的是,MATLAB 甚至具有 一定的智能水平,比如上面的解方程,MATLAB 会根据矩阵的特性选择方程的 求解方法,所以用户根本不用怀疑 MATLAB 的准确性。 ②运算符丰富。由于 MATLAB 是用 C 语言编写的,MATLAB 提供了和 C 语言几乎一样多的运算符, 灵活使用 MATLAB 的运算符将使程序变得极为简短, 具体运算符见附表。 ③MATLAB 既具有结构化的控制语句(如 for 循环、while 循环、break 语句 和 if 语句) ,又有面向对象编程的特性。 ④语法限制不严格,程序设计自由度大。例如,在 MATLAB 里,用户无需 对矩阵预定义就可使用。 ⑤程序的可移植性很好, 基本上不做修改就可以在各种型号的计算机和操作 系统上运行。 ⑥MATLAB 的图形功能强大。 FORTRAN 和 C 语言里, 在 绘图都很不容易, 但在 MATLAB 里,数据的可视化非常简单。MATLAB 还具有较强的编辑图形界 面的能力。 ⑦MATLAB 的缺点是,它和其他高级程序相比,程序的执行速度较慢。由 于 MATLAB 的程序不用编译等预处理, 也不生成可执行文件, 程序为解释执行, 所以速度较慢。 ⑧功能强劲的工具箱是 MATLAB 的另一重大特色。 MATLAB 包含两个部分: 核心部分和各种可选的工具箱。 核心部分中有数百个核心内部函数。其工具箱又 可分为两类: 功能性工具箱和学科性工具箱。功能性工具箱主要用来扩充其符号 计算功能、图示建模仿真功能、文字处理功能以及与硬件实时交互功能。功能性 工具箱能用于多种学科。 而学科性工具箱是专业性比较强的, control、 如 toolbox、 signal processing toolbox、communication toolbox 等。这些工具箱都是由该领域内 的学术水平很高的专家编写的,所以用户无需编写自己学科范围内的基础程序, 而直接进行高、精、尖的研究。下表列出了 MATLAB 的核心部分及其工具箱等 产品系列的主要应用领域。
2

3 武汉理工大学《基础群课设》课程设计报告书

2 语音信号的产生与获取
一般来说,人的听觉能感知的声音频率范围为 20~20000Hz,在这一频率范 围内可感知的声音强度为 0~140dB,其中人耳比较敏感的区域在 50~4000Hz。 因此, 采集子系统的硬件参数可根据要分析的语音信号的频率和强度来确定。笔 者设计的语音采集子系统是通过 Realtek Ac'97 型声卡和 MATLAB 的数据采集工 具箱实现的。其中 Realtek Ac'97 型声卡的采样位数为 16 位,支持 8~44.1 kHz 的 采样速率,可以满足语音采集的硬件要求。 MATLAB 自带的数据采集工具箱(Data Acquisition Toolbox)是为简化和加 快数据采集工作而专门设计的,提供了一整套专门用于数据采集的命令和函数, 可用来直接控制与 PC 机兼容的数据采集设备的采集全过程。数据采集硬件设备 的内部特性对 MATLAB 的接口是完全透明的,通过调用 MATLAB 函数和命令 可对其进行访问, 并对其属性进行可视化监控,而且对于采集的数据既可以进行 实时分析,也可在存储后再进行处理,这样既方便了对实验测量数据的分析、比 较和可视化操作,又提高了语音信号采集的质量和灵活性。 配置好数据采集设备的参数后,使用 start 命令便可启动声卡开始语音信号 的采集。采集到的数据被暂时存放在 PC 机的内存里,理论上可采集的最大数据 量是由 PC 机的内存容量决定的,这一点相对于一般的数据采集系统而言有较强 的优势。MATLAB 还可以记录采集过程中出现错误,如出错的时间、错误产生 的来源以及数据采集设备的状态等信息都会被记录下来作为以后工作的参考。 采样位数为 16 位,支持 8~44.1kHz 的采样速率,可以满足语音采集的硬件 要求[1]。Matlab 自带的数据采集工具箱里面,提供了专门用 于语音采集的命令和函数。数据采集的硬件设备的内部特性对 Matlab 的接 口完全是透明的,通过调用 Matlab 提供的语音采集函数 和命令可以对其进行访问。 而且, Matlab 可以对其采集的数据进行实时的分 析,也可在存储后再进行处理。如图 2.1 所示:

3

4 武汉理工大学《基础群课设》课程设计报告书

话筒

数据采集设备 (声卡)

MATLAB 语 音 采 集工具箱

图 2.1 录取语音原理图

按照要求我一共制作了四个不同的语音信号,所采用的是 Windows 自带的 录音机,如图 2.2 所示:

图 2.2 自带录音机

经过这个软件的录制,将产生 wav 格式的语音信号。

4

5 武汉理工大学《基础群课设》课程设计报告书

3 语音信号的处理
3.1 语音信号的时域分析
3.1.1 语音信号的采集
选择一个 wav 文件作为分析的对象,可以利用 Windows 下的录音机或其他 软件,录制一段自己的话音,在 MATLAB 中,[y,fs,bits]=wavread('Blip',[N1 N2]); 用于读取语音,采样值放在向量 y 中,fs 表示采样频率(Hz),bits 表示采样位数。 [N1 N2]表示读取的值从 N1 点到 N2 点的值。 sound(y); 用于对声音的回放。向量 y 则就代表了一个信号,也即一个复杂 的“函数表达式” ,也可以说像处理一个信号的表达式一样处理这个声音信号。 下面是语音信号在 MATLAB 中的语言程序,它实现了语音的读入与打开, 并绘出了语音信号时域波形,然后对语音信号进行频谱分析。在 MATLAB 中, 可以利用函数 fft 对信号进行快速傅里叶变化,得到信号的频谱特性。 在频谱特性中分析最大值的位置(可能有几个) ,它代表的频率和时域的采 样时间有关,相邻的两点之间的距离为。其中,N 是离散傅里叶变换用的点数, 是采样的时间,前面在读取 wav 文件时得到了采样频率。 既然知道了该声波的频谱, 按频率就可以反演它的时域值,利用以上分析的 主要峰值来重构声波。 由于没有考虑相位和其他的频谱分量,所以波形和原来的 波形相差甚大,但大体的频率是没有错的。具体程序如下:
clear; [filename,filepath]=uigetfile('.wav','Open wav file'); [v,fs,bits]=wavread([filepath,filename]); n = 1:length(v); t = n/fs; plot(t,v); axis([0 33.5 -1 1]); xlabel('Time [sec]'); ylabel('amplitude'); title('原始信号'); set(gcf, 'Color', [1 1 1]) sound(v,fs);
5

6 武汉理工大学《基础群课设》课程设计报告书

pause(length(v)/fs);

结果如图2.1所示:

图 3.1 原始语音

3.1.2 语音信号的时域波形图
语音信号的时域分析就是分析和提取语音信号的时域参数。进行语音分析 时, 最先接触到并且也是最直观的是它的时域波形。 语音信号本身就是时域信号, 因而时域分析是最早使用, 也是应用最广泛的一种分析方法,这种方法直接利用 语音信号的时域波形。 时域分析通常用于最基本的参数分析及应用,如语音的分 割、预处理、大分类等。这种分析方法的特点是:①表示语音信号比较直观、物 理意义明确。②实现起来比较简单、运算且少。③可以得到语音的一些重要的参 数。④只使用示波器等通用设备,使用较为简单等。 语音信号的时域参数有短时能量、短时过零率、短时白相关函数和短时平均 幅度差函数等, 这是语音信号的一组最基本的短时参数,在各种语音信号数字处 理技术中都要应用[6]。在计算这些参数时使用的一般是方窗或汉明窗。 对语音信号进行分析,发现发浊音时,尽管声道有若干个共振峰,但由于声 门波引起谱的高频跌落,所以其话音能量约集中在 3kHz 以下。而发清音时,多 数能量出现在较高频率上。 高频就意味着高的平均过零率,低频意味着低的平均 过零率,所以可以认为浊音时具有较低的过零率,而清音时具有较高的过零率。 当然,这种高低仅是相对而言,并没方精确的数值关系。其程序如下:
%%function fftoperate_Callback(hObject, eventdata, handles) y=handles.hdata; fs=handles.hfs; recordtime=handles.hrecordtime; ll=fs*recordtime;
6

7 武汉理工大学《基础群课设》课程设计报告书

n=2; while n<ll, n=n*2; end n=n/4; X=fft(y,n); X(1)=0; freq=fs*(0:(n/2-1))/n; power=abs(X(1:n/2)).^2/(length(X)); [maxp,i]=max(power); set(handles.textfreqmax,'String',freq(i)); set(handles.textpowermax,'String',maxp); figure plot(freq,power,'g')

其波形图如图 2.2 所示:

图 3.2 原始信号波形

3.2 原始信号的频域分析
信号频谱分析是将信号源发出的信号强度按频率顺序展开, 使其成为频率的 函数, 并考察变化规律。 频谱分析主要分析信号是由哪些频率的正弦信号叠加得 到的,以及这些正弦信号的振幅。频谱分析的意义可以说是很明确的,就是分析 信号的频率构成。 更确切地说就是用来分析信号中都含有哪几种正弦波成份。反
7

8 武汉理工大学《基础群课设》课程设计报告书

过来说就是,该信号可以用哪几种频率的正弦波来合成出来。 对于频谱分析的目的, 如研究噪声的频谱是为了深入了解噪声源的特性 帮助寻找主要的噪声污染源, 为噪声控制提供依据。有关频谱分析的应用软件和 方法,我们知道对信号进行频谱分析,往往对其进行傅里叶变换,观察其频谱幅 度与频谱相位。 傅里叶变换简单通俗理解就是把看似杂乱无章的信号考虑成由一 定振幅、相位、频率的基本正弦(余弦)信号组合而成,是将函数向一组正交的 正弦、余弦函数展开,傅里叶变换的目的就是找出这些基本正弦(余弦)信号中 振幅较大(能量较高)信号对应的频率,从而找出杂乱无章的信号中的主要振动 频率特点。如减速机故障时,通过傅里叶变换做频谱分析,根据各级齿轮转速、 齿数与杂音频谱中振幅大的对比,可以快速判断哪级齿轮损伤。分析软件主要为 Matlab。 对于信号来说,分模拟信号与数字信号。对于模拟信号来说,往往对 其进行抽样, 然后进行快速傅里叶变换 (fft) 然后对其幅度 , (abs) 和相位 (angle) 的图像进行分析。 对于数字信号, 则可直接进行快速傅里叶变换。 正弦波、 方波、 三角波和白噪声信号是实际工程测试中常见的典型信号,这些信号时域、频域之 间的关系很明确, 并且都具有一定的特性, 通过对这些典型信号的频谱进行分析, 对掌握信号的特性, 熟悉信号的分析方法大有益处,并且这些典型信号也可以作 为实际工程信号分析时的参照资料。其程序如下:
fs=25600; 音频.wav'); sound(x,fs,bits); y1=fft(x,4096); f=fs*(0:2047)/4096; figure(1) magy1=abs(y1); angy1=angle(y1); subplot(3,1,1),plot(x);title('原始信号波形') subplot(3,1,2),plot(magy1);title('原始信号幅值') subplot(3,1,3),plot(angy1);title('原始信号相位') figure(2) freqz(x) title('频率响应图') figure(3) plot(f,abs(y1(1:2048))); %绘制原始语音信号的频率响应图 %播放语音信号 %对信号做 2048 点 FFT 变换 %语音信号采样频率为 25600

[x,fs,bits]=wavread('C:\Documents and Settings\Administrator\桌面\语音\

8

9 武汉理工大学《基础群课设》课程设计报告书

title('原始语音信号频谱') xlabel('Hz'); ylabel('fudu'); axis([0 4500 0 400])

其频谱图如图 3.3 所示:

图 3.3 原始信号频谱图

9

10 武汉理工大学《基础群课设》课程设计报告书

4 盲信号处理
4.1 盲信号处理的概述
4.1.1 盲信号处理的基本概念

盲信号处理是现代数学信号处理、算智能学近年来迅速发展的重要方向。电 子信息、通信、生物医学、图像增强、雷达、地球物理信号处理等众多领域有广 泛的应用前景。 盲信号处理就是利用系统(如无线信道、 通信系统等)的输出观测数据,通过某 种信号处理的手段, 获得我们感兴趣的有关信息(如原来独立发射的信号等)。 盲信号的研究是当前学术界的一个研究热点, 而盲信号分离则是盲信号研究 中的一个重要的课题。 BSS 是指从观测到的混合信号中分离出未知的源信号。 盲 信号中的“盲”意味着两个方面: 第一, 对源信号一无所知或只有少许的先验知识。 第二,混合本身是未知的。这看似是一个不可能的任务,然而理论和实际都证实 了只需要相当简单的假设,就可以得到该问题的解。这一特点使得 BSS 成为一 种功能相当强大的信息处理方法。如图 4.1 所示:

S(t) 混合矩阵

X(t) 分离矩阵

Y(t)

噪 声 向 量

图 4.1 盲处理原理框图

4.1.2 盲信号处理的方法和分类
在盲信号处理中, 就源信号进过传输通道的混合方式而言,其处理方法可分

10

11 武汉理工大学《基础群课设》课程设计报告书

为线性瞬时混合信号盲处理、 线性卷积混合信号盲处理和非线性混合信号盲处理 三类。 根据通道传输特性中是否含有噪声、噪声特性(白噪声、有色噪声等) 、噪 声混合形式,可分为有噪声、无噪声盲处理,含加性噪声和乘性噪声混合信号盲 处理等。 按源信号和观测信号数目的不同可以将混合方式分为欠定 、适定和超定情 况 ;按源信号特性的不同分为 : 平稳 、非平稳 、超高斯 、亚高斯 、超高斯和 亚高斯混合分离等 。 盲处理的目的可分为盲辨识和盲源分离两大类。 盲辨识的目的是求得传输通 道混合矩阵(新型混合矩阵、卷积混合矩阵、非线性混合矩阵等) 。盲源分离的 目的是求得源信号的最佳估计。 当盲源分离的各分量相互独立时,就称为独立分 量分析,即独立分量分析是盲源分离的一种特殊情况。

4.1.3 盲信号处理技术的研究应用
近年来, 盲信号处理逐渐成为当今信息处理领域中热门的课题之一,并且已 经在尤其在生物医学工程、医学图像、语音增强、遥感、通信系统、地震探测、 地球物理学、 计量经济学和数据挖掘等领域显示出诱人的前景,特别是盲源分离 技术、ICA 的不断发展和应用最为引人注目。下面介绍盲处理应用中的两个主要 方面: 1.语音识别领域 语音信号分离、 语音识别是盲处理应用的一个重要领域。最典型的应用就是 声控计算机, 计算机所接受到的语音指令肯定是肯定是带有各种环境噪声的,还 可能存在其他的语音信号(如有其他人说话) ,而且这些信号源与接收器的相对 位置也未知,计算机需要在这种情况下识别出正确的语音命令。在移动通信中, 往往存在通信质量问题, 极大的影响了通话效果,而盲源分离或盲均衡技术能够 消除噪声、抑制干扰及增强语音,提高通话质量。 2.生物医学信号处理 在生物医学领域,盲信号处理可应用于心电图(ECG) 、脑电图(EEG)信 号分离、听觉信号分析、功能磁共振图像(FMRI)分析等。例如人们常常需要
11

12 武汉理工大学《基础群课设》课程设计报告书

从肌电图中确定神经元细胞信号的触发模式,而 EMG 信号通常由多个特殊的传 感器在人体表处测得, 从信号源到传感器之间的信号传输介质参数是未知的,而 人们之间各不相同。 目前已经有一些学者将盲源分离技术成功地够应用于脑电图 等信号的数据处理。

4.2 盲源分离法
4.2.1 盲源分离技术
盲源信号分离(Blind Source Separation, BSS) 是 20 世纪 90 年代迅速发展起 来的一个研究领域 。它具有可靠的理论基础和许多方面的应用潜力。其在生物 医学工程 、医学图像 、语音增强 、遥感 、通信系统 、地震探测等领域有着 广泛而诱人的前景 ,盲源分离成为信号处理和神经网络领域的研究热点 。 盲源分离是针对从检测的混合信号中估计或恢复源信号的问题提出的, 是指源 信号、传输通道特性未知的情况下,仅由观测信号和源信号的一些先验知识(如 概率密度)估计出源信号各个分量的过程。例如最著名的鸡尾酒会问题,仅根据 多个麦克风检测信号分离或恢复出某种语音源信号。

4.2.2 盲分离算法实现
在实际的 ICA 盲分离算法应用中,一般有时是必需的对观测数据做一些预处 理技术,如用主成分分析 ( PCA )降维和白化,用滤波器进行滤波降噪处理等。另 外,由于恢复准则的局限以及先验知识的缺乏,盲信号分离方法只能得到源信号的 波形,而无法确定信号的幅值以及信号之间的顺序。这两点都需要人为的制定规 则(如规定信号的方差为 1 来确定幅值)来确定。如图 4.2 所示:

图 4.2 盲信号分离基本原理框图

12

13 武汉理工大学《基础群课设》课程设计报告书

4.2.3 盲源分离技术的研究发展和应用
1986 年, 法国学者 Jeanny Herault 和 Christian Jutten 提出了递归神经网络模 型和基于 Hebb 学习律的学习算法,以实现 2 个独立源信号混合的分离。这一开 创性的论文在信号处理领域中揭开了新的一章,即盲源分离问题的研究。 其后二十几年来,对于盲信号分离问题,学者们提出了很多的算法,每种算 法都 在一定程度上取得了成功。从算法的角度而言,BSS 算法可分为批处理算 法和自适应算法;从代数函数和准则而言,又分为基于神经网络的方法、基于高 阶统计量的方法、基于互信息量的方法、基于非线性函数的方法等。尽管国内对 盲信号分离问题的研究相对较晚,但在理论和应用方面也取得很大的进展。清华 大学的张贤达教授在其 1996 年出版的《时间序列分析——高阶统计量方法》一 书中,介绍了有关盲分离的理论基础,其后关于盲分离的研究才逐渐多起来。近 年来国内各类基金支持了盲信号处理理论和应用的项目,也成立了一些研究小 组。 虽然盲源分离理论方法在最近 20 年已经取得了长足的发展,但是还有许多 问题有待进一步研究和解决。 首先是理论体系有待完善。实际采用的处理算法或 多或少都带有一些经验知识, 对于算法的稳定性和收敛性的证明不够充分。盲源 分 离尚有大量的理论和实际问题有待解决,例如多维 ICA 问题、带噪声信号的 有效分离方法、 如何更有效地利用各种先验知识成功分离或提取出源信号、一般 性 的非线性混合信号的盲分离、如何与神经网络有效地结合、源信号的数目大 于观察信号的数目时 ICA 方法等。另外,盲源分离可同其他学科有机结合,如 模糊系 统理论在盲分离技术中的应用可能是一个有前途的研究方向;盲源分离 技术与遗传算法相结合,可以减少计算复杂度,提高收敛速度。如何有效提高算 法对源信号统计特性的学习和利用也需要进行深入研究。在硬件实现方面,盲分 离问题也存在着极大的发展空间,例如用 FPGA 实现等。 经过人们将近 20 年的共同努力, 有关盲分离的理论和算法得到了较快发展, 包括 盲分离问题本身的可解性,以及求解原理等方面的基本理论问题在一定程 度上得到了解决,并提出了一些在分离能力、内存需求、计算速度等方面性能各 异的 算 法。 由于该问题的理论研究深度和算法实现难度都较大,目前对于盲分
13

14 武汉理工大学《基础群课设》课程设计报告书

离的研究 仍然很不成熟,难以满足许多实际应用需求,许多理论问题和算法实 现的相应技术也有待进一步探索。

4.3 独立成分分析
独立分量分析 ( Independent Component Analy2sis , ICA) 是 由 Herault 和 J utten 在 1983 年提出,该方法不依赖与源信号类型相关的详细知识或信号传输系 统特性的精确辨识,是一种有效的冗余取消技术,被广泛应用于盲源分离 ( blind source separation BSS)、特征提取和盲解卷、生理学数据分析语音信号处理、图 像处理及人脸识别等领域。 该方法根据代价函数的不同 ,可以得到不同的 ICA 算 法,如信息最大化(infomax)算法、 Fast ICA 算法、 最大熵( M E)和最小互信息( MM I)算法、极大似然(ML)算法等。 在 统 计 学 中 , 独 立 成 分 分 析 或 独 立 分 量 分 析 ( Independent components analysis, 缩写:ICA) 是一种利用统计原理进行计算的方法。 它是一个线性变换。 这个变换把数据或信号分离成统计独立的非高斯的信号源的线性组合。 独立成分 分析是盲信号分离(Blind source separation)的一种特例。

4.3.1 独立成分分析的定义
ICA 是一种用来从多变量 (多维) 统计数据里找到隐含的因素或成分的方法, 被认为是主成分分析(Principal Component Analysis, PCA)和因子分析(Factor Analysis)的一种扩展。对于盲源分离问题,ICA 是指在只知道混合信号,而不 知道源信号、 噪声以及混合机制的情况下,分离或近似地分离出源信号的一种分 析过程。 独立成分分析(Independent Component Analysis, ICA)是近年来出现的一种 强有力的数据分析工具(Hyvarinen A, Karhunen J, Oja E, 2001; Roberts S J, Everson R, 2001) 。1994 年由 Comon 给出了 ICA 的一个较为严格的数学定义, 其思想最早是由 Heranlt 和 Jutten 于 1986 年提出来的。 ICA 从出现到现在虽然时 间不长,然而无论从理论上还是应用上,它正受到越来越多的关注,成为国内外 研究的一个热点。 特别是从应用角度看,它的应用领域与应用前景都是非常广阔
14

15 武汉理工大学《基础群课设》课程设计报告书

的,目前主要应用于盲源分离、图像处理、语言识别、通信、生物医学信号处理、 脑功能成像研究、故障诊断、特征提取、金融时间序列分析和数据挖掘等。 盲源分离技术是近二十年发展起来的一门新型科学, 在各国科学家和研究人 员的努力下获得了充分的发展,但是 ICA 的研究方兴未艾,它毕竟是一个涉及 面广并且仍处于发展前沿的课题,在理论上还远没有成熟,许多问题有待进一步 研究和解决。 (1)带噪混合信号的盲分离问题。盲信号处理中的未知条件太多,混合信号 含有噪声的情况下的盲源分离问题解决起来是相当困难的。 尽管目前已有部分算 法对存在噪声的情况表现出了良好的性能,但由于噪声种类繁多,因此处理起来 仍很棘手。 现有的大多数盲源分离或盲解卷积算法都假设不含噪声或者把噪声看 作是一个独立的信源信号来处理。 (2)非平稳混合信号的盲源分离算法。许多情况下源信号可能是非平稳的, 如何利用信号的非平稳特性进行盲源分离是摆在广大研究人员面前的一个现实 问题。 (3)卷积混合信号的盲源分离算法。在实际中,系统接收到的混合输入信号 是源信号经过不同的传播途径到达接收器。在这个过程中,不可避免的存在信号 的时延和反射。针对这种情况的盲源分离算法还很不成熟。 (4)ICA 的推广应用。在算法应用方面,ICA 可以取得进一步的发展,如可 以在语音识别、图像处理、特征提取、医学信号处理方面作进一步的研究。目前 的关键的问题是如何将理论算法转化为实际应用, 以及如何建立更加符合实际情 况的模型等。 (5)算法的收敛性。算法全局收敛性的研究,可以考虑将遗传算法、混沌算 法等具有全局收敛性的优化算法和 ICA 结合起来,提高算法的全局收敛性。

4.3.2 ICA 的基本原理
(1)无噪声的 ICA 模型

ICA 作为生成模型的估计给定随即变量的一组观测 x1 ( t ), x 2 ( t ), x 3 ( t ) … 其中 t 是时间或者样本标号,假设它们有独立成分线性混合而产生:

x n (t )



15

16 武汉理工大学《基础群课设》课程设计报告书

? s1 ( t ) ? ? x1 ( t ) ? ? ? ? ? s (t ) x (t ) ? 2 ? 2 ? ? ? s3 (t ) ? ? x3 (t ) ? ? ? ? ? ? x4 (t ) ? ? s (t ) ? =A ? 4 ?

(1)

式中, A 是某个未知矩阵。 用向量-矩阵符号方式表示通常比上面的求和表达式更为方便。 用随机向量 x 来表示混合向量,其元素分别为
x1 , ..., x n

,同样地,用 s 来表示元素
T

s1 , ... s n

,用矩

阵 A 表示那些混合系数 a ij 。所有的向量都理解为列向量;这样 x 或者称 x 的转 置就是一个行向量。利用向量和矩阵符号表示,混合模型可以写为:

x? As

(2)

有时我们需要使用矩阵 A 中的列向量, 如果将其表示为,则模型也可以写为:

x ?
(2)有噪声的 ICA 模型

?as
i i ?1

n

i

(3)

将基本的 ICA 模型扩展到有噪声的情形,并且假设噪声是以加性噪声形式 存在的。 这是一个相当现实的假设,因为加性噪声是因子分析和信号处理中通常 研究的标准形式,具有简单的噪声模型表达方式。因此,噪声 ICA 模型可表示 为:

x ? As ? n
式中,
n ? ? n1 , ... nn ?
T

(4)

是噪声向量。

信号源噪声,即直接添加到独立成分(即信号源)上的噪声。信号源噪声可 用与式(2.1)稍有差别的下式来表示:

x ? A(s ? n)

(5)

实际上,如果可以直接考虑带噪声的独立成分,那么可将此模型写为:

x ? As
可以看出,这就是基本的 ICA 模型,只是独立成分本身变了。

~

(6)

16

17 武汉理工大学《基础群课设》课程设计报告书

4.3.3 本文对 ICA 的研究目的及实现
独立分量分析的含义是把信号分解成若干个互相独立的成分, 它是为了解决 盲信号分离的问题而发展起来的。如果信号本来就是由若干独立信源混合而成 的,ICA 就能恰好把这些信源分解开来。故在一般的文献中通常把 ICA 等同于 BSS,ICA 不同于主分量分析把目光投注于信号的二阶统计量,研究信号间的相 关关系,而是基于信号的高阶统计量,研究信号间的独立关系。原始信号如图 4.3 所示:
-3

2 0 -2 5 0
amplitude

x 10

原始信号

0 500 -3 x 10

1000

1500

2000

2500

3000

3500

4000

4500

5000

-5 2 0 -2 5 0 -5

0 500 -3 x 10

1000

1500

2000

2500

3000

3500

4000

4500

5000

0 500 -3 x 10

1000

1500

2000

2500

3000

3500

4000

4500

5000

0

500

1000

1500

2000

2500 3000 sample

3500

4000

4500

5000

图 4.3 原始信号

混合信号如图 4.4 所示:

17

18 武汉理工大学《基础群课设》课程设计报告书

5 0 -5
amplitude

x 10

-3

混合信号

0

500

1000

1500

2000

2500

3000

3500

4000

4500

5000

0.01 0 -0.01 5 0 -5 0.02 0 -0.02 0 500 1000 1500 2000 2500 sample 3000 3500 4000 4500 5000 0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000 0 500 -3 x 10 1000 1500 2000 2500 3000 3500 4000 4500 5000

图 4.4 混合信号

独立成分分析方法能够基于信息的的独立性来估计 合信号
x1 ( t ), x 2 ( t ), x 3 ( t )

a ij

,这样我们就能从混 。

中分离出三个原始信号

s1 ( t ), s 2 ( t ), s 3 ( t )

该仿真的混合矩阵是由计算机在 ICALAB 工具箱环境下产生的,参数如 4.5 所示:

图 4.5 矩阵 A 参数

18

19 武汉理工大学《基础群课设》课程设计报告书

即该矩阵为一个 4x4 的方阵:
? ? 1 .0 0 0 0 ? ? 0 .5 2 5 0 A? ? ? ? 1 .0 0 0 0 ? ? 2 .2 9 4 9 ? 1 .0 0 0 0 ? 3 .4 0 5 7 ? 1 .0 0 0 0 ? 1,1 2 1 0 1 .0 0 0 0 0 .1 5 8 2 1 .0 0 0 0 0 .8 0 9 6 ? 1 .0 0 0 0 ? ? ? 2 .6 0 9 4 ? 1 .0 0 0 0 ? ? ? 3 .9 0 4 3 ?

根据所求矩阵可得混合矩阵波形图如图 4.6 所示:
混合矩阵 1 0 -1 5 0
amplitude

1

1.5

2

2.5

3

3.5

4

-5 1 0 -1 5 0 -5

1

1.5

2

2.5

3

3.5

4

1

1.5

2

2.5

3

3.5

4

1

1.5

2

2.5 sample

3

3.5

4

图 4.6 混合矩阵波形图

已知混合矩阵与混合信号, 根据 ICA 算法可以得到分离信号, 如图 4.7 所示:

19

20 武汉理工大学《基础群课设》课程设计报告书

5 0 -5 2 0
amplitude

x 10

7

0 500 5 x 10

1000

1500

2000

2500 3000 分离信号1

3500

4000

4500

5000

-2 1 0 -1 1 0 -1

0 500 7 x 10

1000

1500

2000

2500 3000 分离信号2

3500

4000

4500

5000

0 500 6 x 10

1000

1500

2000

2500 3000 分离信号3

3500

4000

4500

5000

0

500

1000

1500

2000 2500 3000 分离信号4 sample

3500

4000

4500

5000

图 4.7 分离信号

4.3.4 分离结果分析
我们分别使用 FastICaA 算法对 Dkumar1.wav ,Ganesh1.wav, Ganesh2.wav, Kath2.wav 作为源信号的混叠进行盲分离试验, 从中分离出的四个源信号的近似 值 y1,y2,y3 和 y4,这种算法在 ICALAB 中的实现方式如图 4.8 所示:

20

21 武汉理工大学《基础群课设》课程设计报告书

图 4.8 FPICA 算法在 ICA 工具箱的实现

原始语音信号、混合后的语音信号、分离后的语音信号时域图分别如图 4.9、图 4.10 和图 4.11 所示:

图 4.9 原始信号时域图

21

22 武汉理工大学《基础群课设》课程设计报告书

图 4.10 混合后语音信号时域图

图 4.11 分离后语音信号时域图

22

23 武汉理工大学《基础群课设》课程设计报告书

5 小结体会
盲源分离算法是盲源分离问题的核心,本文研究了现有的几种盲源分离算 法, 并在这些算法的基础上结合具体应用于语音信号的噪声处理, 对其加以改进, 给出了新的算法。论文的主要工作如下: 1.研究独立成分分析的原理及其基本模型。传统的选取盲源分离算法只适 用于单纯超高斯信号(或者亚高斯信号)混合系统的分离, 不适用于杂系混合(超高 斯和亚高斯信号)系统的分离。论文中的 ICA 主要应用于语音信号噪声的实现算 法, 及目前的去除或抑制噪声方法分析,引出独立成分分析不能应用于高斯信号 和非独立信号,可用来抑制高斯噪声。 2.语音信号是一种非平稳信号,本文研究了二阶盲辨识(SOBI)盲源分离 算法,快速定点(FastICA)算法以及约束独立分量分析(CICA)算法,利用这三 种算法有效地解决了噪声在语音信号中的分离问题, 可以在不需要白化过程的情 况下,得到良好的分离效果。对算法进行了计算机仿真,并将三种算法在不同噪 声环境下的仿真结果进行了比较。 盲源分离技术正在不断的发展,新的问题和算法层出不穷。虽然已经有很多 成熟的盲源分离算法, 但是, 作者认为还是有很多问题待于进一步的研究和解决: (1)带噪声混合信号的盲分离问题。由于在盲信号处理中,存在太多的未知 条件, 带噪声的混迭信号的盲分离是十分困难的。现在研究的大部分盲源分离或 者盲反卷积算法,都假设无噪声的情况或者把噪声看作一个独立的源信号, 在高阶统计方法中, 由于高斯信号高阶累计量为零,所以可以假设加性高斯 噪声的存在, 但是对于已有的盲源分离算法在什么情况下可以应用到一般的噪声 混迭模型,是有待解决的问题。 (2)欠完备情形的盲源分离问题。无论是盲源分离还是盲解卷积,现存的大 多数算法都假设传感器的数目大于或者等于源信号的个数, 这是一种超完备 形。 然而, 传感器数目少于信号源数目的欠完备问题也是需要解决的一大难题. 此 外,在工程实际中,信号源的数目有可能随时问动态变化,如何确定源的数目, 保证算法的有效也是一个亟待解决的问题。 (3)非线性混合情形的盲源分离问题.本文主要研究的是源信号的线性混合
23

24 武汉理工大学《基础群课设》课程设计报告书

模型,而非线性混合模型才更具有一般性,对它的深入研究,也会使将来研 究的一个热点问题。 (4)盲源分离算法的实际应用。现有的一些算法由于速度太慢,达不到实时 要求,而无法应用于实际问题中。在保证算法性能的条件下,降低算法的复杂性 提高计算效率,也是一个关于 BSS 的很重要的研究方向。 当前的语音信号盲分离算法所能解决的问题是有一定的适用范围和限制条 件的, 仍然处在实验室研究阶段,使这些算法从实验室真正走向应用还有很长的 研究历程。

24

25 武汉理工大学《基础群课设》课程设计报告书

附录 程序
clc;clear all;close all; fs=1000; N=1024; t=(0:N-1)/fs; f1=60; f2=150; f3=200; I1=sin(2*pi*f1*t); I2=cos(2*pi*f2*t); I3=randn(size(t)); % I3=sin(2*pi*f3*t); subplot(4,3,1),plot(I1),title('输入信号1'),axis([0,100,-4,4]); subplot(4,3,2),plot(I2),title('输入信号2'),axis([0,100,-4,4]); subplot(4,3,3),plot(I3),title('输入信号3'),axis([0,100,-4,4]); % 将其组成矩阵 S=[I1;I2;I3]; Sweight=rand(size(S,1)); MixedS=Sweight*S; % 将混合矩阵重新排列并输出 subplot(4,3,4),plot(MixedS(1,:)),title('混合信号1'),axis([0,100,-4,4]); subplot(4,3,5),plot(MixedS(2,:)),title('混合信号2'),axis([0,100,-4,4]); subplot(4,3,6),plot(MixedS(3,:)),title('混合信号3'),axis([0,100,-4,4]); MixedS_bak=MixedS; %%%%%%%%标准化 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MixedS_mean=zeros(3,1); for i=1:3 MixedS_mean(i)=mean(MixedS(i,:)); end for i=1:3 for j=1:size(MixedS,2) MixedS(i,j)=MixedS(i,j)-MixedS_mean(i); end end %%%%%%白化 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % cov为求协方差的函数 % 对信号矩阵的协方差函数进行特征值 % Q为白化矩阵 % MixedS_white为白化后的信号矩阵 % 计算MixedS的均值

MixedS_cov=cov(MixedS'); [E,D]=eig(MixedS_cov); 分解 Q=inv(sqrt(D))*(E)'; MixedS_white=Q*MixedS;

25

26 武汉理工大学《基础群课设》课程设计报告书

IsI=cov(MixedS_white'); %%FASTICA算法

% IsI应为单位阵

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 以下算法将对X进行操作 % 在此应用中,独立元个数等于变量个数 % 初始化列向量w的寄存矩阵,B=[b1

X=MixedS_white; [VariableNum,SampleNum]=size(X); numofIC=VariableNum; B=zeros(numofIC,VariableNum); b2 ... bd] for r=1:numofIC i=1;maxIterationsNum=100; 分量而言迭代均不超过此次数) IterationsNum=0; b=rand(numofIC,1)-.5; b=b/norm(b); 开根号 while i<=maxIterationsNum+1 if i == maxIterationsNum

% 设置最大迭代次数(即对于每个独立

% 随机设置b初值 % 对b标准化 norm(b):向量元素平方和

% 循环结束处理

fprintf('\n第%d分量在%d次迭代内并不收敛。', r,maxIterationsNum); break; end bOld=b; a2=1; u=1; t=X'*b; g=t.*exp(-a2*t.^2/2); dg=(1-a2*t.^2).*exp(-a2*t.^2/2); b=((1-u)*t'*g*b+u*X*g)/SampleNum-mean(dg)*b; % 核心公式,参见理论部分公式2.52 b=b-B*B'*b; b=b/norm(b); if abs(abs(b'*bOld)-1)<1e-9 B(:,r)=b; break; end i=i+1; end % B(:,r)=b; end %%%%%%ICA计算的数据复原并构图 ICAedS=B'*Q*MixedS_bak; % 将混合矩阵重新排列并输出 subplot(4,3,7),plot(ICAedS(1,:)),title('ICA解混信号 % 保存所得向量b % 对b正交化 % 如果收敛,则 % 保存所得向量b

%%%%%%%%%%%%%%%%%%%%%%%%% % 计算ICA后的矩阵

26

27 武汉理工大学《基础群课设》课程设计报告书

1'),axis([0,100,-4,4]); subplot(4,3,8),plot(ICAedS(2,:)),title('ICA解混信号 2'),axis([0,100,-4,4]); subplot(4,3,9),plot(ICAedS(3,:)),title('ICA解混信号 3'),axis([0,100,-4,4]);

27

28 武汉理工大学《基础群课设》课程设计报告书

function [y,Fs,bits,opt_ck] = wavread(varargin) %WAVREAD Read Microsoft WAVE (".wav") sound file. % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % Output Scaling The range of values in Y depends on the data format FMT specified. Some examples of output scaling based on typical bit-widths found in a WAV file are given below for both 'double' and 'native' formats. FMT='native' #Bits ----8 16 24 32 MATLAB data type uint8 (unsigned integer) int16 (signed integer) int32 (signed integer) single (floating point) Data range 0 <= Y <= 255 -32768 <= Y <= +32767 -2^23 <= Y <= 2^23-1 -1.0 <= Y <= +1.0 ------------------------- ------------------[Y,FS,NBITS,OPTS]=WAVREAD(...) returns a structure OPTS of additional information contained in the WAV file. structure differs from file to file. The content of this Typical structure fields SIZ=WAVREAD(FILE,'size') returns the size of the audio data contained in the file in place of the actual audio data, returning the 2-element vector SIZ=[samples channels]. [Y,...]=WAVREAD(...,FMT) specifies the data type format of Y used to represent samples read from the file. If FMT='double', Y contains double-precision normalized samples. If FMT='native', Y contains samples in the native data type found in the file. Interpretation of FMT is case-insensitive, If omitted, FMT='double'. and partial matching is supported. [...]=WAVREAD(FILE,N) returns only the first N samples from each channel in the file. [...]=WAVREAD(FILE,[N1 N2]) returns only samples N1 through N2 from each channel in the file. [Y,FS,NBITS]=WAVREAD(FILE) returns the sample rate (FS) in Hertz and the number of bits per sample (NBITS) used to encode the data in the file. Y=WAVREAD(FILE) reads a WAVE file specified by the string FILE, returning the sampled data in Y. The ".wav" extension is appended if no extension is given.

include '.fmt' (audio format information) and '.info' (text which may describe title, author, etc.)

28

29 武汉理工大学《基础群课设》课程设计报告书

% % % % % % % % % % % % % %

FMT='double' #Bits ----N<32 N=32 MATLAB data type double double Data range -1.0 <= Y < +1.0 ------------------------- -------------------1.0 <= Y <= +1.0

Note: Values in y might exceed -1.0 or +1.0 for the case of N=32 bit data samples stored in the WAV file. Supports multi-channel data, with up to 32 bits per sample. Supports Microsoft PCM data format only. See also WAVWRITE, AUREAD, AUWRITE. Copyright 1984-2009 The MathWorks, Inc. $Revision: 1.1.6.11 $ $Date: 2009/02/10 20:56:01 $

% Parse input arguments: [file,ext,isNative] = parseArgs(varargin{:}); % Open WAV file: [fid,msg] = open_wav(file); if ~isempty(msg) error('wavread:InvalidFile', msg); end % Now the file is open - wrap remaining code in try/catch so we can % close the file if an error occurs try % Find the first RIFF chunk: [riffck,msg] = find_cktype(fid,'RIFF'); if ~isempty(msg) error('wavread:InvalidFile','Not a WAVE file.'); end % Verify that RIFF file is WAVE data type: msg = check_rifftype(fid,'WAVE'); if ~isempty(msg) error('wavread:InvalidFile', msg); end % Find optional chunks, and don't stop till <data-ck> found: end_of_file = 0; opt_ck = [];

29

30 武汉理工大学《基础群课设》课程设计报告书

while ~end_of_file [ck,msg] = find_cktype(fid); if ~isempty(msg) error('wavread:InvalidFile',msg); end switch lower(ck.ID) case 'end of file' end_of_file = 1; case 'fmt' % <fmt-ck> found [opt_ck,msg] = read_wavefmt(fid,ck,opt_ck); if ~isempty(msg) error('wavread:InvalidFile',msg); end case 'data' % <data-ck> found: if ~isfield(opt_ck,'fmt'), error('wavread:InvalidFile', ... 'Corrupt WAV file - found audio data before format information.'); end if strcmpi(ext,'size') % Caller doesn't want data - just data size: [samples,msg] = read_wavedat(ck, opt_ck.fmt, -1, isNative); if ~isempty(msg) error('wavread:InvalidFile',msg); end y = [samples opt_ck.fmt.nChannels]; else % Read <wave-data>: [datack,msg] = read_wavedat(ck, opt_ck.fmt, ext, isNative); if ~isempty(msg) error('wavread:InvalidFile',msg); end y = datack.Data; end

30

31 武汉理工大学《基础群课设》课程设计报告书

case 'fact' % Optional <fact-ck> found: [opt_ck,msg] = read_factck(fid, ck, opt_ck); if ~isempty(msg) error('wavread:InvalidFile',msg); end case 'disp' % Optional <disp-ck> found: [opt_ck,msg] = read_dispck(fid, ck, opt_ck); if ~isempty(msg) error('wavread:InvalidFile',msg); end case 'list' % Optional <list-ck> found: [opt_ck, msg] = read_listck(fid, ck, opt_ck); if ~isempty(msg) error('wavread:InvalidFile',msg); end otherwise % Skip over data in unprocessed chunks: if rem(ck.Size,2), ck.Size=ck.Size+1; end if fseek(fid,ck.Size,0) == -1 error('wavread:InvalidFile', ... 'Incorrect chunk size information in WAV file.'); end end end catch exception fclose(fid); throw(exception); end fclose(fid); % Parse structure info for return to user: Fs = opt_ck.fmt.nSamplesPerSec; if opt_ck.fmt.wFormatTag == 1 || opt_ck.fmt.wFormatTag == 3, % % Type 3 floating point has no nBitsPerSample field, so use nBlockAlign to figure out number of bits

31

32 武汉理工大学《基础群课设》课程设计报告书

bits = (opt_ck.fmt.nBlockAlign / opt_ck.fmt.nChannels) * 8; else bits = []; end % end of wavread() % Unknown

% ----------------------------------------------------------------------% Local functions: % ----------------------------------------------------------------------% --------------------------------------------% OPEN_WAV: Open a WAV file for reading % --------------------------------------------function [fid,msg] = open_wav(file) % Append .wav extension if it's missing: [pat,nam,ext] = fileparts(file); if isempty(ext), file = [file '.wav']; end [fid,msg] = fopen(file,'rb','l'); if fid == -1, msg = 'Cannot open file.'; end % Little-endian

% --------------------------------------------% READ_CKINFO: Reads next RIFF chunk, but not the chunk data. % % % If optional sflg is set to nonzero, reads SUBchunk info instead. Expects an open FID pointing to first byte of chunk header. Returns a new chunk structure.

% --------------------------------------------function [ck,msg] = read_ckinfo(fid) msg ck.fid = ''; = fid;

ck.Data = []; err_msg = 'Truncated chunk header found - possibly not a WAV file.';

32

33 武汉理工大学《基础群课设》课程设计报告书

[s,cnt] = fread(fid,4,'char'); % Do not error-out if a few (<4) trailing chars are in file % Just return quickly: if (cnt~=4), if feof(fid), % End of the file (not an error) ck.ID = 'end of file'; ck.Size = 0; else msg = err_msg; end return end ck.ID = deblank(char(s')); % Read chunk size (skip if subchunk): [sz,cnt] = fread(fid,1,'uint32'); if cnt~=1, msg = err_msg; return end ck.Size = sz; % unambiguous chunk ID (>4 chars)

% --------------------------------------------% FIND_CKTYPE: Finds a chunk with appropriate type. % % % Searches from current file position specified by fid. Leaves file positions to data of desired chunk. If optional sflg is set to nonzero, finds a SUBchunk instead.

% --------------------------------------------function [ck,msg] = find_cktype(fid,ftype) if nargin<2, ftype = ''; end [ck,msg] = read_ckinfo(fid); if ~isempty(msg), return; end % Was a required chunk type specified? if ~isempty(ftype) && ~strcmpi(ck.ID,ftype) msg = ['<' ftype '-ck> did not appear as expected']; end

33

34 武汉理工大学《基础群课设》课程设计报告书

% --------------------------------------------% CHECK_RIFFTYPE: Finds the RIFF data type. % % Searches from current file position specified by fid. Leaves file positions to data of desired chunk.

% --------------------------------------------function msg = check_rifftype(fid,ftype) msg = ''; [rifftype,cnt] = fread(fid,4,'char'); rifftype = char(rifftype)'; if cnt~=4, msg = 'Not a WAVE file.'; elseif ~strcmpi(rifftype,ftype), msg = ['File does not contain required ''' ftype ''' data chunk.']; end

% --------------------------------------------% READ_LISTCK: Read the FLIST chunk: % --------------------------------------------function [opt_ck,msg] = read_listck(fid,ck, orig_opt_ck) opt_ck = orig_opt_ck; orig_pos nbytes msg = ''; err_msg = 'Error reading <list-ck> chunk.'; if total_bytes < nbytes, msg = err_msg; return end % Read standard <list-ck> data: listdata = char(fread(fid,total_bytes,'uchar')'); listtype = lower(listdata(1:4)); % Get LIST type listdata = listdata(5:end); if strcmp(listtype,'info'), % Information: % Move past INFO = ftell(fid); = 4; % # of required bytes in <list-ck> header

total_bytes = ck.Size; % # bytes in subchunk

34

35 武汉理工大学《基础群课设》课程设计报告书

while(~isempty(listdata)), id = listdata(1:4); if ~isfield(opt_ck,'info'), opt_ck.info = []; end len = listdata(5:8) * 2.^[0 8 16 24]'; txt = listdata(9:9+len-1); % Fix up text: deblank, and replace CR/LR with LF txt = deblank(txt); idx=findstr(txt,char([13 10])); txt(idx) = ''; % Store - don't include the "name" info opt_ck.info.(lower(id)) = txt;

if rem(len,2), len=len+1; end listdata = listdata(9+len:end); end else if ~isfield(opt_ck,'list'), opt_ck.list = []; end opt_ck.list.(listtype) = listdata; end % Skip over any unprocessed data: if rem(total_bytes,2), total_bytes=total_bytes+1; end rbytes = total_bytes - (ftell(fid) - orig_pos); if rbytes~=0, if (fseek(fid,rbytes,'cof')==-1), msg = err_msg; end end

% --------------------------------------------% READ_DISPCK: Read the DISP chunk: % --------------------------------------------function [opt_ck, msg] = read_dispck(fid,ck,orig_opt_ck) opt_ck = orig_opt_ck;

35

36 武汉理工大学《基础群课设》课程设计报告书

orig_pos min_bytes msg = '';

= ftell(fid); = 4; % # of required bytes in <disp-ck> header

total_bytes = ck.Size; % # bytes in subchunk

err_msg = 'Error reading <disp-ck> chunk.'; if total_bytes < min_bytes, msg = err_msg; return end % A DISP Chunk is comprized of two items % % % % % % Read standard <disp-ck> header, the 'type', an unsingned 32 bit integer disp_type_bytes = min_bytes; disp_type = fread(fid,1,'uint32'); % Read standard <disp-ck> data: % Only process data if we actually have data % (if the total chunk size is larger than the header size) if (disp_type == 1 && total_bytes > disp_type_bytes) % CF_TEXT data = fread( fid, total_bytes - disp_type_bytes, 'uchar' ); opt_ck.disp.name = 'DisplayName'; txt = deblank(char(data')); opt_ck.disp.text = txt; end % Skip over any unprocessed data: if rem(total_bytes,2), total_bytes=total_bytes+1; end rbytes = total_bytes - (ftell(fid) - orig_pos); if rbytes~=0, if(fseek(fid,rbytes,'cof')==-1), msg = err_msg; end end type - a DWORD that identifies the type of Display held in in this chunk. Values can be of any Windows clipboard type found in winuser.h, including CF_TEXT, CF_DIB, CF_METAFILE MATLAB currently supports CF_TEXT chunks and ignores all others

36

37 武汉理工大学《基础群课设》课程设计报告书

% --------------------------------------------% READ_FACTCK: Read the FACT chunk: % --------------------------------------------function [opt_ck,msg] = read_factck(fid,ck,orig_opt_ck) opt_ck orig_pos nbytes msg = ''; err_msg = 'Error reading <fact-ck> chunk.'; if total_bytes < nbytes, msg = err_msg; return end % Read standard <fact-ck> data: opt_ck.fact = char(fread(fid,total_bytes,'uchar')'); % Skip over any unprocessed data: if rem(total_bytes,2), total_bytes=total_bytes+1; end rbytes = total_bytes - (ftell(fid) - orig_pos); if rbytes~=0, if(fseek(fid,rbytes,'cof')==-1), msg = err_msg; end end = orig_opt_ck; = ftell(fid); = 4; % # of required bytes in <fact-ck> header

total_bytes = ck.Size; % # bytes in subchunk

% --------------------------------------------% READ_WAVEFMT: Read WAVE format chunk. % % % % Assumes fid points to the <wave-fmt> subchunk. Requires chunk structure to be passed, indicating the length of the chunk in case we don't recognize the format tag.

% --------------------------------------------function [opt_ck,msg] = read_wavefmt(fid,ck,orig_opt_ck) opt_ck = orig_opt_ck; orig_pos nbytes = ftell(fid); = 14; % # of required bytes in <wave-format> header

total_bytes = ck.Size; % # bytes in subchunk

37

38 武汉理工大学《基础群课设》课程设计报告书

msg = ''; err_msg = 'Error reading <wave-fmt> chunk.'; if total_bytes < nbytes, msg = err_msg; return end % Read standard <wave-format> data: opt_ck.fmt.wFormatTag format opt_ck.fmt.nChannels opt_ck.fmt.nSamplesPerSec second opt_ck.fmt.nAvgBytesPerSec = fread(fid,1,'uint32'); opt_ck.fmt.nBlockAlign % Avg transfer rate = fread(fid,1,'uint16'); % Block alignment = fread(fid,1,'uint16'); % Number of channels = fread(fid,1,'uint32'); % Samples per = fread(fid,1,'uint16'); % Data encoding

% Read format-specific info: switch opt_ck.fmt.wFormatTag case 1 % PCM Format: [opt_ck.fmt, msg] = read_fmt_pcm(fid, ck, opt_ck.fmt); end % Skip over any unprocessed fmt-specific data: if rem(total_bytes,2), total_bytes=total_bytes+1; end rbytes = total_bytes - (ftell(fid) - orig_pos); if rbytes~=0, if(fseek(fid,rbytes,'cof')==-1), msg = err_msg; end end

% --------------------------------------------% READ_FMT_PCM: Read <PCM-format-specific> info % --------------------------------------------function [fmt,msg] = read_fmt_pcm(fid, ck, fmt) % There had better be a bits/sample field: total_bytes = ck.Size; % # bytes in subchunk nbytes msg = ''; err_msg = 'Error reading PCM <wave-fmt> chunk.'; = 14; % # of bytes already read in <wave-format> header

38

39 武汉理工大学《基础群课设》课程设计报告书

if (total_bytes < nbytes+2), msg = err_msg; return end [bits,cnt] = fread(fid,1,'uint16'); nbytes=nbytes+2; if (cnt~=1), msg = err_msg; return end fmt.nBitsPerSample=bits; % Are there any additional fields present? if (total_bytes > nbytes), % See if the "cbSize" field is present. if (total_bytes >= nbytes+2), % we have the cbSize uint16 in the file: [cbSize,cnt]=fread(fid,1,'uint16'); nbytes=nbytes+2; if (cnt~=1), msg = err_msg; return end fmt.cbSize = cbSize; end % Simply skip any remaining stuff - we don't know what it is: if rem(total_bytes,2), total_bytes=total_bytes+1; end rbytes = total_bytes - nbytes; if rbytes~=0, if (fseek(fid,rbytes,'cof') == -1); msg = err_msg; end end end If so, grab the data:

% --------------------------------------------% READ_WAVEDAT: Read WAVE data chunk % % % Assumes fid points to the wave-data chunk Requires <data-ck> and <wave-format> structures to be passed. Requires extraction range to be specified.

39

40 武汉理工大学《基础群课设》课程设计报告书

% % % % %

Setting ext=[] forces ALL samples to be read.

Otherwise,

ext should be a 2-element vector specifying the first and last samples (per channel) to be extracted. Setting ext=-1 returns the number of samples per channel, skipping over the sample data.

% --------------------------------------------function [dat,msg] = read_wavedat(datack,wavefmt,ext,isNative) % In case of unsupported data compression format: dat = []; fmt_msg = ''; switch wavefmt.wFormatTag case 1 % PCM Format: [dat,msg] = read_dat_pcm(datack,wavefmt,ext,isNative); case 2 fmt_msg = 'Microsoft ADPCM'; case 3 % normalized floating-point [dat,msg] = read_dat_pcm(datack,wavefmt,ext,isNative); case 6 fmt_msg = 'CCITT a-law'; case 7 fmt_msg = 'CCITT mu-law'; case 17 fmt_msg = 'IMA ADPCM'; case 34 fmt_msg = 'DSP Group TrueSpeech TM'; case 49 fmt_msg = 'GSM 6.10'; case 50 fmt_msg = 'MSN Audio'; case 257 fmt_msg = 'IBM Mu-law'; case 258 fmt_msg = 'IBM A-law'; case 259 fmt_msg = 'IBM AVC Adaptive Differential'; otherwise fmt_msg = ['Format #' num2str(wavefmt.wFormatTag)]; end if ~isempty(fmt_msg), msg = ['Data compression format (' fmt_msg ') is not supported.'];

40

41 武汉理工大学《基础群课设》课程设计报告书

end

% --------------------------------------------% READ_DAT_PCM: Read PCM format data from <wave-data> chunk. % % % % % % % % Assumes fid points to the wave-data chunk Requires <data-ck> and <wave-format> structures to be passed. Requires extraction range to be specified. Setting ext=[] forces ALL samples to be read. Otherwise, ext should be a 2-element vector specifying the first and last samples (per channel) to be extracted. Setting ext=-1 returns the number of samples per channel, skipping over the sample data.

% --------------------------------------------function [dat,msg] = read_dat_pcm(datack,wavefmt,ext,isNative) dat = []; msg = ''; % Determine # bytes/sample - format requires rounding % to next integer number of bytes: BytesPerSample = ceil(wavefmt.nBlockAlign / wavefmt.nChannels); if (BytesPerSample == 1), dtype='uchar'; % unsigned 8-bit elseif (BytesPerSample == 2), dtype='int16'; % signed 16-bit elseif (BytesPerSample == 3) dtype='bit24'; % signed 24-bit elseif (BytesPerSample == 4), if (wavefmt.wFormatTag == 1) % 32-bit 16.8 float (type 1 - 32-bit) dtype = 'int32'; %signed 32-bit elseif (wavefmt.wFormatTag == 3) % 32-bit normalized floating point dtype = 'float'; % floating point end if wavefmt.wFormatTag ~= 3 && wavefmt.nBitsPerSample == 24, BytesPerSample = 3; end else msg = 'Cannot read PCM file formats with more than 32 bits per sample.'; return end if isNative dtype=['*' dtype];

41

42 武汉理工大学《基础群课设》课程设计报告书

end total_bytes total_samples = datack.Size; % # bytes in this chunk = floor(total_bytes / BytesPerSample);

SamplesPerChannel = floor(total_samples / wavefmt.nChannels); if ~isempty(ext) && isscalar(ext) && ext==-1 % Just return the samples per channel, and fseek past data: dat = SamplesPerChannel; % Add in a pad-byte, if required: total_bytes = total_bytes + rem(datack.Size,2); if(fseek(datack.fid,total_bytes,'cof')==-1) % Not all files contain the necessary pad-byte. % again without the pad-byte. if(fseek(datack.fid, total_bytes-1,'cof') == -1) msg = 'Error reading PCM file format.'; end end return end % Determine sample range to read: if isempty(ext), ext = [1 SamplesPerChannel]; else if numel(ext)~=2, msg = 'Sample limit vector must have 2 elements.'; return end if ext(1)<1 || ext(2)>SamplesPerChannel, msg = 'Sample limits out of range.'; return end if ext(1)>ext(2) msg = 'Sample limits must be given in ascending order.'; return end end bytes_remaining = total_bytes; % Preset byte counter % Return all samples Try seeking

42

43 武汉理工大学《基础群课设》课程设计报告书

% Skip over leading samples: if ext(1)>1 % Skip over leading samples, if specified: skipcnt = BytesPerSample * (ext(1)-1) * wavefmt.nChannels; if(fseek(datack.fid, skipcnt,'cof') == -1), msg = 'Error reading PCM file format.'; return end % % Update count of bytes remaining: bytes_remaining = bytes_remaining - skipcnt; end % Read desired data: nSPCext dat dat.Data % % Update count of bytes remaining: skipcnt = BytesPerSample*nSPCext*wavefmt.nChannels; bytes_remaining = bytes_remaining - skipcnt; % if cnt~=extSamples, dat='Error reading file.'; return; end % Skip over trailing samples: if(fseek(datack.fid, BytesPerSample * ... (SamplesPerChannel-ext(2))*wavefmt.nChannels, 'cof')==-1), msg = 'Error reading PCM file format.'; return end % Update count of bytes remaining: skipcnt = BytesPerSample*(SamplesPerChannel-ext(2))*wavefmt.nChannels; bytes_remaining = bytes_remaining - skipcnt; % Determine if a pad-byte is appended to data chunk, % skipping over it if present: fseek(datack.fid, 1, 'cof'); end % Rearrange data into a matrix with one channel per column: dat.Data = dat.Data'; if ~isNative % Normalize data range: min will hit -1, max will not quite hit +1. if rem(datack.Size,2), = ext(2)-ext(1)+1; % # samples per channel in extraction range = datack; % Copy input structure to output

% extSamples = wavefmt.nChannels*nSPCext; = fread(datack.fid, [wavefmt.nChannels nSPCext], dtype);

43

44 武汉理工大学《基础群课设》课程设计报告书

if BytesPerSample==1, dat.Data = (dat.Data-128)/128; elseif BytesPerSample==2, dat.Data = dat.Data/32768; elseif BytesPerSample==3, dat.Data = dat.Data/(2^23); elseif BytesPerSample==4, if wavefmt.wFormatTag ~= 3, end end end % Type 3 32-bit is already normalized dat.Data = dat.Data/32768; % [-1,1) % [-1,1) % [-1,1) % [-1,1)

% --------------------------------------------function [file,ext,isNative] = parseArgs(varargin) %ParseArgs Parse input arguments to wavread % Supported syntax: % WAVREAD(FILE) % % % % % % % % An apparently undocument behavior was: % % % Another apparently undocumented behavior was: % % % In the future, we will process this as "no data to read" and % return with an empty data set and no error. % Defaults: ext=[]; % extent: start and stop index of samples to read isNative=false; isSize=false; EXT=0 or EXT=[0 0] also map to 'size' % We maintain this behavior as well, but issue a warning. EXT=[] maps to 'size' call % This behavior is maintained. Caller must provide FILE EXT may be N or [N1 N2] If omitted, returns ext=[] (e.g., read all samples) FMT = 'native' or 'double' Default if omitted: 'double' No FMT arg can be passed with 'size' % WAVREAD(FILE,EXT)

% WAVREAD(FILE,EXT,FMT)

% WAVREAD(FILE,'size')

44

45 武汉理工大学《基础群课设》课程设计报告书

if nargin==0 error('wavread:TooFewArguments', ... 'Too few input arguments.'); end % Get file name: WAVREAD(FILE, ...) file = varargin{1}; varargin(1)=[]; if isempty(varargin), return; end % See if a FMT option or 'size' was passed fmt=varargin{end}; if ischar(fmt) idx = find(strncmpi(fmt,{'double','native','size'},numel(fmt))); if isempty(idx) error('wavread:UnrecognizedDataFormatSpecified', ... 'Unrecognized data format specified: "%s"', fmt); elseif idx==2 isNative=true; elseif idx==3 ext='size'; isSize=true; else % idx==1 isNative=false; end % Remove parsed option varargin(end)=[]; if isempty(varargin), return; end end % Another arg is present nargs = numel(varargin); if isSize && (nargs>0) error('wavread:SizeAndSampleRange', ... 'Too many arguments with ''size'' option.'); end % Can only be one more argument passed: extent if nargs>1 error('wavread:TooManyInputArgs', ... 'Too many input arguments, or invalid argument order.'); end ext = varargin{1}; exts = numel(ext); % length of extent info

45

46 武汉理工大学《基础群课设》课程设计报告书

if ~isnumeric(ext) || ~isreal(ext) || ~isreal(ext) ... || issparse(ext) || (exts>2) error('wavread:InvalidSampleRange', ... 'Index range must be specified as a scalar or 2-element vector.'); end if isempty(ext) warning('wavread:ReturnZeroSamples', ... sprintf(['Passing [] for sample range currently returns total file size,\n', ... 'equivalent to the ''size'' option. behavior\n', ... 'will be removed. obtain\n', ... 'the file size.'])); % For now, map this to a 'size' call % In the future, remove this "elseif" entirely and flow % into the "isscalar" test below ext='size'; elseif isequal(ext,0) warning('wavread:ReturnZeroSamples', ... sprintf(['Requesting 0 samples currently returns total file size,\n', ... 'equivalent to the ''size'' option. this\n', ... 'behavior will change to return zero data samples from the\n', ... 'file (i.e., return with an empty matrix). ''size''\n', ... 'option if you wish to obtain the file size.'])); % For now, map this to a 'size' call % In the future, remove this "elseif" entirely and flow % into the "isscalar" test below ext='size'; elseif isscalar(ext) if (ext ~= floor(ext)) || (ext<0) error('wavread:IntegerSampleCount', ... 'Sample count must be a positive integer value'); end ext = [1 ext]; else if any(ext ~= floor(ext)) error('wavread:IntegerSampleCount', ... % make into a 2-element sample range Use the In the future, Use the ''size'' option if you wish to In the future, this

46

47 武汉理工大学《基础群课设》课程设计报告书

'Sample indices must be integer values'); end end % [EOF]

47

48 武汉理工大学《基础群课设》课程设计报告书

参考文献
[1] 王家耀. 空间信息系统原理[M]. 北京: 科学出版社, 2001. [2]李德仁, 王树良, 李德毅等. 论空间数据挖掘和知识发现的理论与方法[J]. 武汉大学学报(信息科学版), 2002,27(3): 221-233. [3] 杨行峻,郑君里.人工神经网络与盲信号处理[M].北京:清华大学出 版社,2003:327-330. [4] 石庆研,黄建宇,吴仁彪.盲源分离及盲信号提取的研究进展[J].中国民航 大学学报,2007,25(03):1-7. [5] 赵艳.盲源分离与盲信号提取问题研究[D]. 西安:西安理工大学;2004. [6]方元.Hands.free 系统噪声抵消的研究.南京大学博士学位论文.2003.4 [7]张徽强.带噪语音信号的端点检测和声韵分离.国防科学技术大学硕士学位 论文,2005.4 [8] 杨福生, 洪波. 独立分量分析的原理与应用嗍. 北京: 清华大学出版社, 2003. [9]王舒狲, 方勇, 梁越. 基于盲源分离的语音识别前端语音净化处理研究[J]. 电 子技术应用,2005,(10),5—8. [10] 焦卫东 ,杨世锡 ,吴昭同.基于独立分量分析的噪声消除技术研究[J].浙 江大学学报 工学版 ,2004 ,38 7 :8722876.

48


相关文章:
语音信号盲分离
《基础群课设》课程设计任务书学生姓名: 指导教师: 题目: 王成刚 黄峥 专业班级: 工作单位: 通信 0906 班 信息工程学院 语音信号盲分离 主要目的就是对学生...
语音信号盲分离
32 I 武汉理工大学信息处理课群综合训练与设计 摘要 语音信号盲分离处理的含义是指利用盲源分离(Blind Source Separation, BSS)技术对麦克风检测到的一段语音信号...
matlab语音信号盲分离
利用盲信号分离算法中的 独立成分分析 ICA 进行语音盲信号的分离,将源信号分别从混合信号中分离出来。 按照盲分离模型FICA具体步骤如下: (1)将三段声音文件保存为...
一种有效的语音信号盲分离方法
龙源期刊网 http://www.qikan.com.cn 一种有效的语音信号盲分离方法 作者:徐丽琴,何晓川 来源:《现代电子技术》2010 年第 19 期 摘要:频域盲语音信号分离存在...
语音信号盲分离课程设计
29 摘要 语音信号分离近年来成为信号处理领域的一个研究热点,它在电话会议、 助听器及便携设备、机器的语音识别方面有很多的应用与影响。而盲信号处理的 方法常被...
语音信号盲分离1
题 目: 信息处理课群综合训练与设计——语音信号盲分离 初始条件:根据盲信号分离原理,用 matlab 采集两路以上的语音信号,选择合适的混合矩阵生成 若干混合信号。...
语音信号的盲分离
学号: 0121209320323 课程设计 题学专班姓 目院业级名 语音信号盲分离 信息工程学院 通信工程 指导教师 2015 年 7 月 1 日 《课程设计任务书》学生姓名: ...
语音信号盲分离
《信息处理课群综合训练》课程设计说明书 课程设计任务书学生姓名: 指导教师: 题 邓可 许建霞 专业班级: 工作单位: 通信 1103 信息学院 目: 语音信号盲分离 ...
语音信号盲分离
题 目: 信息处理课群综合训练与设计——语音信号盲分离 初始条件:根据盲信号分离原理,用 matlab 采集两路以上的语音信号,选择合适的混合矩阵生成 若干混合信号。...
语音信号的盲分离
盲分离 初始条件:Matlab 软件、PC 机 要求完成的主要任务: 设计任务 根据盲信号分离原理,用 matlab 采集两路以上的语音信号,选择合适的混合矩阵生成若干混合 信号。...
更多相关标签:
语音信号盲源分离 | 语音信号盲分离的定义 | 语音信号盲分离与增强 | 如何从道客巴巴复制 | matlab语音信号盲分离 | 盲信号分离 | 盲源信号分离 | 盲信号分离 matlab |