基于MATLAB的语言背景噪声消除

基于MATLAB的语言背景噪声消除
基于MATLAB的语言背景噪声消除

本科生毕业论文(设计)

题目: 基于MATLAB 的语音背景噪声消除

学 院 物理科学与技术学院 学科门类 理科

专 业 应用物理

学 号 XXXXXX

姓 名 XXX

指导教师 XXX

2012年 4月 18 日

线

基于MATLAB的语音背景噪声消除

摘要

语言是人类最重要、直接、有效和便捷的交换信息的方式。随着近些年科学技术的飞速发展,人们也不满足于和计算机的信息交换方式,希望能够甩掉键盘和鼠标而实现用语言来对计算机进行控制。因此,语音信号处理技术便应运而生。语音信号处理是一门新兴的学科,同时也是综合多种学科和涉及面非常广泛的交叉学科。现在在一些职能系统中嵌入有语音处理系统,但它们只能在安静的环境中才能使用。然而,在语音信息的采集过程中难免会有各种噪声的干扰。噪声不仅降低了语音的可懂度和语音质量,还严重的影响语音处理的准确性,甚至使系统不能正常工作。本文将就对语音增强技术的原理和方法进行讨论,重点介绍语音增强的一种方法——谱减法及其改进算法。该方法能够有效消除平稳的加性噪声,其改进算法能够有效消除普通方法产生的“音乐噪声”,在很大程度上提高语音信号的信噪比。

关键词:语音信号处理语音增强谱减法改进算法

Abstract

Language is the most important, direct, effective and convenient means of information exchange. With the rapid development of science and technology in recent years, people are not satisfied with the way to exchange information with computer, hoping to get rid of the keyboard and the mouse and achieving the goal of using language to control the computer. Therefore, the language signal processing technology was produced. Language signal processing is an emerging discipline, but also is a cross discipline which multiplied disciplines and covered a very wide range. Now some language signal processing systems are embedded in the intelligent system, but they can only work in a quiet environment. However, in the speech information acquisition process will inevitably have a variety of noise interference. Noise can not only reduce speech intelligibility and voice quality, it also affect speech processing accuracy, and even make the system not working properly. In this paper we will discuses the principle and method of the speech enhancement technology. Mainly introduces a method for speech enhancement -- spectral subtraction algorithm and its improved algorithm. The method can effectively eliminate the stationary additive noise, the improved algorithm can effectively eliminate which the common method produced “music noise”, obviously improves the speech signal to noise ratio.

Keywords: Speech signal processing Speech enhancement spectral subtraction algorithm improved algorithm

目录

一绪论 (1)

1.1 语音背景噪声消除的意义 (1)

1.2 语音背景噪声消除的目的及要求 (1)

1.3 比较常用的语音背景噪声消除的方法及特点 (2)

二谱减法消除噪声的基本原理 (4)

2.1 噪声的生成原理及分类 (4)

2.2 基本谱减法消除噪声的原理 (5)

2.3 改进谱减法消除噪声的原理 (6)

2.4 比较两种方法处理的理论效果 (7)

2.5 小结 (7)

三实验设计及步骤 (8)

3.1 语音信号的采集 (8)

3.2 语音信号处理工具的选择 (8)

3.3 程序读入语音信号 (8)

3.4 语音信号处理 (9)

3.4.1 含噪语音信号的合成 (9)

3.4.2 用基本谱减法对含噪信号处理 (11)

3.4.3 用改进谱减法对含噪信号处理 (13)

3.5 比较两种方法处理的实验效果 (17)

四总结 (18)

致谢 (19)

参考文献 (20)

一绪论

1.1 语音背景噪声消除的意义

目前,语言识别技术已经取得了重大进展,并开始进入实用阶段。但语音识别系统必须在相对比较安静的环境下运行,然而,在语言信息的采集中难免会有各种噪声的干扰,在较强的噪声背景下,语音识别系统的准确性会受到较大影响,甚至没法正常工作。所以在语音识别系统对语音信息处理前,应该对语音信息进行预处理,即背景噪声消除。语音背景噪声消除技术的出现使得语音识别技术更加稳定和精确,也使得语音信息的可懂度大大提高,使人们能够从较复杂的语音信息中提取到更多的有用信息。

1.2 语音背景噪声消除的目的及要求

二十世纪中期以来,对语音可懂度的研究在电话系统飞速发展的时期就已经开始了[1]。Bell实验室在对电话系统中的音节清晰度进行了系统性的研究,研究表明,当信噪比(SNR)大于20-40dB时,噪音才不会对人的听觉造成有害的影响[2]。因此,语音背景噪声消除的目的就是从带有噪声的语音信息中提取出尽可能纯净的原始语音,提高语音的质量并提高听觉的舒适度。

另外随着语音识别技术的诞生和应用,计算机向智能化迈进了一大步。为了提高语音识别系统的准确性,语音信息的除噪处理就显得更加重要。多年来经过人们不懈努力,发明了一系列语音背景噪声消除的方法,它们都是围绕着增强语音信息的清晰度和可懂度两方面进行处理的。

1.3 比较常用的语音背景噪声消除的方法及特点

经过几十年的研究和发展,许多语音增强方法被提出来,它们奠定了语音增强理论的基础并使之发展成熟。近些年,VLSI技术的发展和高速DPS芯片的出现使语音背景噪声消除的实时实现成为可能[3]。

目前常用的语音增强算法一般可分为非基于语音生成模型参数和基于语音生成模型参数两大类。基于语音生成模型参数的方法特点就是对生成的语音模型的参数进行估计和修复。这类方法有一定的局限性,在信噪比比较低的情况下,我们很难对生成的模型参数进行估计,此类算法也往往因为需要迭代而增加算法的复杂度。非基于语音生成模型参数的方法中主要有自适应性噪声对消法和基于短时谱估计增强法等。

目前,比较流行的语音增强算法主要有以下几种:

1.噪声对消法[4]

噪声对消法是最基本的谱减算法,它的原理就是从带噪信息中直接减去噪声得到增强的语音信息。采用双声道(多声道)可以方便的得到噪声的准确复制,原理图如图1.1

图1.1 双声道采集系统噪声对消法原理 采用双声道噪声对消法时,要保证两个声道相隔一定距离,防止两个声道同时收集到噪声信息。由于语音采集时两个声道距声源距离不同,两路信号会产生时间差,因此要对噪声声道信息进行滤波来模拟噪声。通常我们采用自适应滤波器来对其进行滤波。自适应滤波器的作用相当于回波抵消器。

实验结果表明,在较强噪声背景下,噪声对消法能明显起到消除噪声的目的。但噪声对消法也有一定的缺陷,用该方法增强后的语音会残留一种叫“音乐噪声”的新噪声。所谓“音乐噪声”是频谱相减的残留产物,具有节奏性起伏,听起来像音乐。

2. 基于小波分析的增强算法[5]

小波分析是一种新兴的数学分析理论,在图像处理,语音处理以及其他非线性科学领域,它被认为是继Fourire 分析之后又一重要有效的时频分析方法。

小波分析法是基于小波分析理论而发展而来的一中新的语音增强算法,它对非平稳非加性噪声能有效的进行噪声消除,同时小波分析法也结合了谱减法的一些基本原理,是一种有非常广泛发展前途的一种语音增强方法。

3. 基于语音谱特征的谐波增强算法[6]

语音中分有清音和浊音的概念,其中浊音有明显的周期性,因此可以采用自适应梳状滤波器来提取语音分量,来抑制噪声。

梳状滤波器在时域上实现的关键是要准确估计出基音的周期,使之于噪声周期性分量分离开来。基音周期的估计可以用语音信号处理中的各种估计算法实现。梳状滤波器在频域上的实现是先将语音信息进行傅里叶变换,提取出各次谐波的分量,然后进行逆傅里叶变换恢复成时域信号。

用这种方法进行语音增强可以抑制各种噪声的干扰,但在强噪音背景下,很难准确地估计基音,在基音发生变化的过渡语音段里增强效果也会受到影响。

