(九十二)函数

函数的分类:

①有返回值的;

②无返回值的。

 

 

无返回值函数:

被称为void函数,其通用格式如下:

void 函数名(传递的变量) //可以不传递变量

{

函数内部的代码;

return; //可有可无

}


例如:

void abc(int a)
{
	using namespace std;	//如果函数外面没有全局的std,那么可以加上,或者用其替代版
	for (int i = 0;i < a;i++)
		cout << i << endl;
}

效果是输出i,一直到i比传递的变量a小为止。

int a表示在调用函数abc时,应传递一个参数给这个函数。比如abc(5);就是让函数在执行的时候a=5

 

 

有返回值的函数:

通用格式类似void函数,只不过return是必须的,并且需要返回一个函数值,格式如:

类型名 函数名(传递的变量) //可以不传递变量

{

函数内部的代码;

return 值; //必须有

}

return返回的值是根据类型名决定的。例如返回5.1,假如类型名为int,那么返回值为5(因为int类型强制转换返回值)。

 

 

 

返回值:

C++对返回值的类型限制为:不能是数组,但可以是其他类型。比如int,比如表达式,比如指针,比如结构和对象(暂时还不能理解)。

 

另外,按照说明,虽然函数不能返回数组,但是可以将数组作为结构或者对象组成部分来返回)。

 

函数在遇见第一个返回语句(return)后结束,无视后面的语句。

 

返回语句可以是表达式,例如 return a*a*a;

 

函数原型:

为什么需要函数原型:

①原型描述了函数到编译器的接口。——将函数返回值的类型,和参数的类型、数量告诉编译器。

 

②原型告诉编译器,函数需要什么。

例如代码:

int abc(double); //函数原型

……

double b = abc(3.3); //通过函数原型调用函数,将返回值用于赋值

1)比如在调用函数的时候,函数原型就告诉编译器,需要输入一个double类型的值(假如输入类型错误,比如输入了一个char类型的,编译器就会提示错误)。

 

2)然后abc(3.3)在调用函数并计算之后,返回一个值,并将该值放在一个指定的位置上(可能是CPU寄存器,或内存之中,具体我不知道……),然后调用函数(比如说main())从这个位置取回返回值;

由于函数原型指出了abc()的类型为int,因此编译器知道应检索多少个字节,以及如何解释他们。如果没有这些信息,编译器只能进行猜测,当然,编译器不可能去猜他们。——还是不太理解这段话第二个逗号之后的意思。

 

 

③之所以需要原型,而不是在使用的时候在文件中进行检索函数的定义。是因为这样做效率低。因为在检索的时候,编译器停止对例如main()的编译,甚至函数定义可能不在文件之中。——文中的解释看起来有点晕。

 

函数原型是如何和函数定义相关联的?

——即其机制是怎么样的?

 

 

 

函数原型的语法:

类型名 函数名(传递的变量);

①函数原型是一条语句,所以以分号结束“;”(英文的分号);

 

②如果有返回值的话,需要有对应的类型名;如果没有的话,可以为void

 

③函数名就是函数名,和函数定义的函数名要相同;

 

④如果有传递的变量,则写上变量名;如果没有,可以为空。可以加变量名,也可以不加(并没有什么区别,变量名只是起到一个占位符的作用,也可以和函数定义的变量名不一样)比如(int a)和(int)似乎没有区别。

 

⑤可以直接复制函数定义的函数头,作为函数原型。

 

 

两种函数原型的区别(ANSI C和C++):

ANSI C借鉴了C++的原型,但为了与基本C兼容,ANSI C的原型是可选的,C++是必备。

double abc() ;

以上这个函数原型,在C++里,绿色部分实质上和(void)是等价的;

ANSI C中,意味着不指出参数——在之后定义参数列表(不懂!是指在函数定义时么?)。

C++如果是不指定参数列表的话,应该用省略号,如

double abc(...;

————但是C++中的不指定参数列表在实践中失败了

一般仅当与接受可变参数的C函数(比如printf())交互时才这么做。

 

 

原型的功能:

原型对程序员来说,可以极大的降低程序出错的几率。因为,原型可以确保以下几点:

①编译器能正确处理函数返回值(通过函数的类型名);

②编译器检查使用的参数数目是否正确(比如需要2个参数,在调用的时候,是否传递了2个参数);

③编译器检查使用的参数类型是否正确(比如intchar)。如果不正确,则转换为正确的类型(如果可能的话,比如把int转为double,把double转为int之类可以互转的);

 

④避免发生以下错误:

1)传递的变量的类型和要求的变量类型不同——此时将通过强制类型转换解决这个问题(但前提两个都是算数类型);

