利用包络函数优化MATLAB中sound函数的发声【matlab调音_2】

/*仅当作学习笔记,若有纰漏欢迎友好交流指正,此外若能够提供一点帮助将会十分荣幸*/

摘要:在上一篇博文中(利用MATLAB对乐曲进行钢琴演奏【matlab调音_1】),已经简单实现了基于十二平均律的sound函数乐曲演奏,但对音色的处理办法介绍不多,本文介绍几种润色sound函数发声的包络函数。

基本参数设置

利用sound(y,Fs)函数播放声音,其中 Fs代表采样率,设置为Fs=8192(matlab的默认采样率区间为1000-38400,超出这个区间就不能播出声音了)。y代表音频信号矩阵,设f为音符频率,rhythm控制音乐节奏(用于控制每个音符的长度),并且在正弦函数的基础上可得音频信号矩阵y为:

y=sin(f\cdot x)

其中x=0:1/Fs:rhythm\cdot 2\cdot pi

利用包络函数润色发声

为了直观的展示音色处理效果,这里我们依然利用plot函数展示出声音波形,其中原始未经过包络函数处理的声音波形为:图1 未进行包络处理的声音波形

图1 未进行包络处理的声音波形 

从图中的波形可以看出,声音几乎没有起伏,声音播放出来人耳也只会听到一段长长的“哔”。这显然是难以接受的,于时在此基础上我们利用包络函数对其进行润色处理。接下来我们将会介绍几种包络函数,并且遵循前文中的基础参数设置。

1 y=kx+b型包络函数

为了细化处理过程,我们将范围缩小到音频信号矩阵y的一个周期范围,其未作处理时y=sin(f\cdot x)一个周期内生成的波形为

图1.1 未进行包络处理的信号矩阵y的单周期波形

从图中我们可以看到,声音信号遵循着sin函数自己的规律上下起伏变化,这并不符合从发声时声音最强并逐渐减弱的规律。因此,我们引入一个函数来辅助其“衰减”,首先展示y=kx+b型包络函数。

图1.2 y=kx+b型包络函数 

从图1.2中的”pic2”可以看到,相比于原始的sin函数,信号y已经有一个随时间衰减的过程了。

经过y=kx+b型包络函数处理的声音波形变为:

图1.3 y=kx+b型包络函数 

与图1相比,可以看到y=kx+b型包络函数处理后的声音波形随时间呈线性减弱。

2 四段直线包络函数

四段直线包络方法,能保证前一个音符能量消失后,才发出后续音符,这样就能有效消除,音符交替时的轻微杂音。四段直线包络方法实现了每个乐音都经过“冲激”“衰减”、“持续”、消失”四个音强变化阶段。由下图可以看出四段直线段构成一次包络,因此只要确定了每段线段的前后端点座标,即可用端点座标求出直线方程,直线方程可以用斜截式通式写出,该四段直线包络技

术将作用于每个音符,所以可用简单的循环,逐个对原有音符的正弦波信号进行包络,最后完成对所有音符的包络。

图2.1 四段直线包络函数 

对原始sin函数进行四段包络函数处理后的声音波形为:

图2.2 四段直线包络函数处理后的原始sin函数波形 

从图中可以看出,相比于图1.2中y=kx+b型包络函数简单粗暴的衰减,四段包络函数处理办法还原了乐音的“冲激”“衰减”、“持续”、消失”四个音强变化过程。

图2.3 四段函数包络处理后的声音波形 

3 exp(-x)型包络函数

在包络函数的处理中最常见的包络函数为指数衰减,最简单的衰减方式是对每个音乘以exp(-x)因子。

图3.1 exp(-x)包络函数处理后的声音波形 

对原始sin函数进行四段包络函数处理后的声音波形为:

图3.2 exp(-x)包络函数处理后的声音波形 

 这种处理办法不管是什么音符,都采用相同的衰减速度,通过人耳判听,可以发现噪音减弱但并没有消除,所以播放的音乐效果不是很好,同时还感觉音乐起伏性不强。

4 exp(-kx/rhythm)型包络函数

针对exp(-x)型包络函数处理方式的缺点,根据乐音音长标识来确定衰减速度的快慢,于是我们引入rhythm控制节奏。音长越长的乐音哀减越慢,音长越短的乐音衰减越快。