4. 基于语音生成模型的增强算法

将语音的发生过程建模为一个线性时变滤波器,对不同类型的语音采用不同的激励源。基于语音生成模型可以得到一系列语音增强算法,如卡尔曼滤波方法及时变参数维纳滤波。卡尔曼滤波能对有色噪声进行有效消除;维纳滤波则对背景噪声白化效果很好。

噪声 自适应数字滤波器

含噪语音 FFT IFFT

增强语音

FFT

该方法的运算量比较大,系统性能也有待于进一步提高。

5.基于听觉屏蔽的增强算法

听觉屏蔽法是利用人的听觉特性的一种增强算法,如人耳能从许多说话者当中分辨出需要聆听的信号,这种效应叫做“鸡尾酒会效应”,相信随着生物科学的发展,人们对人耳特性的了解加深,用软件对其进行仿真,听觉屏蔽法将会有更深入的发展。

6.基于短时谱估计的增强算法

现实中常用的许多方法如谱减法维纳滤波法、最小均方误差法等都属于基于短时谱估计的增强方法。这类方法具有适应信噪比范围大、方法简单、易于实现等优点,所以成为目前应用最为广泛的语音增强方法。

综上所述,以上六种算法中,以短时谱估计法中的谱减法以及其改进方法拥有运算量小,容易实现且增强效果较好的特点而最为常用。小波分析法成为语音增强中一个新的研究热点。听觉屏蔽法师随着人们对人耳听觉系统的认识而发展起来的,目前还处于初级阶段。另外,一些新兴的理论也应用于语音增强中,如人工智能、隐马尔科夫模型、神经网络和粒子滤波器等,但都处于初级阶段,没有取得实质性的进展[7]。

二谱减法去除噪声的基本原理

2.1 噪声的生成原理及分类

噪声的来源取决于实际应用,不同情形下产生的噪声其特性也是千变万化,所以没有一种通用的语音增强算法能对每一种噪声起到有效的消除。下面我们来简单分析噪声的生成原理及分类情况。

噪声可以分为两大类:加性噪声和非加性噪声,加性噪声一般是指热噪声、散弹噪声等,其特点是噪声信号与语音信号是加性的,噪声不随信号而改变,即使信号不存在噪声也会存在。非加性噪声如乘性噪声,他们与信号成乘性关系,信号存在噪声就存在,信号改变噪声也随之改变。一般通信中我们把加性随机性看成背景噪声,而乘性随机性则是由系统时变性和非线性造成的。

这里我们仅介绍加性噪声,加性噪声一般分为一下几类:人为噪声,自然噪声和内部噪声。人为噪声是指信号之外人为的噪声,如外台信号、开关接触噪声、工业的点火辐射等;自然噪声则是由于自然界的各种电磁波源如闪电、大气中电暴和宇宙辐射等造成的噪声;内部噪声是信号采集时系统设备自身产生的各种噪声,如热噪声和散弹噪声等[8]。

以上噪声中确定类型的噪声因为知道其产生机制,所以理论上是能够消除或者基本消除。但是有一类随机噪声因为不能预测其波形而比较难以消除,这种不能预测的噪声系统成为随机噪声。随机噪声可分为三类:(1)周期性噪声是由于发动机等机械、电气干扰特别是交流电等造成的周期性的干扰噪声。(2)脉冲噪声是突发的幅度高且持续时间短的离散脉冲。它的来源是由于爆炸、点击和撞击等,其特点就是脉冲幅度大,持续时间短,两个脉冲之间时间长等。这类噪声通常在时域情况下消除,根据信号的幅度平均值来确定信号幅度的闭值。当信号超过这一闭值时,系统则认为是脉冲噪声,再对脉冲噪声进行衰减。(3)宽带噪声的来源很多,热噪声、气流(如风、呼吸)噪声及各种随机噪声源,量化噪声也可视为宽带噪声。由于宽带噪声与语音信号在时域和频域上完全重叠,因而消除它最为困难。这种噪声只有在语音间歇期才单独存在。对于平稳的宽带噪声通常可以认为是白色高斯噪声。不具有白色频谱的噪声,可以先进行白化处理。对于非平稳的宽带噪声,情况就更为复杂一些。

噪声破坏了语音信号原有的声学特征和模型参数,使语音质量下降,也使人产生听觉疲劳。不仅如此,强噪声环境还会对说话的人产生影响,使人改变在安静环境或者低噪声环境中的发音,从而改变了说话人的语音特征参数,这种效应被称为Lombard效应[9],它对语音识别系统有很大影响。

2.2 基本谱减法消除噪声的原理

在诸多语音增强方法中,谱减法因其计算量小,容易实现和增强效果好等特点而备受关注,是诸多方法中比较有效的语音增强算法。谱相减方法是居于人的感觉特性,即语音信号的短时幅度比短时相位更容易对人的听觉系统产生影响,从而估计语音的短时幅度谱,比较适用于消除带加性噪声的语音[10]。

谱减法在20世纪八十年代后用来与其它方法相结合来获得更为有效的语音增强算法。并且成为其它语音增强算法的比较标准。下面我们来详细了解谱减法的原理。

在基本谱减法中,假定语音为平稳信号,且噪声为加性噪声,与语音信号彼此不相关。此时带噪语音信号可表示为:

()()()y t s t n t =+ (1) 式(1)中,y(t)为含噪语音信号,s(t)为纯净语音信号,n(t)为噪声信号。用Y(w),S(w)和N(w)来分别表示y(t),s(t)和n(t)的傅里叶变换,则有下列关系:

()()()Y w S w N w =+ (2) 由公式(2)可得:

()()()()()222*2Re Y w S w N w S w N w ??=++?? (3)

根据(3)可得: ()()()()(){}222*2Re E Y w E S w E N w E S w N w ??=++?? (4)

由于基本假定是噪声信号与语音信号是加性的,s(t) 和n(t)独立,所以

S(w)和N(w)也独立。故()(){}

*Re E S w N w ????=0。所以对一个分析帧内得短时平稳过程,有:

()()()222

Y w S w N w =+ (5) 因为噪声是局部平稳的,故可以认为没有语音信息是的噪声与有语音信息时的噪声功率谱是相同的,因而可以利用发语音前的“寂静帧”来估计噪声。

由式(5)可以得到原始语音的估计值:

()()()22

2w w w Y w N w s ∧=- (6)

式(6)中,下标表示加窗信号,∧表示估值,()2w N w 则表示无语音信号时

()2

N w 的均值。如果式(6)中结果出现负值,则将其改为0或改变符号,因为功率谱不能为负数。

由式(6)可得原始语音估值:

()()()1222

S w Y w N w ??=-??

(7) 根据人耳对语音的相位变化不敏感这一特点,我们可以用原带噪语音信号y(t)的相位来代替估计之后的语音信号的相位,将估计后的频域信号进行逆傅里

叶变换得到降噪后的语音时域信号。基本谱减法的原理图如图2.1所示:带噪语音FFT 2相位增强插入相位IFFT 噪声方差

图2.1 基本谱减法的原理示意图

2.2 改进谱减法消除噪声的原理

上一节中介绍的基本谱减法消除噪声的原理,是假设以无声期间统计的噪声方差来代替分析帧的噪声频谱的基础上的,而实际上噪声频谱是服从高斯分布的:

()()22212x m n P x e σπσ--= (8) 式(8)中,m 为x 的均值,σ为标准偏差。因此,在用基本谱减法消除噪声后,会有较大的剩余的功率谱分量,在频谱中呈现随机的尖峰,经逆傅立叶变换后的增强语音形成具有一定节奏性起伏的新噪声,这种噪声就是所谓的“音乐噪声”,而且这种噪声没办法再次经谱减法进行消除。

