Matlab发声函数sound问题

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Matlab发声函数sound

今天发现个奇怪的事用sound出来很奇怪的声音。

fle = '012.wav';
[x,Fs]=audioread(fle);  
sound(x);

感觉代码没问题啊后面才发现问题出在采样率上。下面首先看看sound函数具体用法。

sound函数

功能将矢量作为声音进行播放。

  • sound(YFS将向量Y(具有采样频率FS中的信号发送到支持声音的平台上的扬声器。 假定Y中的值在-1.0 <= y <= 1.0的范围内。 超出该范围的值将被裁剪。 当Y为N×2矩阵时在支持立体声的平台上播放立体声。
  • sound(Y以默认采样率8192 Hz播放声音。
  • sound(YFSBITS尽可能使用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以上。

我们通常说的doremifasolati又是什么呢?
实际上这些音(或者说是唱名)是一种音高的记法。而音高于频率是指数的关系。所以知道了频率也就知道了音高。

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)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6