图4.1 exp(-kx/rhythm)型包络函数处理后的声音波形

对原始sin函数进行四段包络函数处理后的声音波形为: 

图4.2 exp(-kx/rhythm)型包络函数处理后的声音波形

5 x/exp(-kx/rhythm)型包络函数

x/exp(-kx/rhythm)型

图5.1 x/exp(-kx/rhythm)型包络函数处理后的声音波形

对原始sin函数进行四段包络函数处理后的声音波形为:

图5.2 x/exp(-kx/rhythm)型包络函数处理后的声音波形

x/exp(-kx/rhythm)型包络函数处理后的声音波形相比其它更加圆润,最终的效果也更好。

  • 9
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在MATLAB包络线函数可以通过两种方法实现。第一种方法是使用内置函数,第二种方法是手动编写代码实现。 对于第一种方法,MATLAB提供了envspectrum()函数,它可以计算信号的包络谱。该函数的输入是原始信号,输出是信号的包络谱,即信号的振幅随时间变化的曲线。可以将包络线作为输出显示或保存。 对于第二种方法,可以使用MATLAB的信号处理工具箱函数来实现包络线函数。首先,可以使用hilbert()函数计算原始信号的解析信号。该函数将原始信号进行解析,得到复数形式的信号,包含原始信号的振幅和相位信息。然后,可以使用abs()函数计算解析信号的幅值,得到信号的包络线。最后,可以将包络线作为输出显示或保存。 以下是一个示例代码,演示了如何使用手动编写的方式实现包络线函数: ```matlab % 原始信号 t = 0:0.01:10; x = sin(2*pi*0.5*t) + 0.5*sin(2*pi*2*t); % 计算原始信号的解析信号 x_analytic = hilbert(x); % 计算解析信号的包络线 envelope = abs(x_analytic); % 绘制原始信号和包络线 plot(t, x, 'b', t, envelope, 'r'); xlabel('时间'); ylabel('振幅'); legend('原始信号', '包络线'); ``` 上述代码首先生成了一个包含两个正弦波成分的原始信号。然后,使用hilbert()函数计算原始信号的解析信号,再使用abs()函数计算解析信号的幅值,得到包络线。最后,使用plot()函数绘制原始信号和包络线,并添加了相应的标签和图例。 通过以上两种方法,我们可以在MATLAB计算和绘制信号的包络线,并对信号的振幅随时间变化的特性进行分析。 ### 回答2: MATLAB包络线函数主要用于信号处理和分析的振动信号分析。包络线函数可以用于提取振动信号的主要特征和变化趋势。 在MATLAB,可以使用“envelope”函数来计算信号的包络线。该函数需要输入一个一维数组作为信号数据,并返回两个一维数组,分别表示信号的上包络线和下包络线。 使用方法如下: [upper_env, lower_env] = envelope(signal); 其,signal为待分析的信号数据,upper_env和lower_env分别为计算得到的信号的上包络线和下包络线。 包络线函数的计算基于希尔伯特变换,通过计算信号的解析信号后,提取其振幅,得到信号的包络线。包络线函数对于振动信号的特征提取非常有用,可以用于检测信号的频率变化、识别异常点、进行滤波等。 除了“envelope”函数之外,MATLAB还提供了其他用于包络线计算的函数,如“hilbert”函数、“abs”函数等,这些函数可以结合使用来进行更复杂的信号分析和处理。 总之,MATLAB包络线函数可以方便地提取信号的主要特征和变化趋势,对于信号处理和分析非常有帮助。 ### 回答3: Matlab包络线函数是用于对信号进行包络分析的工具。包络分析是一种用于分析时间信号快速变化的振幅的方法。 在Matlab,可以使用envspectrum函数来计算信号的包络谱。这个函数接受一个时间信号作为输入,并输出信号的包络谱。包络谱是信号的振幅随时间的变化。 另外,可以使用envpeaks函数来计算信号的包络峰值。这个函数会根据信号的包络线,找到信号的峰值点,并返回对应的时间和振幅值。 除了使用这些函数,还可以采用其他方法来计算信号的包络线。一种常用的方法是使用希尔伯特变换。希尔伯特变换可以将信号从时域转换到频域,并提取出信号的包络线。 总之,Matlab提供了多种包络分析的函数和方法,可以用于计算信号的包络线,并帮助我们分析信号的振幅变化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值