为了尽可能减小“音乐噪声”对语音信息造成的二次污染,可以对普通的谱减法进行改进。含噪语音信息中语音能量一般集中于某些频率或频段,而噪声能量往往分布于整个频率范围。因此在幅度较高的时帧去除噪声是,减去

()

2w N w β(β>1),可以相对突出语音的功率谱。这种改进方法为被减项权值

处理。[11] 除此之外,还有改进方法为功率谱修正处理。其方法是将功率谱计算中的2*和1

2*改成*α和1

(α>2),效果和被减项权值处理相当。

结合以上两种改进处理,谱减法增强形式可表示为:

()()()=-w w w w Y w N w s αααβ∧ (9) 当α=2,β=1时,公式(9)便成为基本的谱减法。我们知道α为谱减功率修正系数,加大α的值将会进一步提高信噪比;β为谱减噪声系数,它的作用是对被减的噪声功率谱进行修正,增大β的系数会起到减少噪声、更好突出语音频谱的作用。但是两者系数的增大也会加大语音信号的失真。实验表明,适当调节α、β对含噪语音处理能得到更好的增强效果[12]。

由于基本的谱减法处理过的语音信号会产生“音乐噪声”,尽量减少“音乐噪声”的产生是改进型谱减法重点的解决对象。基本的谱减法在低信噪比情况下的增强效果是很明显的,且时域图形中噪声均匀分布于零坐标之上,包括“音乐噪声”和少量清音信号。对此我们要对语音信号在时域内做进一步处理,以提高信噪比,消除“音乐噪声”。

在改进谱减法中,我们可以取出语音信号样值,减去被减值,如果出现负值,的将信号样值赋为0;如果所得值为正数,则信号样值=信号样值-被减幅值,这种在中心线上限值幅度叫中心限幅。实验证明这种方法可以抑制“音乐噪声”,同时,被减幅值不能过大,否则噪声被滤除的同时,大量清音也被滤除,这会影响语音的可懂度。

2.4 比较两种方法去除噪声的理论效果

从以上两节中我们可以了解到,基本谱减法能在低信噪比情况下有较好的增强效果,但是也会产生令人烦躁的“音乐噪声”,改进的谱减法在基本谱减法的基础上调节谱减功率系数α和谱减噪声系数β,使得在消除噪声的同时,有效的抑制了“音乐噪声”的产生。改进的谱减法更好地消除了噪声,提高了语音质量。

2.5 小结

本章重点介绍了常用的基本谱减法消除噪声和它的改进算法。虽然谱减法理论提出的比较早,但由于其计算简单、容易实现和增强效果较好等优点,直到现在也是一个非常有生命力的研究领域,一直以来是人们关注的热点。相信在人们的不断努力下,谱减法会出现更多的新的改进形式,语音增强的效果也会更加明显,为实现真正的人机对话创造条件。

三实验设计及步骤

3.1 语音信号的采集

在进行语音增强实验之前,我们要采集一段语音信号。windows系统有自带的录音机功能,录音机程序就在windows开始菜单中的附件里。只要将麦克风与电脑连接,使用录音机功能就能录制一段语音信息。由于录音机本身也有简单的消除噪声的处理,我们采集到的语音信息在进行语音增强实验之前要人为地进行加噪处理。加噪处理将在本章第四节介绍。

3.2 语音信号处理工具的选择

本实验是基于MATLAB平台上进行的。MA TLAB是矩阵实验室(Matrix Laboratory)的简称,是由美国MathWorks公司研发的一款商用数学软件。因其在数据分析和数值计算等方面的强大功能被广泛的应用于各个领域[13]。在语音信号处理方面,在编程效率、程序可读性和可扩充性方面MATLAB远远优于其他高级编程语言。虽然较其他的高级语言相比,MATLAB程序的执行速度较慢一些,在电脑处理速度越来越快的情况下,对实时性要求不高的语音信号处理使用MATLAB平台是再适合不过的了。

3.3 程序读入语音信号

在MATLAB环境中可以直接读取wav格式的语音文件。其表达公式为

[y,fs,bits]=wavread('Blip',[N1 N2]);用于读取语音,采样值放在向量y中,fs表示采样频率(Hz),bits表示采样位数。[N1 N2]表示读取从N1点到N2点的值(若只有一个N的点则表示读取前N点的采样值)。在MATLAB中 sound(y);用于对声音的回放,而wavwrite(x,fs,'12.wav');则能将向量x转换成语音文件

12.wav保存起来。

将之前用录音机采集到的一段语音以“11.wav”的文件名保存在MATLAB程序文件夹下的Work文件夹下。运行MATLAB,输入以下程序:

[x,fs,bits]=wavread('11.wav');

x1=x(1:end,1);%因录音时是立体声,故取其中的第一通道的音频数据

sound(x1,fs,bits);

X1=fft(x1,4096);%对x1进行4096点傅里叶变换

magX1=abs(X1);

angX1=angle(X1);

subplot(221);plot(x1);title('原始信号波形');

subplot(222);plot(X1); title('原始信号频谱');

subplot(223);plot(magX1);title('原始信号幅值');

subplot(224);plot(angX1);title('原始信号相位');

点击回车运行程序,MATLAB程序读入11.wav文件,并将其进行傅里叶变换后分别显示出这段语音信号的时域波形、频谱、幅值和相位,能够直观的体现语音信号的各种特征。并播放该语音信息。运行结果如图3.1所示:

图3.1 原始语音波形、频谱、幅值及相位示意图

3.4 语音信号处理

3.4.1 含噪语音信号的合成

上节中MATLAB读取的语音信号声音比较清晰,信噪比较高,用这样的信号实验对比效果不太明显。因为Windows自带的录音机有简单的去除噪声的功能,因此在进行消除噪声实验之前我们要人为的给原始信号添加随机白高斯噪声,降低语音信号的信噪比。具体步骤如下:运行MATLAB程序,在MATLAB操作界面的左上角点击新建一个m文件,m文件中编写下列程序:

clc,clear

[x,fs,bits]=wavread('11.wav');

N=size(x,1);

x1=x(1:N,1);%因录音时是立体声,故取其中的第一通道的音频数据

fn=1000; %设定噪声的频率为1000Hz

t=1:length(x1); %设置噪声的长度跟原语音信一样长,

x2=0.5*sin(2*pi*fn/fs*t);%产生幅度为0.5频率为fn的正弦波作为噪声.

y=x1+x2'; %将原语音信号跟噪声相加,x为带有噪声的语音信号.

wavwrite(y,fs,'12.wav');%将带有噪声的语音信号转换为声音,12.wav中将有噪声

将m文件保存为“jiazao.m”并运行该文件,可以得到一个新的语音文件12.wav。打开12.wav和11.wav进行比较。

图3.2 含噪语音波形、频谱、幅值及相位示意图

3.4.2 用基本谱减法对含噪信号处理

在上一章中,讲到了基本谱减法语音增强的原理,假设我们不知道含噪信号的噪声的时域波形、频谱、幅度和相位信息,而且噪声信号是平稳而且

贯穿于整个语音信息。在含噪语音的前一小段中,没有语音信息,只有噪声信息,我们可以截取这一段,认为是纯噪声信息。将被截取的一段时域信息进行傅里叶变换便可以得到噪声的时域波形、频谱、幅度和相位等信息。在MATLAB中运行以下程序:

clc,clear

[x,fs,bits]=wavread('12.wav');%读取12.wav文件并返回fs和bits 的值。

y=x(1:4096,1);%截取语音信息前4096点作为噪声信号

Y=fft(y);%对噪声信号进行傅里叶变换

magY=abs(Y);%取噪声功率谱绝对值

angY=angle(Y);%取噪声相位

subplot(221);plot(y);title('噪声信号波形');

subplot(222);plot(Y); title('噪声信号频谱');

subplot(223);plot(magY);title('噪声信号幅值');

subplot(224);plot(angY);title('噪声信号相位');

程序运行结果如图3.3所示:

图3.3 噪声信号示意图

