Matlab发声函数sound
今天发现个奇怪的事,用sound出来很奇怪的声音。
fle = '012.wav';
[x,Fs]=audioread(fle);
sound(x);
感觉代码没问题啊,后面才发现问题出在采样率上。下面首先看看sound函数具体用法。
sound函数
功能:将矢量作为声音进行播放。
- sound(Y,FS),将向量Y(具有采样频率FS)中的信号发送到支持声音的平台上的扬声器。 假定Y中的值在-1.0 <= y <= 1.0的范围内。 超出该范围的值将被裁剪。 当Y为N×2矩阵时,在支持立体声的平台上播放立体声。
- sound(Y),以默认采样率8192 Hz播放声音。
- sound(Y,FS,BITS),尽可能使用BITS位/样本播放声音。 大多数平台支持BITS = 8或16。
例子:
load handel.mat;
nBits = 16;
sound(y,Fs,nBits);
参数:
-
y —音频数据
列向量| m×2矩阵
音频数据,指定为单通道(单声道)音频的m×1列向量,或立体声播放的m×2矩阵,其中m是音频样本的数量。
如果y是m×2矩阵,则第一列对应于左声道,第二列对应于右声道。 立体声播放仅在系统支持的情况下可用。
数据类型:double -
Fs-采样率
8192(默认)| 正数
音频数据y的采样率(以赫兹为单位)从1000到384000之间指定为正数。有效值取决于MATLAB允许的采样率以及系统上特定的音频硬件。
MATLAB的硬限制为1000 Hz <= Fs <= 384000 Hz。
数据类型:single | double -
nBits-样本值的位深
16(默认)| 8 | 24
采样值的位深,指定为整数。 有效值取决于安装的音频硬件。 大多数平台支持8位或16位的位深度。
问题分析
我的语音采样率是48000Hz,而该函数默认的是8192Hz,不匹配。
解决方法:将语音降采样到8000Hz。
fle = '012.wav';
[x,Fs] = audioread(fle);
x = resample(x,8000,48000);
sound(x);
此时播放的声音就正常了。
附:函数发声本质
你是否好奇matlab是怎么发声的呢?
我们先想想什么是声音?
从本质上来说,声音其实是一种机械波。各种波源的振动通过介质的传播到人类或者动物的听觉器官(耳)后,听觉器官中的特殊分化细胞将感受到的振动转换为神经冲动。这些携带着振动信息的神经冲动传导至听觉中枢后,经过大脑的分析处理,最终便产生出了我们对振动的感受-声音。
既然声音是一种由振动带来的感受,那么什么样的振动会带给我们什么样的声音感受呢?
一般来说音波常常被简化为单个或多个正弦平面波的合成,而我们所说的声音的三个主要的主观属性(即音调、音量、音色)则是由如下参数刻画的,也就是一个是主观感知,一个是物理表示。
-
频率:频率越高,音调越高。人耳可以听到的振动频率范围在20到2万赫兹(Hz)之间。高于这个频率范围的我们称为超声波,而低于这个范围的我们叫次声波。
-
波长:波长越长,音调越低。
-
振幅:振幅是在振动中距离平衡位置或静止位置的最大位移。振幅越大,音量越大。
-
波形:不同的波形有不同的音色。波形是波在物理介质上移动的抽象表达形式。简单的说,就是声波所对应的函数的曲线图形。
纯音与复合音:
纯音实际上可以被视为各种各样的音的基本组成。最普通最基本的声波就是简谐振动所产生的正弦波,而纯音则指的是以某个固定频率进行简谐振动所产生的声波。比如音叉,或者我们拿起座机电话听筒听到的声音就是一种近似的纯音。
纯音的函数:y=Asin2πw。其中A为振幅,w控制频率。
复合音则是由多个纯音组成的音。其产生是由于物体振动时引起不同部位的振动,如一根琴弦,当它在振动时就同时包含了琴弦的不同部位的振动:首先是整条弦的振动,然后还有二分之一、三分之一、四分之一等琴弦不同部位的振动,这些部分振动就产生了不同音高的音,这些音又是同时发响,于是就混合在一起,形成了复合音。
sound(Y,FS,BITS) plays the sound using BITS bits/sample if possible. Most platforms support BITS=8 or 16.
参数Y是输入的信号,也就是声音的函数。比如上面提到的标准音la的函数可写为y=sin(2π⋅440)。
参数FS是采样频率,定义了每秒从连续信号中提取并组成离散信号的采样个数。FS越大,保留的信息就越多。比如音频CD或者mp3的采样频率为44,100Hz。
参数BITS是比特率。作为一种数字音乐压缩效率的参考性指标,比特率表示单位时间(1秒)内传送的比特数bps(bit per second,位/秒)的速度。简单地说,比特率间接衡量音频质量的一个指标。许多音乐文件例如mp3的比特率为128kbps,而24BIT灌制的CD(比如很多XRCD)压出的无损音频APE能达到1000kbps以上。
我们通常说的do,re,mi,fa,so,la,ti又是什么呢?
实际上这些音(或者说是唱名)是一种音高的记法。而音高于频率是指数的关系。所以知道了频率也就知道了音高。
fs=44100;
t=0: 1/fs: 0.5;
do=sin(2*pi*261.63 *t);
re=sin(2*pi*293.66 *t);
mi=sin(2*pi*329.63 *t);
fa=sin(2*pi*349.23 *t);
so=sin(2*pi*392.00 *t);
la=sin(2*pi*440.00 *t);
ti=sin(2*pi*493.88 *t);
Cscale=[do,re,mi,fa,so,la,ti];
sound(Cscale,fs)
和弦的实现
上面介绍了如何用sound()来编辑单音与音阶。由于输入信号Y只能是一个N×2的矩阵,也就是说sound()一次最多可以同时播放两个音。那么我们怎么实现最简单的大三和弦呢?简单来说就是通过叠加一些Matlab自带的声音效果也很有意思:
fs=44100;
t=0: 1/fs: 0.5;
y = sin(2*pi*261.63*t);
y = y + sin(2*pi*329.63*t);
y = y + sin(2*pi*392*t);
soundsc(y,fs); %soundsc()没有限制音量
一些Matlab自带的声音效果也很有意思:
%鸟声
load chirp
sound(y,Fs)
%锣声
load gong
sound(y,Fs)
%哈里路亚
load handel
sound(y,Fs)
%笑声
load laughter
sound(y,Fs)
%啪哒声
load splat
sound(y,Fs)
%火车
load train
sound(y,Fs)