Matlab发声函数sound问题

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)

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值