我们认为在整个语音信号中噪声是平稳的,且利用短时谱内人耳对语音信号相位信息不敏感的特性,我们可以在短时谱内对含噪语音信号分别进行傅里叶变换、求出信号幅值,再利用公式(7)对信号进行除噪处理,然后将相减后的幅值信息进行逆傅里叶变换,最后将每个增强后的语音连接起来,基本谱减法也就完成了。在MATLAB中具体程序如下:

clc,clear

[x,fs,bits]=wavread('12.wav');%程序读入12.wav音频文件,并将文件频率和位数分别返还fs值和bits值

y=x(1:4096,1);%截取原语音信号的前4096点生成新的语音信号,因为在该段没有有用语音信息,所以认为是噪声信号

Y=fft(y);

magY=abs(Y);

b=[];

for i=0:126;

n=4096;

x1=x(1+n*i:n+n*i);

X1=fft(x1);

magX=abs(X1);

S=(magX.^2-magY.^2);

S1=abs(S).^0.5;

s1=ifft(S1);

a=s1';

b=[b a];

end

x2=b';

plot(x2);

sound(x2,fs,bits);

wavwrite(x2,fs,'13.wav');%将重新生成的增强后的语音信号以文件名13.wav保存在work文件夹下

运行程序后,在work文件夹中新建了一个名为“13.wav”的语音文件,即经过语音增强后的语音。MATLAB并显示出增强后的时域波形及播放增强后的语音。从显示的增强语音的波形和播放的语音效果来看,都有一定的改善效果。增强后的语音信号时域波形如图3.4所示:

图3.4 语音增强后的信号时域波形图

从语音增强后的信号波形图与原信号波形图的对比中,我们看到波形得到了明显的改善,对比12.wav和13.wav也能发现后者噪声明显小于前者。

但是,从图3.4我们可以看出,有一些周期性的突发信号贯穿整个语音信息中,它们的特点是持续时间段,幅度大。这就是基本谱减算法进行语音增强后产生的“音乐噪声”,用sound(x2,fs,bits);调取播放增强语音也能明显的听到周期性类似金属撞击一样的噪声。我们想要尽量减少这种“音乐噪声”对语音信号造成的二次污染,就必须对基本的谱减算法进行改进。3.4.3 用改进谱减算法对含噪信号处理

在上一章中我们了解了改进谱减算法的基本原理和对基本谱减算法改进的地方,下面就在MATLAB中实验一下改进效果。

在公式(9)中,提高α的值将会进一步提高信噪比,同时增大β的系数会起到减少噪声、更好突出语音频谱的作用。在处理“音乐噪声”方面,采取“半波整形,中心限幅”的方法对语音信号在时域内进一步处理,以进一步提高信噪比,消除音乐噪声。

基于产生的“音乐噪声”是随即的幅值很高的信号,我们可以在基本谱减法程序的基础上,在每一个模块中设置一个阈值,当增强语音的幅度高过这一阈值时,将原信号强度衰减为原来的1/4,从而对“音乐噪声”进行限制。因为“音乐噪声”的幅值远远高于语音信号幅值,我们可以去短时信号的平均值*300作为阈值。这样,在基本谱减法程序的基础上,加入阈值和判断程序,程序如下:

clc,clear;

[x,fs,bits]=wavread('12.wav');

y=x(1:4096,1);

Y=fft(y);

magY=abs(Y);

b=[];

for i=0:126;

n=4096;

x1=x(1+n*i:n+n*i);

X1=fft(x1);

magX=abs(X1);

S=(magX.^2-magY.^2);

S1=abs(S).^0.5;

s1=ifft(S1);

m=mean(s1)*300;

for j=1:4096;

if abs(s1(j))>m;

s1(j)=s1(j)/4;

end

end

a=s1';

b=[b a];

end

x2=b';

plot(x2);

sound(x2,fs,bits);

运行程序后,计算机显示被处理后的语音信号时域波形如图3.5所示:

图3.5 进行中心限幅后语音时域波形示意图

从图像上看,经过中心限幅后的语音波形得到了明显的改善;从听觉上,“音乐噪声”也有所减小,不过值得注意的是,这种方法在减小“音乐噪声”影响的同时,不可避免的消除了一些清音信息,使得语音信息的可懂度降低,这就要求在限幅阈值的取值上进行适当的选择,阈值过高,噪声衰减的效果非常低;阈值过低又会将语音信息一同衰减造成失真。

结合上一章中改进谱减法将频谱处理中的平方和平方根修改成α方和开β方根,修改谱减法程序如下:

clc,clear;

[x,fs,bits]=wavread('12.wav');

y=x(1:4096,1);

Y=fft(y);

magY=abs(Y);

b1=[];a=1.3;b=1.3;%设定α和β的值

for i=0:126;

n=4096;

x1=x(1+n*i:n+n*i);

X1=fft(x1);

magX=abs(X1);

S=(magX.^a-magY.^a);

S1=abs(S).^(1/b);

s1=ifft(S1);

m=mean(s1)*300;

for j=1:4096;

if abs(s1(j))>m;

s1(j)=s1(j)/4;

end

end

a1=s1';

b1=[b1 a1];

end

x2=b1';

plot(x2);

sound(x2,fs,bits);

wavwrite(x2,fs,'14.wav')%增强后语音以14.wav为文件名保存运行结果如图3.6所示:

图3.6 设置α、β值为2.3的语音增强波形图

MATLAB中产生高斯白噪声

MATLAB中产生高斯白噪声,涉及到awgn和wgn函数 MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN。WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声。 1. WGN:产生高斯白噪声 y = wgn(m,n,p) 产生一个m行n列的高斯白噪声的矩阵,p以dBW为单位指定输出噪声的强度。 y = wgn(m,n,p,imp) 以欧姆(Ohm)为单位指定负载阻抗。 y = wgn(m,n,p,imp,state) 重置RANDN的状态。 在数值变量后还可附加一些标志性参数: y = wgn(…,POWERTYPE) 指定p的单位。POWERTYPE可以是'dBW', 'dBm'或 'linear'。线性强度(linear power)以瓦特(Watt)为单位。 y = wgn(…,OUTPUTTYPE) 指定输出类型。OUTPUTTYPE可以是'real'或 'complex'。 2. AWGN:在某一信号中加入高斯白噪声 y = awgn(x,SNR) 在信号x中加入高斯白噪声。信噪比SNR以dB为单位。x的强度假定为0dBW。如果x是复数,就加入复噪声。 y = awgn(x,SNR,SIGPOWER) 如果SIGPOWER是数值,则其代表以dBW为单位的信号强度;如果SIGPOWER为'measured',则函数将在加入噪声之前测定信号强度。y = awgn(x,SNR,SIGPOWER,STATE) 重置RANDN的状态。 y = awgn(…,POWERTYPE)指定SNR和SIGPOWER的单位。POWERTYPE可以是'dB'或'linear'。如果POWERTYPE是'dB',那么SNR以dB为单位,而SIGPOWER以dBW为单位。如果POWERTYPE是'linear',那么SNR作为比值来度量,而SIGPOWER 以瓦特为单位。 注释 1. 分贝(decibel,dB):分贝(dB)是表示相对功率或幅度电平的标准单位,换句话说,就是我们用来表示两个能量之间的差别的一种表示单位,它不是一个绝对单位。例如,电子系统中将电压、电流、功率等物理量的强弱通称为电平,电平的单位通常就以分贝表示,即事先取一个电压或电流作为参考值(0dB),用待表示的量与参考值之比取对数,再乘以20作为电平的分贝数(功率的电平值改乘10)。 2. 分贝瓦(dBW, dB Watt):指以1W的输出功率为基准时,用分贝来测量的功率放大器的功率值。 3. dBm (dB-milliWatt):即与1milliWatt(毫瓦)作比较得出的数字。 0 dBm = 1 mW 10 dBm = 10 mW 20 dBm = 100 mW 也可直接用randn函数产生高斯分布序列,例如: 程序代码 y=randn(1,2500); y=y/std(y);

