电话按键声音模拟与分析
语音数字信号处理练习一,最近做的练习,希望对阅读的人有所帮助
1、实验内容
本次练习是使用matlab对声音信号的处理,来模拟电话按键在拨号时的按键音,对每个按键的声音信号再进行分析。最后得到按键声音信号的时域波形和频域波形。(效果图如图1所示)
关键字:MATLAB/Guide、语音信号处理、FFT、加窗、包络泛音
2、设计过程
2.1、设计理论与过程分析
发声的原理我们都很清楚,是由物体以一定频率的振动所产生,振动的频率不同则所听到的声音也有所不同。例如熟悉的音阶“do、re、mi…”便是在某一频率振动的声音。
在生活中,我们用心体会便会发现,电话的每个按钮的拨号音是各不相同的。很自然的可以想到每个按键在按下后会发出某一频率或者某一种混合频率的振动,从而是我们能感受到不同按键声。(这可能就是影视剧里面高手听电话音,辨别电话号码的能力来源吧)
查询资料得到了电话各个按键的声音频率到底是多少,我画了一个示意图,可以看下面的图。
可以看出,每个案件都是一个双频音,由两个频率成分组成。例如,按动“1”时发出的声音是由1209Hz和697Hz的声音叠加而成。
依据此原理,在设计过程中,我首先进行时域上的分析,先根据按动的按键产生特定的按键声,之后对时域成分进行FFT,从而完成频域分析。
在基本工作完成后,对发生在进行进阶修饰——包络泛音(ADSR)和时域上的加窗再频谱分析。
2.2、MATLAB/Guide中控件的排布
使用到的控件有:Push Botto和Axes.
控件排布方式为下图所示
控件排布完成后,检查控件是否是按照自己规划的顺序进行排列,尤其是在按键和坐标轴过多的情况下,避免混乱。
有一个小技巧,可以不用拖动控件去调整顺序,只需要把控件按照想要的形状排布,只够改动控件的“Tag”属性(如图4所示)去排列顺序。记得先保存,保存后可以刷新Editor中控件的Callback Fcn和create Fcn的排列,进而达到事后排列的目的。
“Tag”属性在我的理解是类似与“对象”的概念,是控件的名字。
2.3、Editor编辑器中基本代码编写
在控件按照顺序排列完成后,可以开始控件回调函数(callback fcn)的编写。
从自己制作过程中,我整理出了该练习程序编写的思路如下五点。
2.3.1. 给按键唯一编号
设置全局变量 Type,表示按键类型,每一个Push Button的callback function中添加如下代码。
global Type;
Type = 1;%第一个按钮设置编号1,一次类推
my_callback_fcn(handles);%设置编号后同意进行之后的操作
2.3.2. 给每个编号对应一个按键的频率成分
按下按钮后,Type值便确定。之后跳转到自己编写的回调函数,这里我设置的是“my_callback_fcn(handles)”。
我们取两个变量(F1,F2),在类型确定后赋值所需的频率值。可以使用switch…case语句或者if…else 语句获取频率值。
以第一个按键为例,程序语句如下:
switch(Type)
case(1)
F1 = 1209;F2