不过潜在的错误是,将大的范围的数转为小的范围的数,可能会出错。比如某个超出int类型范围的数转为int

函数原型自动将被传递的参数(比如abc(5.5)中的5.5)强制转换为期望的类型(比如int类型的5)。

 

2)但若传递变量的类型和要求变量的类型差异较大时(比如int和指针),那么不会启动强制转换——因为没有意义。

 

 

 

函数定义:

形参和实参:

例如一个函数头为:double abc (double x);在调用这个函数的时候,函数创建了一个double变量x,就像在函数里面进行声明一样。

只不过,这个变量x的值,是在调用的时候根据传递参数的值来确定的。

例如在调用函数时:double e=abc (5); 那么在调用函数abc的时候,x的值就为5

 

假如说有代码:

int a = 5;
double b = abc(a);
……
double abc(int x)
{
	int b = x++;
	return b;
}

在调用函数时,函数abc使用的x是之前函数中变量a的副本,对x的操作(x++)将不影响之前函数中的变量a

对于这种情况,用于接收传递值的变量(在这里是x)被称为形参(在C++又被称为参量parameter);

传递给函数的值被称为实参(在这里是变量a)(在C++又被称为参数argument)。

 

在函数中声明的变量,例如上面的int b,以及形参(参量)(如上面的int x),是该函数(double abc)所私有的。

在函数被调用的时候,计算机为这些变量分配内存,在函数结束时,计算机将释放这些函数的内存。因此,他们是局部变量(自动变量)。

 

形参和其他局部变量最大的区别是:

①形参从调用该函数的那里获得自己的值;

②而其他变量在函数内部获得自己的值。

 

 

多个参数:

函数可以有多个参数,在调用的时候,参数和参数之间用逗号分开即可。

例如:double abc(int a,double b,string c)

在调用的时候:double m=abc(1, 2.2, "abc")

三个不同类型的变量12.2abc被同时传递给函数abc的三个不同类型的变量a、bc

在声明的时候需要这么做:double abc(int, double, string);

和普通声明非常相似。

 

注意:

①多个参数的类型可以相同,也可以不同。