matlab调用c语言编程

matlab与C语言混合编程 用C编写mex程序 大家都知道,matlab是一种解释型的编程环境,也就是说,跟以前的basic一样,是读 一句执行一句的。这样做可以很方便的实现编程过程中的交互,也免去了麻烦又耗时的 编译过程。但凡事有一利必有一弊,matlab在执行时速度慢也就根源于此。在matlab里 tic for i=1:10000 b(i)=a(10001-i); end 怎么样,是不是很慢? 你的程序里如果再多几个这样的循环,运行速度就可想而知了。 上面程序的功能是将向量a里的数据逆序赋给向量b。下面的程序可以实现相同的功能 tic b=a(10000:-1:1); 为什么这个程序运行速度就这么快呢?这是因为matlab里的基础矩阵运算函数,像转置,复制等等,都是以二进制程序的形式存在的,运行起来速度当然比解释执行10000次所以编matlab程序时,应该尽量避免用循环语句,而使用等效的矩阵运算。虽然这样 但总是有的时候没法找到对应的矩阵运算来等效,或编出来的程序复杂得让人没法修 简单地说,mex程序就是根据一定的接口规范(matlab提出的)编写的一个dll,matla 比如我编了一个mex函数,名字叫max2.dll,那么只要把这个dll所在的目录加到matlab 的搜索路径里(用addpath),就可以像调用普通matlab函数一样来调用它了。因为把 循环体放到了二进制程序中,执行速度快得多。 Mex文件既可以用c,也可以用fortran来编。因为我用的是c语言,所以下面的介绍都 用c语言编写mex文件的方法。如果你用的是fortran,请你自己去看Apiguide.pdf,里 面有详细说明。 前面说到通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度。这是 Matlab5.1本身是不带c语言的编译器的,所以要求你的机器上已经安装有VC,BC或Wat com C中的一种。如果你在安装Matlab时已经设置过编译器,那么现在你应该就可以使用mex命令来编译c语言的程序了。如果当时没有选,只要在Matlab里键入mex -setup ,就会出现一个DOS方式窗口,下面只要根据提示一步步设置就可以了。由于我用的是w 听说Matlab5.2已经内置了C语言的编译器,那么下面的这些可能就用不着了。可惜现 需要注意的是,在设置编译器路径时,只能使用路径名称的8字符形式。比如我用的V C5装在路径C:\PROGRAM FILES\DEVSTUDIO下,那在设置路径时就要写成:C:\PROGRA~1 示例程序一、 这样设置完之后,mex就可以执行了。为了测试你的路径设置正确与否,把下面的程序 存为hello.c。 #include "mex.h"

高斯白噪声

MATLAB中产生高斯白噪声的两个函数 MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN。WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声。 1. WGN:产生高斯白噪声 y = wgn(m,n,p) 产生一个m行n列的高斯白噪声的矩阵,p以dBW为单位指定输出噪声的强度。 y = wgn(m,n,p,imp) 以欧姆(Ohm)为单位指定负载阻抗。 y = wgn(m,n,p,imp,state) 重置RANDN的状态。 在数值变量后还可附加一些标志性参数: y = wgn(…,POWERTYPE) 指定p的单位。POWERTYPE可以是'dBW', 'dBm'或'linear'。线性强度(linear power)以瓦特(Watt)为单位。 y = wgn(…,OUTPUTTYPE) 指定输出类型。OUTPUTTYPE可以是'real'或 'complex'。 2. AWGN:在某一信号中加入高斯白噪声 y = awgn(x,SNR) 在信号x中加入高斯白噪声。信噪比SNR以dB为单位。x 的强度假定为0dBW。如果x是复数,就加入复噪声。 y = awgn(x,SNR,SIGPOWER) 如果SIGPOWER是数值,则其代表以dBW为单位的信号强度;如果SIGPOWER为'measured',则函数将在加入噪声之前测定信号强度。 y = awgn(x,SNR,SIGPOWER,STATE) 重置RANDN的状态。 y = awgn(…,POWERTYPE) 指定SNR和SIGPOWER的单位。POWERTYPE 可以是'dB'或'linear'。如果POWERTYPE是'dB',那么SNR以dB为单位,而SIGPOWER以dBW为单位。如果POWERTYPE是'linear',那么SNR作为比值来度量,而SIGPOWER以瓦特为单位。 注释 1. 分贝(decibel, dB):分贝(dB)是表示相对功率或幅度电平的标准单位,换句话说,就是我们用来表示两个能量之间的差别的一种表示单位,它不是一个绝对单位。例如,电子系统中将电压、电流、功率等物理量的强弱通称为电平,电

MATLAB与C语言的异同

MATLAB与C语言的异同 MATLAB是一种科学计算软件,也是当今最优秀的科技应用软件之一,专门以矩阵的形式处理数据。它以强大的科学计算和可视化功能,简单易用、开放式可扩展环境,特别是所附带的三十多种面向不同领域的工具箱支持,使得它在许多科学领域成为计算机辅助设计和分析、算法研究和应用开发的基本工具和首选平台。它作为一种计算工具和科技资源,可以扩大科学研究的范围,提高工程生产的效率,缩短开发周期,加快探索步伐,激发创作灵感。 作为一种计算机语言,一种用于科学工程计算的高效率的高级语言,MATLAB具有其他高级语言难以比拟的一些优点:编写简单、编程效率高、易学易懂。与其他语言相比,MATLAB 的语法更简单,更贴近人的思维模式。因此,MA TLAB语言也被通俗地称为“演算纸式”的科学计算语言。在控制、通信、信号处理及科学计算等领域中,MA TLAB都被广泛地应用,已经被认可为能够有效提高工作效率、改善设计手段的工具软件。 而C语言是一种面向问题的程序设计语言,也是目前国际上流行的一种结构化的程序设计语言,语言处理程序采用的是编译程序。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛,深受广大程序设计者的欢迎。 在操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。同时,它也是是数值计算的高级语言。 C语言具有如下特点: 1. 简洁紧凑、灵活方便 C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来, C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。 2. 运算符丰富 C的运算符包含的范围很广泛,共有种34个运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理,从而使C的运算类型极其丰富表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。 3. 数据结构丰富 C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据类型的运算。并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能, 支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。 4. C语言是结构式语言 结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以

高斯白噪声地matlab实现

通信系统建模与仿真 实验一、高斯白噪声的matlab 实现 要求: 样本点:100 1000 标准差:0.2 2 10 均值: 0 0.2 白噪声 如果噪声的功率谱密度在所有的频率上均为一常数,即 ) /(),(,)(0Hz W f n f P n +∞<<-∞= 式中:0n 为常数,责成该噪声为白噪声,用)(t n 表示。 高斯白噪声的matlab 实现

1.样本点为1000、均值为0、标准差为0.2时,高斯白噪声分布为下图所示: 程序如下所示: % White background nois clear all f = 1:1:1000; for i = 1:length(f) K = (0.2) * randn(1,1) - 0; P(i) = 10.^(K - 3.95*(10^-5)*f(i)); A(i) = sqrt(2*P(i)); end xifft = ifft(A); realx = real(xifft); ti = [1:length(xifft)-1]/1000; realx2(1:length(xifft)-1) = realx(2:length(xifft)); plot(ti,realx2) 2.样本点为1000、均值为0、标准差为2时,高斯白噪声分布为下图所示:

程序如下所示: % White background nois clear all f = 1:1:1000; for i = 1:length(f) K = (2) * randn(1,1) - 0; P(i) = 10.^(K - 3.95*(10^-5)*f(i)); A(i) = sqrt(2*P(i)); end xifft = ifft(A); realx = real(xifft); ti = [1:length(xifft)-1]/1000; realx2(1:length(xifft)-1) = realx(2:length(xifft)); plot(ti,realx2) 3.样本点为1000、均值为0、标准差为10时,高斯白噪声分布为下图所示:

C语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南 甄梓宁 znzhen@https://www.360docs.net/doc/ed2768136.html, Matlab在计算方面功能强大、编写简单,但是要运行Matlab程序必须装有Matlab并且用户界面也不够完善,因此除了计算的其他部分采用C等更规范完备的语言进行编写是较好的选择。本文就对如何在C程序中调用Matlab程序作说明。 在C程序中调用Matlab程序有两大类方法。第一种是调用Matlab引擎,第二种是将m文件打包成dll文件在C语言环境下调用。前者虽然易于实现,可以实时监控程序的运行,但是独立性差,需要安装完整版Matlab,且每次调用都会启动MATLAB.exe进程;后者则实现复杂,调试麻烦,但只需安装MCR(Matlab Component Runtime),耗费资源较少。关于MCR,请见第四章的说明。至于两种方法需要在C环境中如何配置请见第五章。 而反过来若要在Matlab下调用C程序则一般使用Matlab自带的mex工具,在此不作介绍。 一、调用Matlab引擎 调用Matlab引擎可以在WIN32、MFC中使用,它的原理实际上相当于打开一个精简版的Matlab然后往里面输命令。下面是调用Matlab中的加法程序add.m的例子。 先在Matlab的work目录下创建add.m文件并编写程序如下: function s = add (a, b) s = a+b; 在C程序中,首先打开精简版的Matlab:(所需头文件,引用库等见第五章) Engine *ep = engOpen (NULL); 编译运行后,会自动打开一个命令行监控窗口,输入pwd就可以看到当前的工作目录,于是需要先将工作目录转换至存放add.m的目录: engEvalString (ep, ”cd ..\\..\\work”); engEvalString是往Matlab里输命令的函数,显然我们的目标是成功运行: engEvalString (ep, ”s=add(a,b)”); 当然,目前Matlab中并没有a和b两个变量,因此需要在C中初始化这两个变量并转换成Matlab基本变量类型mxArray,才能将它们输入到Matlab中。关于mxArray,在第三章会有详细说明。下面是对a=1,b=2的转换过程:

matlab产生高斯噪声

%正态分布(normal distribution)又名高斯分布(Gaussian distribution), % MATLAB 命令是normrnd。 %1)R=normrnd(MU,SIGMA):生成服从正态分布(MU参数代表均值,DELTA参数代表标准差)的随机数。 % 输入的向量或矩阵MU和SIGMA必须形式相同,输出R也和它们形式相同。 %2)R=normrnd(MU,SIGMA,m):生成服从正态分布(MU参数代表均值,DELTA参数代表标准差)的随机数矩阵, % 矩阵的形式由m定义。m是一个1×2向量,其中的两个元素分别代表返回值R中行与列的维数。 %3) R=normrnd(MU,SIGMA,m,n):生成m*n形式的正态分布的随机数矩阵。 %4)randn()是标准正态分布;MA TLAB命令是normrnd 功能:生成服从指定均数和标准差的正态分布的随机数列, %即高斯随机序列。 例如: %高斯噪声为n(m)=nmr+jnmi,其中实虚部均为独立同分布N(0, a)的高斯随机数,信号x(m)=s(m) + n(m) % SNR = 10 lg[1/(2a)] = – 3 – 10 lg(a) (dB) [之所以是2a不是a是因为实虚部] %若有用信号s(n)的最大幅度am,要求得到的信噪比为p,则p=10log10[(am^2)/b^2],用这个公式反推出高斯 %噪声的方差b^2 snr=10; sqrt(a)=10^(-(snr+3)/10); noise=normrnd(0,sqrt(a),1,1000)+1*i*normrnd(0,sqrt(a),1,1000); %或者 noise=sqrt(a)*randn(1,1000)+1*i*sqrt(a)*randn(1,1000);

MATLAB数据输入和输出 C语言转换

数据输入和输出 一、概述 MATLAB可读和写的文件格式: 文件格式文件内容扩展名读、写文件的函数MATLAB 保存的MA TLAB工作区.mat load,save 文本Text 任意textscan,textread 限定文本任意dlmread,dlmwrite 逗号分隔的数值.csv csvread,csvwrite XML XML-格式文本t .xml xmlread,xmlwrite Audio NeXT/SUN sound .au auread,auwrite Microsoft WA VE sound .mav mavread,mavwrite Movie Audio/video .avi aviread Scientific data Data in Common Data Format .cdf cdfread,cdfwrite Flexible Image Transport system data .fits fitsread Data in Hierarchical Data Format .hdf hdfread Spreadsheet Excel worksheet .xls xlsread,xlswrite Lotus 123 worksheet .wk1 wk1read,wk1write Graphics TIFF/PNG/HDF/BMP/JPEG image GIF/PCX/XWD/Cursor/Icon image .tiff .png .hdf .bmp .jpeg .gif .pcx .xwd .cur .ico imread,imwrite 二、使用输入向导(Import Wizard) 从菜单File->Import Data打开Import Wizard;或者命令窗口输入函数uiimport。 从剪贴板开始Import Wizard:Edit->Paste to workspace。 三、保存和加载MAT文件 MAT文件是双精度、二进制、MATLAB格式的文件。 输出到MA T文件:save filename [var1 var2 …] [str*];可以通过[var1 var2 …]选择性保存变量;也可以使用通配符“*”。 查看MAT文件中的变量:whos –file 文件名。 存放结构数组的某个字段:加上“-struct”选项。 在已经存在的MAT文件上添加数据:-append选项。 禁止压缩和Unicode字符编码文件,在save语句中加入“-v6”或者File->Preferences-> General->MA T-Files->MAT-File save options->Ensure backward compatibility(-v6)。save语句默认为数据压缩。 选择输出格式:“-ascii”、“-tabs”、“-double”“-v4”。 从MA T文件输入数据:load函数。 四、输入文本数据 各种输入函数的数据定界符: csvread 仅逗号dlmread 任何字符(可指定)fscanf 任何字符load 仅空格 textread 任何字符textscan 任何字符详见:doc 函数名。 textscan和textread性能比较:前者有更好的性能,特别是读大文件时;使用前者首先要

matlab 正弦波 高斯白噪声 均匀白噪声 功率谱密度 自相关函数

现代通信原理作业一 姓名:张英伟学号:8036 班级:13级理工部3班 利用matlab完成: ●产生正弦波信号、均匀白噪声以及高斯白噪声并分别将两种噪声叠加到正弦 波信号上,绘出波形。 ●分别求取均匀白噪声序列和高斯白噪声序列的自相关及功率谱密度,绘出波 形。 一、白噪声区别及产生方法 1、定义: 均匀白噪声:噪声的幅度分布服从均匀分布,功率谱密度在整个频域内均匀分布的噪声。 高斯白噪声:噪声的幅度分布服从正态分布,功率谱密度在整个频域内均匀分布的噪声。 2、matlab仿真函数: rand函数默认产生是区间在[0,1]的随机数,这里需要利用公式: z2=a+(b-(a))*rand(m,n)............(公式1) randn函数默认产生均值是0、方差是1的随机序列,所以可以用其来产生均值为0、方差为1的正态分布白噪声,即N(0,12)。利用公式: z1=a+b*randn(1,n).................(公式2) 可以产生均值为a,方差为b2 高斯白噪声,即N(a,b2)。 二、自相关函数与功率谱密度之间的关系 1、功率谱密度:每单位频率波携带的功率,这被称为信号的功率谱密度。 2、自相关函数:描述随机信号X(t)在任意两个不同时刻t1,t2的取值之间的相关程度。 3、维纳-辛钦定理: 由于平均值不为零的信号不是平方可积的,所以在这种情况下就没有傅里叶变换。幸运的是维纳-辛钦定理提供了一个简单的替换方法,如果信号可以看作是平稳随机过程,那么功率谱密度就是信号自相关函数的傅里叶变换。 4、平稳随机过程:是在固定时间和位置的概率分布与所有时间和位置的概率分布相同的随机过程。(就是指得仅一个随机过程,中途没有变成另外一个统计特性的随机过程)