②多个参数在传递变量时,要依次给一个确定的、且符合要求的值。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【标题】"语音识别的一个matlab程序"是一个与语音处理和模式识别技术相关的项目,它使用MATLAB编程语言实现。MATLAB是MathWorks公司开发的一种数值计算和数据可视化环境,广泛应用于工程、科学和数学领域,尤其在信号处理和机器学习方面有很强的功能。 【描述】提到的"在一个网站看到,大家分享一下"表明这是一个社区共享的资源,可能来源于一个在线论坛或编程交流平台。这样的共享行为旨在促进技术交流和学习,让其他对语音识别感兴趣的用户能够参考、学习和改进代码。 【标签】"语音识别"是这个项目的关键词,意味着该程序涉及将人类语音转化为文本或命令的过程。语音识别技术的核心是将音频信号转换为可理解的数据,这通常包括预处理、特征提取、模型训练和匹配等步骤。 在提供的【压缩包子文件的文件名称列表】中,我们可以推断出这个MATLAB程序的组成部分: 1. `demo.m`:通常是演示脚本,用于展示程序的主要功能和用法,用户可以通过运行这个文件快速了解程序的工作原理。 2. `.p` 文件(melfb.p, mfcc.p, vqlbg.p, disteu.p, test.p, blockFrames.p, train.p):这些是MATLAB的编译函数文件,可能包含特定的算法实现,如梅尔频率倒谱系数(MFCC)提取、声学建模、距离计算、训练和测试等功能。例如: - `melfb.p` 可能实现了梅尔滤波器组,用于对语音信号进行频谱分析。 - `mfcc.p` 可能负责MFCC的计算,这是语音识别中常用的特征提取方法。 - `train.p` 和 `test.p` 可能分别对应模型的训练和测试过程。 3. `Read Me.txt`:通常包含关于如何使用、配置和运行程序的说明和指导。 4. `www.pudn.com.txt`:可能指向源文件的下载地址或发布者的信息,PUDN(太平洋下载网)是一个提供各类资源下载的网站。 这个MATLAB程序可能涵盖了语音识别的完整流程,包括预处理、特征提取、模型训练和评估。通过运行`demo.m`,用户可以体验整个识别过程,并可根据源代码深入了解语音识别的实现细节。对于学习和研究语音识别技术的人来说,这是一个宝贵的实践资源。
在语音处理领域,特征提取是至关重要的步骤,它旨在从原始语音信号中提炼出具有代表性的参数,以便后续的分析、识别或建模。这里,我们关注的是三种基础且常用的语音特征:短时能量、平均幅度和平均过零率。这些特征在MATLAB中可以方便地实现。 让我们详细了解这三种特征: 1. **短时能量**:短时能量是衡量语音信号强度的一种方法。在MATLAB中,通常通过将语音信号分帧(例如,使用汉明窗),然后计算每帧的能量(即,信号平方和的总和)。这可以捕捉到语音的响度变化,对识别语音的有声/无声状态非常有用。计算公式为: ```matlab frame = x.*hamming(frame_length); % x为原始语音信号,frame_length为帧长度 energy = sum(frame.^2); ``` 2. **平均幅度**:平均幅度是测量语音信号幅度均值的特征,它反映了语音信号的平均响度。在MATLAB中,我们可以计算每帧信号的均值: ```matlab mean_amplitude = mean(abs(frame)); ``` 平均幅度可以帮助识别音调的变化,但不如短时能量敏感于信号的有无。 3. **平均过零率**:平均过零率是计算信号在特定时间内穿过零轴的次数,反映了信号的瞬态特性。在MATLAB中,计算平均过零率通常涉及对信号取绝对值,然后找出符号改变的点: ```matlab zero_crossings = find(diff(sign(frame)) == -2); mean_zero_rate = length(zero_crossings) / frame_length; ``` 这个特征对于检测语音中的爆破音和辅音特别有效。 在实际应用中,为了提高特征的鲁棒性,通常会结合使用这些特征,并可能进行归一化处理。例如,将所有特征缩放到相同的范围内,或者使用Mel频率倒谱系数(MFCC)等更高级的特征提取方法。这些特征组合起来能够提供更全面的语音描述,有助于在语音识别、情感分析或语音合成等任务中提升性能。 在提供的压缩包中,每个文件名对应一个特征的计算。`语音短时能量`可能是计算每帧能量后的结果,`平均幅度`包含了每帧的平均振幅,而`平均过零率`则可能是计算过的过零率。通过读取和解析这些数据文件,我们可以进一步了解不同语音片段的特性,并可能用于训练机器学习模型或其他语音处理任务
本文主要探讨了一维信号去噪的方法,通过MATLAB进行了实操分析。对一维信号进行了时域分析,通过绘制时域谱了解信号的基本特性。接着,利用快速傅里叶变换(FFT)将信号从时域转换到频域,以获取信号的频谱分布,这有助于识别噪声所在的频率范围。 在频谱分析的基础上,尝试设计了一个基于窗函数的简单带通滤波器。这里使用了fir1函数来设计滤波器,设定通带为50~350Hz,目的是保留这个频率范围内的信号,去除高频噪声。滤波器的频率响应和滤波后的信号分别通过图形展示,结果显示虽然滤除了部分高频噪声,但效果并不显著,特别是在采样频率未知的情况下,FFT变换的效果受限。 为解决这一问题,文章引入了小波分析。小波分析具备多分辨率分析的特性,能同时在时域和频域提供信号的局部信息。它可以灵活调整时间窗和频率窗的大小,以适应不同频率成分的信号。在处理实验数据时,先对信号进行一层小波分解,使用db1小波函数。分解后,对细节系数进行阈值处理,以达到去噪的目的。通过小波重构将处理后的系数恢复为滤波后的信号。 整个过程中,MATLAB代码展示了如何读取数据、进行FFT变换、设计滤波器以及执行小波分析和重构。小波分析的去噪效果通常优于传统滤波器,尤其是在处理非平稳信号和局部特征时,能更好地保留信号的重要信息。 总结起来,一维信号去噪涉及的关键技术包括时域分析、FFT变换、带通滤波器设计(窗函数法)以及小波分析与重构。MATLAB作为强大的数值计算工具,提供了实现这些技术的便捷途径。通过这些方法,工程师和研究人员可以有效地从噪声中提取有用信号,为后续的数据处理和分析提供更纯净的信号源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值