Matlab以MEX方式“调用”C源代码

Matlab以MEX方式“调用”C源代码 阅读() 评论() 发表时间:2008年09月26日 00:46 本文地址:https://www.360docs.net/doc/ed2768136.html,/blog/3311493-1222361217 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数: double add(double x, double y) { return x + y; } 现在我想要在Matlab中使用它,比如输入: >> a = add(1.1, 2.2) 3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。 所以现在我们要写一个包含add和mexFunction的C文件,Matlab调用函数,把函数中的自变量(如上例中的1.1和2.2)传给 mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab 语句中调用函数时的输出值(如上例中的a)。 值得注意的是,mex文件是与平台有关的,以我的理解,mex文件就是另类的动态链接库。在matlab6.5中使用mex -v 选项,你可以看到最后mex阶段有类似如下的信息: --> "del _lib94902.obj" --> "del "test.exp"" --> "del "test.lib"" 也就是说,虽然在matlab6.5生成的是dll文件,但是中间确实有过lib文件生成。 比如该C文件已写好,名为add.c。那么在Matlab中,输入: >> mex add.c 就能把add.c编译为MEX文件(编译器的设置使用指令mex-setup),在Windows中,MEX 文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数

基于MATLAB的高斯白噪声信道分析报告

基于matlab高斯白噪声信道分析系统的设计 ×× (陕西理工学院物理与电信工程学院通信工程专业1202班,陕西汉中 723003) 指导教师:吴燕 [摘要] MATLAB 是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。本文在matlab的环境下构建了BFSK在高斯白噪声信道中传输的系统模型,通过simulink程序仿真,研究系统的误码率与信道质量的关系,找到在高斯白噪声信道上传输的最大信噪比及所需发射功率和调制频率,从而得出该系统在高斯白噪声信道中的最佳传输性能。 [关键词] MATLAB;高斯白噪声;信道分析;simulink仿真

Design and production of the Gauss white noise channel analysis system based on MATLAB ×× (Grade 2012,Class 2,Major of Communication Engineering,School of Physics and Telecommunication Engineering of Shaanxi University of Technology,Hanzhong 723003,Shaanxi) Tutor: Wu Yan Abstract: MATLAB is a high-level technical computing language and interactive environment for the development of algorithms, data visualization, data analysis and numerical calculation. This article in the matlab environment build BFSK in AWGN channel model simulation,by running simulation the program on the system of quality of error rate and channel relationships,found in AWGN channel transport of maximum signal-to-noise ratio and the desired transmitter power. Key words:MA TLAB; Gauss white noise; channel analysis; Simulink simulation

在matlab中调用c程序

1.Maltab 编译Mex文件(不可调试) 1.1hello word 在matlab命令行中输入:mex -setup选择合适编译器,完成设置。 新建一个文件,输入: #include void mexFunction(int nlhs ,mxArray *plhs[] ,int nrhs, const mxArray *prhs[]) { mexPrintf("Hello word!"); } 把上面程序保存为一个C文件,如 hello.c 在command window下运行 >> mex hello.c >> 结束之后在current folder 窗口里会有一个hello.mexw32文件。 在command window下运行 >> hello() Hello word! 1.2如果是多维数组并不能用Arr[i][j]的格式寻址,在参数在C里只是一维数组, 一维数组按列排列,C语言是按行排列的, 如[a b c d;e f g h]C语言在内存中是按a b c d e f g h排列,而matlab是按 a e b f c g d h排列的。如果要变成C语言可Arr[i][j]索引的格式,可用for循环转化 打印函数: mexPrintf()相当于matlab的disp函数, mexPrintf函数里需要打印的部分必须用""而不能用'' 子函数的问题: 子函数有两种方式,一种采用return值得方式返回值 另一种方式为利用参数返回值,把需要return的值直接赋给形参。 多个.c文件的编译: 多个.c文件中只能存在一个mexFunction函数 可用mex ('a.c','b.c','d.c')的格式编译 在VS中调试mex 在vs中建立dll工程,建立project.cpp文件,输入 #include "project.h" #include void mexFunction(int nlhs ,mxArray *plhs[] ,int nrhs, const mxArray *prhs[]) { mexPrintf("Hello word!"); } 建立.h文件,输入 #include "matrix.h"

Matlab调用c语言程序代码

Matlab调用c程序 方法: 第一步:要先在matlab中安装c程序编译器,步骤如下: 键入命令:mex -setup; 选择c/c++编译器; 选择c/c++编译器版本; 确认。 第二步:键入:mex *.c 实例介绍:【转】 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:double add(double x, double y) { return x + y; } 现在我想要在Matlab中使用它,比如输入: >> a = add(1.1, 2.2) 3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab 的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。 可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。 所以现在我们要写一个包含add和mexFunction的C文件,Matlab调用函数,把函数中的自变量(如上例中的1.1和2.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。比如该C文件已写好,名为add.c。那么在Matlab中,输入: >> mex add.c 就能把add.c编译为MEX文件(编译器的设置使用指令mex -setup),在Windows 中,MEX文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数是一样的了。 我们现在来说mexFunction怎样写。 mexFunction的定义为: void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {

matlab 正弦波 高斯白噪声 均匀白噪声 功率谱密度 自相关函数

现代通信原理作业一 姓名:张英伟学号:133320085208036 班级:13级理工部3班 利用matlab完成: ●产生正弦波信号、均匀白噪声以及高斯白噪声并分别将两种噪声叠加到正弦 波信号上,绘出波形。 ●分别求取均匀白噪声序列和高斯白噪声序列的自相关及功率谱密度,绘出波 形。 一、白噪声区别及产生方法 1、定义: 均匀白噪声:噪声的幅度分布服从均匀分布,功率谱密度在整个频域内均匀分布的噪声。 高斯白噪声:噪声的幅度分布服从正态分布,功率谱密度在整个频域内均匀分布的噪声。 2、matlab仿真函数: rand函数默认产生是区间在[0,1]的随机数,这里需要利用公式: z2=a+(b-(a))*rand(m,n)............(公式1) randn函数默认产生均值是0、方差是1的随机序列,所以可以用其来产生均值为0、方差为1的正态分布白噪声,即N(0,12)。利用公式: z1=a+b*randn(1,n).................(公式2) 可以产生均值为a,方差为b2 高斯白噪声,即N(a,b2)。 二、自相关函数与功率谱密度之间的关系 1、功率谱密度:每单位频率波携带的功率,这被称为信号的功率谱密度。 2、自相关函数:描述随机信号X(t)在任意两个不同时刻t1,t2的取值之间的相关程度。 3、维纳-辛钦定理: 由于平均值不为零的信号不是平方可积的,所以在这种情况下就没有傅里叶变换。幸运的是维纳-辛钦定理提供了一个简单的替换方法,如果信号可以看作是平稳随机过程,那么功率谱密度就是信号自相关函数的傅里叶变换。 4、平稳随机过程:是在固定时间和位置的概率分布与所有时间和位置的概率分布相同的随机过程。(就是指得仅一个随机过程,中途没有变成另外一个统计特性的随机过程)

c_调用matlab函数(混合编程)

第2部分实战练习(自己做的) 2.1 c#调用matlab函数 matlab版本2009b,c#版本vs2008. 2.1.1 matlab函数编译成dll文件 (1)首先编写一个函数的m文件,如MatrixOpera表示两个矩阵相加和相减。 %-------------------------------------------------------- function [addRlt,minusRlt]=MatrixOpera(a,b) % 矩阵相加,相减 [m1,n1]=size(a); [m2,n2]=size(b); if m1~=m2 || n1~=n2 display('矩阵大小不相同') error('参数错误'); end addRlt=a+b; minusRlt=a-b; end %----------------------------------------------------------- 两个输入参数,两个输出参数,并且都是矩阵形式 (2)在matlab 命令窗口输入deploytool,弹出如下窗口 或者点击matlab的主菜单desktop→deploy tool获得如下面图所示的窗口,然后在file→new→deployment project 中点击。获得上图窗口,修改工程名称和文件后缀名(必须是,.Net Assembly格式)

修改

(3)新建了一个叫matPrj的工程(它相当于c#中的命名空间namespace);然后给它增加class或类(它就是c#中的类),点[add class]比如myMathClass;之后再给它添加方法(它就是函数了),点[add files],如下图所示。本实例中给它添加了MatrixOpera等函数。 class 方法 (4)完了之后就可以编译了。编译出来后需要一两分钟的时间。 编译 (5)找到该工程存放的文件夹,从里面拷出matPrj.dll文件。同时还要从G:\Program Files\MATLAB\R2009b\toolbox\dotnetbuilder\bin\win32\v2.0拷贝出MWArray.dll和https://www.360docs.net/doc/ed2768136.html,module。第二个文件必须要哦,否则可能会

MATLAB环境下的正弦信号及高斯白噪声仿真程序说明

姓名:朱奇峰 专业:电子与通信工程 方向:数字广播电视技术 学号:103320430109033 MATLAB 环境下的正弦信号及高斯白噪声仿真程序说明 一、信号的产生及时域观察 1、设定正选信号的频率为10HZ ,抽样频率为100HZ ; 2、设定N(0,0.25)高斯白噪声,及噪声功率为0.25W ; 3、最后将噪声叠加到正弦信号上,观察其三者时域波形。 二、信号频谱及白噪声功率谱的求解与观察 1、对原正弦信号直接进行FFT ,得出其频谱; 2、求白噪声的自相关函数,随机序列自相关函数的无偏估计公式为: 1 ^ 01()()()N m xx n r m x n x n m N m --==+-∑ 01m N ≤≤- ^^ ()()xx xx r m r m =- 01m N <<- 对所求自相关函数进行FFT 变换,求的白噪声的功率谱函数。 三、仿真结果:

附源程序代码: fs=100; fc=10; x=(0:1/fs:2); n=201; y1=sin(2*pi*fc*x); %原正弦信号,频率为10 a=0;b=0.5; %均值为a,方差为b^2 subplot(3,2,1); plot(x,y1,'r'); title('y=sin(20pi*x)'); ylabel('y'); xlabel('x/20pi'); grid; y2=a+b*randn(1,n); %高斯白噪声 subplot(3,2,2); plot(x,y2,'r'); title('N(0,0.25)的高斯白噪声'); ylabel('y'); xlabel('x/20pi'); grid; y=y1+y2; %加入噪声之后的信号 subplot(3,2,3); plot(x,y,'r'); title('叠加了高斯白噪声的sinx'); ylabel('y'); xlabel('x/20pi'); grid; FY=fft(y); %傅里叶变换得出频谱函数 FY1=fftshift(FY); %频谱校正 f=(0:200)*fs/n-fs/2; subplot(3,2,4); plot(f,abs(FY1),'r'); title('函数频谱图'); ylabel('F(jw)'); xlabel('w'); grid; %求高斯白噪声的自相关函数 m=50; i=-0.49:1/fs:0.49;

Labview调用C语言、Matlab脚本节点以及库函数节点的方法

Labview调用C语言、Matlab脚本节点以及 库函数节点的方法 Labview调用C语言的方法 CIN(Code InterfaceNode)节点是LabVIEW中用来调用C/C++代码的功能节点。它与动态链接库的不同之处在于,它能够将代码集成在VI中作为单独的一个VI发布,而不需要多余的文件。另外,它提供了函数入口,它可以根据用户提供的输入输出自动生成函数入口代码,从而使用户专心关注代码功能而不用为函数声明、定义等语句费心。因此CIN节点与DLL在不同的场合有不同的优势,但是CIN节点的使用比调用DLL要复杂得多。 由于LabVIEW中数据的存储格式遵循了C语言中数据的存储格式,并且二者完全相同,所以用户可以向CIN传递任意复合的数据结构。另外,CIN比图形化语言可获得更高的执行效率。 注意:对于完全相同的代码,CIN和DLL的执行效率是完全一样的。 如果要使用CIN节点,你必须安装了C编译器。在Windows下,CIN支持以下编译器: Microsoft Visual C++ Symantec C CIN节点必须调用.lsb文件。.lsb文件是通过外部编译器与CINTools工具结合将C代码编译生成的。 下面我们通过一个Step byStep的实例来看如何在LabVIEW中实现CIN节点调用,本例所用外部编译器为MicrosoftVisual C++6.0。 第一步:在程序框图放置一个空CIN节点; CIN节点位于FunctionsPalette的Connectivity->Libraries& Executables->Code InterfaceNode。 第二步:创建CIN节点的输入输出端口;

M序列的matlab产生方法

M序列是工程中常用的输入信号,它的性质类似于白噪声,而白噪声是理论上最好的输入信号,可见M序列的价值。下面介绍M序列的matlab产生方法。 idinput函数 产生系统辨识常用的典型信号。 格式 u = idinput(N,type,band,levels) [u,freqs] = idinput(N,'sine',band,levels,sinedata) N 产生的序列的长度,如果N=[N nu],则nu为输入的通道数,如果N=[P nu M],则nu 指定通道数,P为周期,M*P为信号长度。默认情况下,nu=1,M=1,即一个通道,一个周期。 Type 指定产生信号的类型,可选类型如下 Band 指定信号的频率成分。对于’rgs’、’rbs’、’sine’,band = [wlow, whigh]指定通带的范围,如果是白噪声信号,则band=[0, 1],这也是默认值。指定非默认值时,相当于有色噪声。对于’prbs’,band=[0, B],B表示信号在一个间隔1/B(时钟周期)内为恒值,默认为[0, 1]。Levels 指定输入的水平。Levels=[minu, maxu],在type=’rbs’、’prbs’、’sine’时,表示信号u 的值总是在minu和maxu之间。对于type=’rgs’,minu指定信号的均值减标准差,maxu 指定信号的均值加标准差,对于0均值、标准差为1的高斯白噪声信号,则levels=[-1, 1],这也是默认值。 说明 对于PRBS信号,如果M>1,则序列的长度和PRBS周期会做调整,使PRBS的周期为对应一定阶数的最大值(即2^n-1,n为阶数);如果M=1,PRBS的周期是大于N的相应阶数的值。在多输入的情形时,信号被最大平移,即P/nu为此信号能被估计的模型阶次的上界。 上面的意思可如下理解:对于M=1时, ms = idinput(12, 'prbs', [0 1], [0 1]); figure stairs(ms) title('M序列') ylim([-0.5 1.5])

c语言使用matlab生成的滤波头文件

matlab的fdatool是好东西,不过很多人不知道该怎么使用它生成的C头文件。 这里有个fdatool设计的IIR高通滤波器,采样率400Hz时截止频率1Hz。 设计定型之后,要做些调整。 以下说明中的英文名词有些可能对不上fdatool界面上的原文,请大家意会吧 第一步: 点击菜单中的Edit->Convert Structure 选择Direct Form I ,SOS,(必须是Direct Form I, II 不行) 一般情况下,按照默认设置,fdatool设计都是由二阶部分串联组成的。 这种结构的滤波器稳定性比一个section的要好很多,其他方面的性能也好些。 如果不是的话,点击Convert to second order sections。 这时,滤波器的结构(structure)应该显示为Direct Form I,second order sections 第二步: 选择quantize filter,精度选择single precision floating point (单精度浮点) 之所以不用定点是因为噪声太大,也不容易稳定。 点击菜单中的Targets -> generate c header ,选择export as:single precision floating point (单精度浮点) 填写变量名称时,把NUM改成IIR_B,DEN改成IIR_A,其他不用动,保存为iir_coefs.h 保存好的文件如下: //一大堆注释 //然后: /* General type conversion for MATLAB generated C-code */ #include "tmwtypes.h" /*

相关文档
最新文档