当前位置:文档之家› Matlab音乐合成实验报告(重大 通院)

Matlab音乐合成实验报告(重大 通院)

Matlab音乐合成实验报告(重大 通院)
Matlab音乐合成实验报告(重大 通院)

重庆大学Matlab音乐合成实验报告

班级:实验班

指导老师:印勇

学生: 覃继良

20114909

学号:

音乐合成实验

介绍

本文共有三大部分:第一部分,简单的音乐合成;第二部分,用傅里叶变换分析音乐;第三部分,基于傅里叶级数的音乐合成。由潜入深,一步一步分析了用MATLAB 进行音乐合成的过程。通过本实验达到了加深对傅里叶级数和傅里叶分析的理解,熟悉对MATLAB 基本使用的目标。

第一部分 简单的合成音乐

1.1 合成《东方红》

根据《东方红》第一小节的简谱和十二平均律计算出该小节每个乐音的频率,在MATLAB 中生成幅度为1,抽样频率为8kHz 的正弦信号表示这些乐音,用sound 播放合成的音乐

由图可知《东方红》的曲调定为F ,即1=F ,对应的频率为349.23Hz ,据此可以计算出其他乐音的频率,例如5对应的频率为7/125349.232523.25f =?=,一次类推计算出第一小节各乐音对应的频率为:

在确定了各乐音的频率之后需要确定每个乐音的持续时间。每小节有两拍,一拍的时间是0.5s ,因此各乐音的持续时间为:

而在MATLAB 中表示乐音所用的抽样频率为fs=8000Hz ,也就是所1s 钟内有8000个点,抽样点数的多少就可表示出每个乐音的持续时间的长短。用一个行向量来存储这段音乐对应的抽样点,

在用sound函数播放即可。

根据以上分析在MATLAB中编写如下程序:

east1.m

clear;clc;

fs=8000; %抽样频率

f=[523.25 523.25 587.33 392 349.23 349.23 293.66 392];

%各个乐音对应的频率

time=fs*[1/2,1/4,1/4,1,1/2,1/4,1/4,1]; %各个乐音的抽样点数

N=length(time); %这段音乐的总抽样点数

east=zeros(1,N); %用east向量来储存抽样点

n=1;

for num=1:N %利用循环产生抽样数据,num表示乐音编号

t=1/fs:1/fs:time(num)/fs; %产生第num个乐音的抽样点

east(n:n+time(num)-1)=sin(2*pi*f(num)*t);

%抽样点对应的幅值

n=n+time(num);

end

sound(east,8000); %播放音乐

在MATLAB中运行east1.m,播放出了《东方红》的第一段,但是可以听出效很不好,只能听出具有《东方红》的调子而已。

图1-1

由图1-1我们可以看到,每一个调子并没有能够区分出来,就是连续一片的。幅度也是相当的,都是1。

1.2 除噪音,加包络

在east1中,连接的音符产生了一个杂音,下面通过加包络来消噪音。

eα-因子,在实验中首先加最简单的包络为指数衰减。最简单的指数衰减是对每个音乘以t

e-的衰减,这种衰减方法使用的是相同速度的衰减,但是发现噪音并没有完全消除,的是 1.5t

播放的音乐效果不是很好,感觉音乐起伏性不强。于是采用不同速度的衰减,根据乐音持续时间的长短来确定衰减的快慢,乐音持续时间越长,衰减的越慢,持续时间越短,衰减的越快。在1.1程序的基础上加上包络,编写如下程序:

East2.m

clear;clc;

fs=8000; %抽样频率

f=[523.25 523.25 587.33 392 349.23 349.23 293.66 392];

%各个乐音对应的频率

time=fs*[1/2,1/4,1/4,1,1/2,1/4,1/4,1]; %各个乐音的抽样点数

N=length(time); %这段音乐的总抽样点数

east=zeros(1,N); %用east向量来储存抽样点

n=1;

for num=1:N %利用循环产生抽样数据,num表示乐音编号

t=1/fs:1/fs:time(num)/fs; %产生第num个乐音的抽样点

G=zeros(1,time(num)); %G为存储包络数据的向量

G(1:time(num))=exp(1:(-1/time(num)):1/8000);

%产生包络点

east(n:n+time(num)-1)=sin(2*pi*f(num)*t).*G(1:time(num));

%给第num个乐音加上包络

n=n+time(num);

end

sound(east,8000); %播放

plot(east);

播放后可以听出噪音已经消除,同时因为不同时长的乐音衰减的快慢不一样,音乐听起来更有起伏感,下图是加包络后的east图像。

更科学的包络如下图所示,每个乐音都经过冲激、衰减、持续、消失四个阶段。

由上图可以看出这个包络是四段直线段构成的,因此只要确定了每段线段的端点,即可用端点数据写出直线方程,因此这段包络可以用简单的循环来完成。例如认为包络线上的数据如下图所示:

包络的通式可以这样表示

2111

21

()y y y x x y x x -=-+-

据此在MATLAB 中编写如下程序:

East3.m

clear;clc; fs=8000;

f=[523.25 523.25 587.33 392 349.23 349.23 293.66 392]; time=fs*[1/2,1/4,1/4,1,1/2,1/4,1/4,1]; N=length(time); east=zeros(1,N); n=1;

for num=1:N

t=1/fs:1/fs:(time(num))/fs; P=zeros(1,time(num));

X=(time(num))*[0 1/5 333/1000 333/500 1]; Y=[0 1.5 1 1 0]; s=1;

b=1:1:time(num); for k=1:4

P(s:X(k+1)-1)=(Y(k+1)-Y(k))/(X(k+1)-X(k))*(b(s:X(k+1)-1)-X(k+1)*ones(1,X(k+1)-s))+Y(k+1)*ones(1,X(k+1)-s); s=X(k+1); end

east(n:n+time(num)-1)=sin(2*pi*f(num)*t).*P(1:time(num)); n=n+time(num); end

sound(east,8000); plot(east);

运行得到的图像为:

下图是两个乐音交接处的局部放大图,可以清楚地看到前一个乐音一直衰减到0,后一个乐音从0开始增加,因此消除了噪音。

1.3 改变程序,实现1.2中的音乐升高和降低一个八度

升高一个八度即每个乐音的频率都提高一倍,变为原来的2被;降低一个八度即每个乐音的频率都减小一倍,变为原来的1/2。因此最简单的办法是将存储乐音频率的向量每个元素改变为2或1/2倍。

即将程序中的f=[523.25 523.25 587.33 392 349.23 349.23 293.66 392];改为

f=[523.25 523.25 587.33 392 349.23 349.23 293.66 392]*2;或

f=[523.25 523.25 587.33 392 349.23 349.23 293.66 392]/2;

2(1.06)倍,可以利用resamlpe函数将上述音乐上高半个音阶,即将频率变为原来的1/12

对原来的数据点进行重采样来实现

east=resample(east,100,106);

因为resample进行重新采样后会使每个乐音的持续时间改变,但是因为升高半个音阶,频率改变不大,所以每个音的持续时间是基本不变的。

1.4 在1.2的音乐中加入谐波

在1.2的音乐中加上二、三、四次谐波,基波幅度为1,高次谐波幅度分别为0.2、0.3、0.1。只需将east3.m程序改为

即可,加颜色部分为修改的部分,加上谐波后音乐效果变得更好了。

1.5 自选音乐合成——《》

曲调为C,因此可以得到每个乐音对应的频率分别为:

各个乐音对应的持续时间为(单位s)

因此,可以得到如下的程序

Music1.m

clear;clc;

fs=8000; %抽样频率

f=[392 392 329.63 293.66 329.63 329.63 392 262.63 233.08 220 220];

%各个乐音对应的频率

time=fs*[0.5,0.25,0.25,0.5,0.5,0.25,0.25,0.25,0.25,0.5,0.5]; %各个乐音的抽样点数

N=length(time); %这段音乐的总抽样点数

east=zeros(1,N); %用east向量来储存抽样点

n=1;

for num=1:N %利用循环产生抽样数据,num表示乐音编号

t=1/fs:1/fs:(time(num))/fs; %产生第num个乐音的抽样点

P=zeros(1,time(num)); %P为存储包络数据的向量

L=(time(num))*[0 1/5 333/1000 333/500 1];

%包络线端点对应的横坐标

T=[0 1.5 1 1 0]; %包络线端点对应的纵坐标

s=1;

b=1:1:time(num); %产生包络线抽样点

for k=1:4

P(s:L(k+1)-1)=(T(k+1)-T(k))/(L(k+1)-L(k))*(b(s:L(k+1)-1)-L(k+1)*ones(1,L(k+1)-s)) +T(k+1)*ones(1,L(k+1)-s);

%包络线直线方程通式

s=L(k+1);

end

m=[1 0.3 0.2]; %波形幅值矩阵

ss=zeros(1,length(t));

for i=1:length(m)

ss=ss+m(i)*sin(2*i*pi*f(num)*t); %加谐波

end

east(n:n+time(num)-1)=ss.*P(1:time(num));

n=n+time(num);

end

sound(2*east,8000);

plot(east);

第二部分用傅里叶变换分析音乐

2.1 载入FMT.WAV并播放

利用wavread函数载入,用sound函数播放,程序如下:

test.m

wave=wavread('fmt.wav');

sound(wave)

这段音乐听起来比之前合成的音乐更加真实,因为里边含有丰富的谐波。

2.2 载入文件GUITAR.MAT,处理原始数据REALWAVE

载入文件Guitar.mat,分析wave2proc是怎么由realwave得到的。利用

load Guitar.mat;载入并用plot 函数将realwave 、wave2proc 分别画出,得到以下两幅图

图2.2-1

图2.2-2

可以看到,wave2proc 比realwave 的周期性好得多,去掉了非线性谐波和噪声。在时域做,从图上可以看到,realwave 的数据大约是10个周期的共243个数据,因此可以用resample 函数对realwave 进行重新采样,将采样点提高到250个,那么重采样后每个周期有25个点,将这25个点对应相加求平均值后得到一个周期的值,因为进行了平均,减小了非线性谐波和噪音,然后将这25个数据延托成十个周期即250个点,在利用resample 函数对得到的函数重新采样将采

50

100

150

200

250

-0.2

-0.15-0.1-0.0500.050.10.150.2

0.25050100150200250

样点数恢复到243个。根据以上分析,编写实现这个思路的程序如下:

Test2.m

clear;clc; load Guitar.mat ;

wave=resample(realwave,250,243); %重采样,将点数变为250 w=zeros(1,25); for i=1:25 for k=0:9

w(i)=w(i)+wave(25*k+i); %10个周期的对应点分别求和

end end

w=w/10; %取平均值

wave2=repmat(w,1,10); %将1个周期的10个点延拓至250个点 wave2=resample(wave2,243,250); %重采样,将点数变回243 hold on ,plot(wave2,'r'),hold off ; %将处理后的数据绘出,红色 hold on ,plot(wave2proc); %将所给的数据绘出,蓝色

运行后的结果为:

由图可见,两组数据重合的很好,说明这种方法是很不错的方法。

050100150200250

-0.15

-0.1-0.0500.050.10.150.2

0.25

2.3

分析WAVE2PROC 的基波和谐波

为了分析wave2proc 的基波和谐波,可以对wave2proc 进行傅里叶变换,得到wave2proc 的

幅值谱,在频谱图上的第一个突出的波峰对应的频率即为wave2proc 基频,编写了如下程序: Test3.m

clear;clc; load Guitar.mat; fs=8000;

NFFT = 2^nextpow2(length(wave2proc)); Y = fft(wave2proc,NFFT)/length(wave2proc); g = fs/2*linspace(0,1,NFFT/2+1); plot(g,2*abs(Y(1:NFFT/2+1)))

运行后得到的结果为

虽然从图上可以大概看出包络,但是非常不明显,假如提高频域的抽样频率,例如将抽样频率由NFFT = 2^nextpow2(length(wave2proc))改为 NFFT = 8^nextpow2(length(wave2proc))得到的结果如下;

05001000150020002500300035004000

0.010.020.03

0.040.050.060.070.08

由图可见虽然频域的抽样频率提高了很多,但是得到的包络依然不精确,这是因为wave2proc 是周期函数,但是现在的wave2proc 只有243个数据点,并不能非常明显的体现出其周期性,因此它的幅值谱的离散化程度不高,虽然提高了频域的抽样频率,但是wave2proc 数据点的周期性并没有增加,所以要显示出离散化程度高的幅值谱,就要增加wave2proc 的周期性,即让wave2proc 在时域重复多次后在进行傅里叶变换。

利用repmat 函数可以将wave2proc 在时域重复。将程序修改为

Test4.m clear;clc;

load Guitar.mat; fs=8000;

wave2proc =repmat(wave2proc,20,1); %将 wave2proc 重复20次 NFFT = 2^nextpow2(length(wave2proc)); Y = fft(wave2proc,NFFT)/length(wave2proc); g = fs/2*linspace(0,1,NFFT/2+1); plot(g,2*abs(Y(1:NFFT/2+1)))

05001000150020002500300035004000

0.010.020.030.040.050.060.07

0.08

运行后得到的幅值谱为

可以看出幅值谱的离散化程度已经非常高了。由图读出wave2proc 的基频为329.1Hz ,幅值为0.05401,高次谐波幅值分别为:

2.4

自动分析FMT.WAV

的音调和节拍

思路分析:

将fmt.wav 导入后得到的是一个向量,它包含了这段音乐的所有信息,要自动分析这段音乐的音调就需要将每个音调对应的点进行傅里叶变换得到其幅值谱,在幅值谱上找到第一个幅值较大的极大值点,该点对应的就是该音调的基频,得到基频后就可以得到高次谐波的幅值。为了使对每个音调进行傅里叶变换后得到的幅值谱离散程度高,应该将每个音调的数据在时域上重复多次,由于这些点都是直接采集的为做处理的点,因此其重复次数应该足够大才能体现

05001000150020002500300035004000

0.010.020.030.040.050.060.070.08

出较强周期性,本实验采用重复1000次,虽然重复次数越多越好,但是次数太大,程序运行的速度会大大降低。

这里边还有两个关键点:第一,在从幅值谱上找基频时,因为图上的极大值点很多,怎么能让程序自动确定出准确的基频。第二,在程序找到了基频之后,再由基频去获取高次谐波的幅值时需要有一定的容错能力,例如若基频为200Hz,幅值为1,那么对应的二次谐波的频率为400Hz,但是很可能恰好幅值谱上400Hz处的幅值为0.01,但是401Hz处的幅值为0.2,这时实际上的二次谐波应该为401Hz,但是若没有给基频一个容错范围,显然找到的二次谐波的幅值是不正确的。

针对以上提出的两个关键点,我找到了两条有针对性的解决办法。对于第一点,因为幅值谱上极大值点的幅值足够大才能将其定位基频,因此在分析了几个音调后发现基频处的幅值都在0.025以上,因此将基频处的限定条件改为幅值大于0.025的,但是在运行后发现,有几个音调没有分析出来,说明它们的基频幅值小于0.025,其实可以观察一下fmt.wav的波形就会发现,有几段的整体幅值很小,因此基频幅值小,于是又在加上限定条件,若所有点的幅值都小于0.02,那么再用0.015作为幅值的限定条件继续找,这样就将剩下的音调基频也确定出来了。对于上述的第二点,可以将确定出的基频的误差设为+-1Hz,例如程序确定的基频为200Hz,实际的基频应该在(200-1)到(200+1)之间,那么k次谐波对应的频率范围是k*(200-1)到k*(200+1),在这个区间中继续找幅值的极大值点就是k次谐波对应点。

根据以上思路,下面开始编写用于分析一个音调频率的函数analysis。

在取谐波幅值时,幅值小于基波幅值5%的谐波认为其幅值为0,最终谐波的幅值用归一化

后的数据表示。

每一步的详细思路见注释。

analysis.m

function [y1 y2]=analysis(w,a)

%设有两个返回值,y1返回频率,y2返回幅值,两个变量,w为待分析数组,a为数据的抽样频率

fs=a; %傅里叶变换的抽样频率

y1=zeros(1,7); %求最大7次谐波,因此定义1*7矩阵

y2=zeros(1,7);

NFFT = 2^nextpow2(length(w));

Y = fft(w,NFFT)/length(w);

g = fs/2*linspace(0,1,NFFT/2+1);

p=2*abs(Y(1:NFFT/2+1));

plot(g,p) %以上为傅里叶变换部分

d=floor(NFFT/fs); %将误差1Hz化成对应的点数

for k=2:length(p)-1

if (p(k)>0.02)&&(p(k)>p(k-1))&&(p(k)>p(k+1)) %寻找基频的条件

y1(1)=g(k); %存储基频

y2(1)=p(k); %存储基波幅值

break

elseif (p(k)>0.015)&&(p(k)>p(k-1))&&(p(k)>p(k+1))

%若未找到基频,将幅值限制改为0.015,继续寻找

y1(1)=g(k);

y2(1)=p(k);

end

end

for t=2:7

for i=t*(k-d):t*(k+d) %在误差允许的范围内寻找t次谐波点

if (p(k)>0.02)&&(p(i)>0.05*p(k))&&(p(i)>p(i-1))&&(p(i)>p(i+1))

y2(t)=p(i)/y2(1); %谐波幅值归一化

y1(t)=g(i);

break

elseif (p(k)>0.015)&&(p(i)>0.05*p(k))&&(p(i)>p(i-1))&&(p(i)>p(i+1))

y2(t)=p(i)/y2(1);

y1(t)=g(i); %这一段循环是与找基频条件相对应的获取高次谐波幅值end

end

end

在编写完分析函数analysis后即可编写自动分析的主程序。

首先在Cool Edit中手动标定音调交界处的时间节点,得到了time向量

time=floor([0.096 0.267 1.767 2.234 2.706 3.146 3.606...

4.056 4.520

5.030 5.749 5.978 7.015 7.709 7.923...

8.028 8.490 8.959 9.454 9.852 10.125 10.356...

10.565 10.822 11.292 11.741 12.284 12.741...

13.269 13.758 14.315 14.939 15.432]/16.384*N);

“/16.384*N”中16.384是fmt.wav的总长度,N为fmt.wav数据点的总数,这一项是为了将时间转换成对应的数据点数,由于点的个数必须是整数,因此用floor函数进行取整。在得到了对应音调交接处的点后就可以进行编程了,用循环一个一个音调分析。程序如下:

Test5.m

clear;clc;

wave=wavread('fmt.wav'); %读入文件

N=length(wave); %确定数据总数

time=floor([0.096 0.267 1.767 2.234 2.706 3.146 3.606...

4.056 4.520

5.030 5.749 5.978 7.015 7.709 7.923...

8.028 8.490 8.959 9.454 9.852 10.125 10.356...

10.565 10.822 11.292 11.741 12.284 12.741...

13.269 13.758 14.315 14.939 15.432]/16.384*N); %节点向量

fs=N/16.384; %确定数据的抽样频率

n=length(time);

for k=1:n;

if k==1

temp=wave([1:time(k)-1]);

else

temp=wave([time(k-1):time(k)-1]);

%将第k个音调数据存入temp矩阵

end

temp=repmat(temp,1000,1); %将数据重复1000次

[F(k,1:7) U(k,1:7)]=analysis(temp,fs);

%将每个音调的处理结果分别保存,F保存频率,U保存幅值

end

运行后的结果见F和U的表格,见附录

第三部分基于傅里叶级数的音乐合成

3.1 用2.3分析出来的结果重新加谐波

基频329.1Hz 幅值为0.05401

再次完成east3

只需将east3.m程序中的波形幅度矩阵

m=[1 0.3 0.2]

改为

m=[0.05401 0.07676 0.04841 0.0519 0.005709 0.01923 0.006791 0.007326];

即可

3.2 通过2.4提取的吉他音调信息弹奏《东方红》

根据2.4分析的结果可以提取出吉他的音调信息,以下所用的音调信息用最接近的频率来近似。而所给信息中缺少523.25和587.33的数据,因此用它们的一般来近似

将1.4中的程序改为

Test6.m

fs=8000; %抽样频率

f=[523.25 523.25 587.33 392 349.23 349.23 293.66 392];

%各个乐音对应的频率

time=fs*[1/2,1/4,1/4,1,1/2,1/4,1/4,1]; %各个乐音的抽样点数

N=length(time); %这段音乐的总抽样点数

east=zeros(1,N); %用east向量来储存抽样点

n=1;

for num=1:N %利用循环产生抽样数据,num表示乐音编号

t=1/fs:1/fs:(time(num))/fs; %产生第num个乐音的抽样点

P=zeros(1,time(num)); %P为存储包络数据的向量

L=(time(num))*[0 1/5 333/1000 333/500 1];

%包络线端点对应的横坐标

T=[0 1.5 1 1 0]; %包络线端点对应的纵坐标

s=1;

b=1:1:time(num); %产生包络线抽样点

for k=1:4

P(s:L(k+1)-1)=(T(k+1)-T(k))/(L(k+1)-L(k))*(b(s:L(k+1)-1)-L(k+1)*ones(1,L(k+1)-s)) +T(k+1)*ones(1,L(k+1)-s);

%包络线直线方程通式

s=L(k+1);

end

m=[1 0.307149693 0 0.057298602 0.075386387 0 0;...

1 0.307149693 0 0.05729860

2 0.075386387 0 0;...

1 0.205838324 0.157080813 0 0.08891702

2 0 0.06597751;...

1 0.108616595 0.069072356 0 0 0 0;...

1 0.275786539 0.175812244 0 0.05603520

2 0 0;...

1 0.275786539 0.175812244 0 0.05603520

2 0 0;...

1 0.52030544 0 0 0.05280271 0.09594026 0;...

1 0.108616595 0.069072356 0 0 0 0]; %波形幅值矩阵

ss=zeros(1,length(t));

for i=1:7

ss=ss+m(num,i)*sin(2*i*pi*f(num)*t); %加谐波

end

east(n:n+time(num)-1)=ss.*P(1:time(num));

%给第num个乐音加上包络

n=n+time(num);

end

sound(2*east,8000);

plot(east);

运行后可以听出声音更加真实了。

实验收获

我们没有学过 matlab。可以说是从头到尾都是自学,做这样一个音乐,花时间最多的就是去学习matlab的一些语言用法函数用法。现在网络发达,借助网络,我们就可以学到了很多东西。

Matlab是一个很强大的科学工具,能够学会并充分利用这样一个强大的工具对以后我们的学习有很大的帮助。

F:

matlab音乐合成葫芦娃

目录 音乐合成实验................................................................................................. 错误!未定义书签。 摘要: (1) 第一部分简单的合成音乐 (1) 1.1合成《葫芦娃》 (1) 1.2 除噪音,加包络 (5) 1.3改变程序,实现1.2中的音乐升高和降低一个八度 (8) 1.4在1.2的音乐中加入谐波 (9) 摘要: 本文共有三大部分:第一部分,简单的音乐合成;第二部分,用傅里叶变换分析音乐;第三部分,基于傅里叶级数的音乐合成。由潜入深,一步一步分析了用MATLAB进行音乐合成的过程。通过本实验达到了加深对傅里叶级数和傅里叶分析的理解,熟悉对MATLAB 基本使用的目标。 第一部分简单的合成音乐 1.1 合成《葫芦娃》 根据《葫芦娃》第一小节的简谱和十二平均律计算出该小节每个乐音的频率,在MATLAB中生成幅度为1,抽样频率为8kHz的正弦信号表示这些乐音,用sound播放合成的音乐

而在MATLAB中表示乐音所用的抽样频率为fs=8000Hz,也就是所1s钟内有8000个点,抽样点数的多少就可表示出每个乐音的持续时间的长短。用一个行向量来存储这段音乐对应的抽样点,在用sound函数播放即可。 clear all;clc; freq=8000; %抽样频率 T=1/freq; pattime=0.5; %节拍的时间 note2=0:T:2*pattime; note4=0:T:1*pattime; note8=0:T:0.5*pattime; note_1=261.63; %各个音乐对应的频率 note_2=293.67; note_3=329.63; note_5=391.99; note_6=440; note_7=493.88; note_1b=523.25; wave1=sin(2*pi*note_1*note4); %各个音符所对应的节拍 wave2=sin(2*pi*note_1*note4); wave3=sin(2*pi*note_3*note2); wave4=sin(2*pi*note_1*note4); wave5=sin(2*pi*note_1*note4); wave6=sin(2*pi*note_3*note2); wave7=sin(2*pi*note_6*note4); wave8=sin(2*pi*note_6*note4); wave9=sin(2*pi*note_6*note8); wave10=sin(2*pi*note_5*note8); wave11=sin(2*pi*note_6*note4); wave12=sin(2*pi*note_5*note4);

MATLAB实验报告50059

实验一MATLAB操作基础 实验目的和要求: 1、熟悉MATLAB的操作环境及基本操作方法。 2、掌握MATLAB的搜索路径及设置方法。 3、熟悉MATLAB帮助信息的查阅方法 实验内容: 1、建立自己的工作目录,再设置自己的工作目录设置到MA TLAB搜索路径下,再试 验用help命令能否查询到自己的工作目录。 2、在MA TLAB的操作环境下验证课本;例1-1至例1-4,总结MATLAB的特点。 例1-1

例1-2 例1-3 例1-4

3、利用帮助功能查询inv、plot、max、round等函数的功能。 4、完成下列操作: (1)在matlab命令窗口输入以下命令: x=0:pi/10:2*pi; y=sin(x); (2)在工作空间窗口选择变量y,再在工作空间窗口选择回绘图菜单命令或在工具栏中单击绘图命令按钮,绘制变量y的图形,并分析图形的含义。

5、访问mathworks公司的主页,查询有关MATLAB的产品信息。 主要教学环节的组织: 教师讲授实验目的、开发环境界面、演示实验过程,然后同学上机练习。 思考题: 1、如何启动与退出MA TLAB集成环境? 启动: (1)在windows桌面,单击任务栏上的开始按钮,选择‘所有程序’菜单项,然后选择MA TLAB程序组中的MA TLABR2008b程序选项,即可启动 MATLAB系统。 (2)在MA TLAB的安装路径中找到MA TLAB系统启动程序matlab.exe,然后运行它。 (3)在桌面上建立快捷方式后。双击快捷方式图标,启动MA TLAB。 退出: (1)在MA TLAB主窗口file菜单中选择exitMATLAB命令。 (2)在MA TLAB命令窗口中输入exit或quit命令。 (3)单击MATLAB主窗口的关闭按钮。 2、简述MATLAB的主要功能。 MATLAB是一种应用于科学计算领域的数学软件,它主要包括数值计算和符 号计算功能、绘图功能、编程语言功能以及应用工具箱的扩展功能。 3、如果一个MATLAB命令包含的字符很多,需要分成多行输入,该如何处理?

matlab音乐处理合成实验报告

MATLAB高级编程与工程应用语音合成综合实验 姓名: 班级: 学号: 日期:

1.2.1 简单的合成音乐 (1) 请根据《东方红》片断的简谱和“十二平均律”计算出该片断中各个乐音的频率,在MATLAB 中生成幅度为1 、抽样频率为8kHz 的正弦信号表示这些乐音。请用sound 函数播放每个乐音,听一听音调是否正确。最后用这一系列乐音信号拼出《东方红》片断,注意控制每个乐音持续的时间要符合节拍,用sound 播放你合成的音乐,听起来感觉如何 由“十二平均律”计算得到各个乐音的频率: “5”——“C”: “6”——“D”: “1”——“F”: “2”——“G”:392Hz “6.”频率是“6”的一半: 代码:() f=8000; T=1/f; t8=0:T:1*; t4=0:T:2*; t2=0:T:4*; t1=0:T:8*; part1=sin(2*pi**t4); part2=sin(2*pi**t8); part3=sin(2*pi**t8); part4=sin(2*pi**t2); part5=sin(2*pi**t4); part6=sin(2*pi**t8); part7=sin(2*pi**t8); part8=sin(2*pi**t2); total=[part1,part2,part3,part4,part5,part6,part7,part8]; sound(total); 试听发现,合成后的音乐基本保持了《东方红》的音调,但声音比较沉闷,相邻乐音之间有比较明显的“啪”的杂音。 (2) 你一定注意到(1) 的乐曲中相邻乐音之间有“啪”的杂声,这是由于相位不连续产生了高频分量。这种噪声严重影响合成音乐的质量,丧失真实感。为了消除它,我们可以用图所示包络修正每个乐音,以保证在乐音的邻接处信号幅度为零。此外建议用指数衰减的包络来表示。 首先尝试用折线包络,编写函数生成所需折线: function envelope = envelope_line(t) envelope(1:floor(t/8)) = linspace(0,1,floor(t/8)); envelope(floor(t/8)+1:floor(t/4)) = linspace(1,,floor(t/4)-floor(t/8))); envelope(floor(t/4)+1:floor(3*t/4)) = linspace,,floor(t*3/4)-floor(t/4)); envelope(floor(3*t/4)+1:t) = linspace,0,floor(t)-floor(3*t/4)); 对中的部分代码进行修改,调用envelope_line实现折线包络:() part1=sin(2*pi**t4).*envelope_line(t4);

Matlab音乐合成实验报告

音乐合成实验 目录 音乐合成实验 (1) 摘要: (1) 第一部分简单的合成音乐 (2) 1.1合成《东方红》 (2) 1.2 除噪音,加包络 (3) 1.3改变程序,实现1.2中的音乐升高和降低一个八度 (8) 1.4在1.2的音乐中加入谐波 (9) 1.5自选音乐合成——《两只老虎》 (10) 第二部分用傅里叶变换分析音乐 (11) 2.1载入fmt.wav并播放 (11) 2.2载入文件Guitar.mat,处理原始数据realwave (11) 2.3分析wave2proc的基波和谐波 (13) 2.4自动分析fmt.wav的音调和节拍 (16) 第三部分基于傅里叶级数的音乐合成 (19) 3.1 用2.3分析出来的结果重新加谐波 (19) 3.2 通过2.4提取的吉他音调信息弹奏《东方红》 (19) 实验收获 (21) 摘要:

本文共有三大部分:第一部分,简单的音乐合成;第二部分,用傅里叶变换分析音乐;第三部分,基于傅里叶级数的音乐合成。由潜入深,一步一步分析了用MATLAB 进行音乐合成的过程。通过本实验达到了加深对傅里叶级数和傅里叶分析的理解,熟悉对MATLAB 基本使用的目标。 第一部分 简单的合成音乐 1.1 合成《东方红》 根据《东方红》第一小节的简谱和十二平均律计算出该小节每个乐音的频率,在MATLAB 中生成幅度为1,抽样频率为8kHz 的正弦信号表示这些乐音,用sound 播放合成的音乐 由图可知《东方红》的曲调定为F ,即1=F ,对应的频率为349.23Hz ,据此可以计算出其他乐音的频率,例如5对应的频率为 7/125349.232523.25f =?=,一次类推计算出第一小节各乐音对应的频率为: 乐音 5 5 6 2 1 1 6 2 在确定了各乐音的频率之后需要确定每个乐音的持续时间。每小节有两拍, 一拍的时间是0.5s ,因此各乐音的持续时间为: 乐音 5 5 6 2 1 1 6 2 而在MATLAB 中表示乐音所用的抽样频率为fs=8000Hz ,也就是所1s 钟内有8000个点,抽样点数的多少就可表示出每个乐音的持续时间的长短。用一个行向量来存储这段音乐对应的抽样点,在用sound 函数播放即可。 根据以上分析在MATLAB 中编写如下程序: sound_1_1.m

matlab实验报告

实验一小球做自由落体运动内容:一小球竖直方向做自由落体,并无损做往返运动。程序: theta=0:0.01:2*pi x=cos(theta) y=sin(theta) l=1 v=1 while l<10 for t=1:10 y=y+(-1)^l*v*t plot(x,y,[-1,1],[-56,2],'.') axis equal pause(0.1) end l=l+1 end 结果:

-50 -40 -30 -20 -10 收获:通过运用小球自由落体规律,及(-1)^n 来实现无损往 返运动! 实验二 旋转五角星 内容:一个五角星在圆内匀速旋转 程序:x=[2 2 2 2 2 2] y=[0 4/5*pi 8/5*pi 2/5*pi 6/5*pi 0] y1=2*sin(y) x1=2*cos(y) theta=0:4/5*pi:4*pi

x2=2*cos(theta) y2=2*sin(theta) plot(x,y,x1,y1,x2,y2) axis equal theta1=theta+pi/10 x2=2*cos(theta1) y2=2*sin(theta1) plot(x2,y2) axis equal theta=0:4/5*pi:4*pi for rot=pi/10:pi/10:2*pi x=2*cos(theta+rot) y=2*sin(theta+rot) plot(x,y) pause(0.1) end 结果:

-2 -1.5-1-0.500.51 1.52 -2-1.5-1-0.500.511.5 2 收获:通过theta1=theta+pi/10,我们可以实现五角星在圆内匀速 旋转! 实验三 转动的自行车 内容:一辆自行车在圆内匀速转动 程序:x=-4:0.08:4; y=sqrt(16-x.^2); theta1=-pi/2:0.01*pi:3*pi/2; x3=0.5*cos(theta1); y3=0.5*sin(theta1); theta=-pi/2+0.02*pi for k=1:100

参考答案Matlab实验报告

实验一 Matlab基础知识 一、实验目的: 1.熟悉启动和退出Matlab的方法。 2.熟悉Matlab命令窗口的组成。 3.掌握建立矩阵的方法。 4.掌握Matlab各种表达式的书写规则以及常用函数的使 用。 二、实验内容: 1.求[100,999]之间能被21整除的数的个数。(rem) 2.建立一个字符串向量,删除其中的大写字母。(find) 3.输入矩阵,并找出其中大于或等于5的元素。(find) 4.不采用循环的形式求出和式 63 1 2i i= ∑ 的数值解。(sum) 三、实验步骤: ●求[100,199]之间能被21整除的数的个数。(rem) 1.开始→程序→Matlab 2.输入命令: ?m=100:999; ?p=rem(m,21); ?q=sum(p==0) ans=43 ●建立一个字符串向量,删除其中的大写字母。(find) 1.输入命令:

?k=input('’,’s’); Eie48458DHUEI4778 ?f=find(k>=’A’&k<=’Z’); f=9 10 11 12 13 ?k(f)=[ ] K=eie484584778 ●输入矩阵,并找出其中大于或等于5的元素。(find) 1.输入命令: ?h=[4 8 10;3 6 9; 5 7 3]; ?[i,j]=find(h>=5) i=3 j=1 1 2 2 2 3 2 1 3 2 3 ●不采用循环的形式求出和式的数值解。(sum) 1.输入命令: ?w=1:63; ?q=sum(2.^w) q=1.8447e+019

实验二 Matlab 基本程序 一、 实验目的: 1. 熟悉Matlab 的环境与工作空间。 2. 熟悉M 文件与M 函数的编写与应用。 3. 熟悉Matlab 的控制语句。 4. 掌握if,switch,for 等语句的使用。 二、 实验内容: 1. 根据y=1+1/3+1/5+……+1/(2n-1),编程求:y<5时最大n 值以及对应的y 值。 2. 编程完成,对输入的函数的百分制成绩进行等绩转换,90~100为优,80~89为良,70~79为中,60~69为及格。 3. 编写M 函数文件表示函数 ,并分别求x=12和56时的函数值。 4. 编程求分段函数 2226;03 56;0532 1;x x x x y x x x x x x x +-<≠=-+≤<≠≠-+且且及其它,并求输入x=[-5.0,-3.0,1.0,2.0,2.5,3.0,3.5]时的输出y 。 三、 实验步骤: 根据y=1+1/3+1/5+……+1/(2n-1),编程求:y<5时最大n 值以及对应的y 值。 1. 打开Matlab ,新建M 文件 2. 输入命令: 51022-+x

Matlab音乐合成实验报告

课程设计《音乐合成》实验报告 专业:测控技术与仪器 班级:测控11-2 班 姓名:谷晓峰 学号: 11034010219 指导教师:贺婷 广东石油化工学院计算机与电子信息学院

信号与系统课程设计 -------利用matlab合成音乐 一、实验目的 1. 熟悉MATLAB的软件和语言指令的使用; 2. 学习利用MATLAB进行连续信号的时域、频域分析; 3. 熟悉抽样信号与连续信号的区别。 二、实验内容 1.请根据《画心》片断的简谱和“十二平均律”计算出该片断中各个乐音的频率,在MATLAB 中生成幅度为1抽样频率为8kHz 的正弦信号表示这些乐音。请用sound 函数播放每个乐音,听一听音调是否正确。最后用这一系列乐音信号拼出《画心》片断,注意控制每个乐音持续的时间要符合节拍,用sound 播放你合成的音乐,听起来感觉如何?并用图显示生成的音乐信号。 相关知识: ①《画心》完整曲谱,实验时从中随机截取几节用于编程。

②利用十二平均律计算频率以及相关音乐知识。 如图1,其中错误!未找到引用源。,错误!未找到引用源。,错误!未找到引用源。相当于错误!未找到引用源。的二次谐波,二者是倍频的关系。从A 到A1共有12个键,7个白色键,5个黑色键。中间这些频率值得计算规律为相邻音倍乘系数错误!未找到引用源。。即错误!未找到引用源。,别的依次类推。 图1 钢琴键盘 图1中各键对应的频率如下表: bG表示的F升高半音,在乐谱中用#表示。或者G降低半音,用b表示。乐谱这中的4/4表示每小节有四拍,一个1/4音符的持续时间为一拍,一拍大概0.5s左右。 eg: y=0*t; %初始化 y(t<0.25)=sin(440*2*pi*t(t<0.25)); %第一个音 5,持续时间0.25s y(0.25

基于MATLAB软件的音乐合成毕业设计论文

毕业设计(论文) 基于MATLAB的软件的音乐合成 Music Synthesis Based On MATLAB Software

毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。 作者签名:日期: 指导教师签名:日期: 使用授权说明 本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名:日期:

学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。 作者签名:日期:年月日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 涉密论文按学校规定处理。 作者签名:日期:年月日 导师签名:日期:年月日

matlab实验报告

Matlab实验报告 实验二图像处理 一、实验目的 (1)通过应用MA TLAB语言编程实现对图像的处理,进一步熟悉MATLAB软件的编程及应用; (2)通过实验进一步掌握图像处理的基本技术和方法。 二、实验内容及代码 ㈠.应用MA TLAB语言编写显示一幅灰度图像、二值图像、索引图像及彩色图像的程序,并进行相互之间的转换 首先,在matlab页面中的current directory下打开存放图像的文件夹。 1.显示各种图像 ⑴显示彩色图像: ①代码:>> mousetif=imread('tif.TIF'); >> image(mousetif) 显示截图: ②代码:>> mousetif=imread('tif.TIF'); >> imshow(mousetif) 显示截图:

③代码:mousetif=imread('tif.TIF'); subimage(mousetif) 显示截图: 显示截图:

⑵显示二值图像 ①代码:>> I=imread('单色bmp.bmp'); >> imagesc(I,[0 2]) 显示截图: ②代码:>> I=imread('单色bmp.bmp');

>> imshow(I,2) 显示截图: ③代码:>> I=imread('单色bmp.bmp'); >> subimage(I) 显示截图:

⑶显示灰度图像 ①代码:>> I1=imread('256bmp.bmp'); >> imagesc(I1,[0,256]) 显示截图: 代码:>> I1=imread('256bmp.bmp'); >> colormap(gray); >> subplot(1,2,1); >> imagesc(I1,[0,256]); >> title('灰度级为[0 256]的mouse.bmp图'); >> subplot(1,2,2); >> imagesc(I1,[0,64]); >> colormap(gray); >> title('灰度级为[0 64]的mouse.bmp图'); 显示截图:

基于MATLAB的简单音乐合成

《数字信号处理》课程设计 说明书 设计题目:基于MATLAB 的简单音乐合成 姓名:_________________________________________ 专业年级:______________________________________ 学号:_________________________________________ 指导老师:______________________________________ 时间:2015 年 6 月25 日

《数字信号处理课程设计》任务书 指导老师(签名):

1设计基础.................................... 1.1 MATLAB软件简介.............................. 1.2乐曲解析.................................. 2设计与实现................................... 2.1 简单的音乐合成 ................................ 2.1.1原理分析 ................................ 2.1.2 Matlab 源代码 .............................. 2.1.3运行结果分析 ............................... 2.2除噪音,加包络................................. 2.2.1原理分析 ................................ 2.2.2 Matlab 源代码 .............................. 2.2.3运行结果分析 .............................. 2.3加谐波.................................... 2.3.1原理分析 ................................ 2.3.2 Matlab 源代码 .............................. 2.3.2运行结果分析 .............................. 3总结与体会................................... 4参考文献....................................

广州大学学生实验报告1 matlab 程序设计

广州大学学生实验报告 开课学院及实验室:机械与电气工程学院计算机楼 301室2014 年10 月30 日

2、MATLAB指令窗的基本操作 MATLAB指令窗给用户提供了最直接的交互界面,可用于输入和执行指令、显示指令运行结果、调试MATLAB程序等常用的MATLAB仿真计算功能。本实验掌握以下在指令窗执行的基本操作,达到熟悉使用指令窗的目的: (1)最简单的计算器使用方法:在MATLAB指令窗中,可按计算器的方式进行一般的数学计算,MATLAB的运算符的含义大致与常见的运算规则一致; (2)在指令窗中输入和生成矩阵:与一般的计算器不同,在MATLAB中可直接输入和生成矩阵。实际上,矩阵是MATLAB工作的基本元素。 (3)数值表述方法:在MATLAB中的大部分数值的表述方式与平常是相同的,需要注意的是在表示比较大的数时,MATLAB默认采用科学计数法显示; (4)变量命名规则:对于MATLAB变量命名规则,需要注意以下几点: a、变量名、函数名对字母大小写敏感 b、变量名的第一个字母必须是英文字母,后续可以是字母、数字、下划线 c、变量的有效时限:在变量定义赋值之后,会作为内存变量保存并显示在Workspace Browser中。因此,凡是显示在Workspace Browser中的变量 都是“有效”的,其后可以被调用,否则不能被调用。 d、对于像 等常用的数学常量,MATLAB定义了预定义变量与其对应,在使用时需多加留意。 e、复数和复数矩阵的表示方法。 (5)其他操作的操作要旨和操作技巧的运用。 3、计算结果的图形表示 计算结果可视化是MATLAB的主要组成部分,借助图形表现数据是十分常用的“数据表达手段”,尤其当数据量相当庞大时,因为图形可以表现数据内在联系和宏观特征。关于MATLAB绘图的基本方法在后续章节中详细讲述,本实验主要通过示例了解MATLAB绘图的基本功能。 4、Current Directory、路径设置器和文件管理 理解当前目录Current Directory和搜索路径的作用是正确使用MATLAB的关键环节。当前目录指的是当前MA TLAB工作的目录,MATLAB运行指令需要打开或者保存的文件,都首先在目录中查找或保存。搜索路径则是MATLAB工作时,需查找相应的文件、函数或变量所在的相关文件夹所在的路径。 在理解当前目录Current Directory和搜索路径的作用的基础上,也要掌握当前目录Current Directory和搜索路径的设置方法,这是正确使用MA TLAB 的必要步骤。 为了理解MATLAB当前目录Current Directory和搜索路径的作用,可以大致了解一下当用户从指令窗送入一个名为cow的指令后,MATLAB的“运作次序”: (1)MATLAB在内存中检查,看cow是不是变量;如果不是,进行下一步; (2)检查cow是不是内建函数;如果不是进行下一步; (3)在当前目录下,检查是否有名为cow的M文件存在;如果不是,进行下一步; (4)在MA TLAB搜索路径的其他目录下,检查是否有名为cow的M文件存在。

Matlab实验指导书(含答案)汇总

实验一:Matlab操作环境熟悉 一、实验目的 1.初步了解Matlab操作环境。 2.学习使用图形函数计算器命令funtool及其环境。 二、实验内容 熟悉Matlab操作环境,认识命令窗口、内存工作区窗口、历史命令窗口;学会使用format命令调整命令窗口的数据显示格式;学会使用变量和矩阵的输入,并进行简单的计算;学会使用who和whos命令查看内存变量信息;学会使用图形函数计算器funtool,并进行下列计算: 1.单函数运算操作。 求下列函数的符号导数 (1) y=sin(x); (2) y=(1+x)^3*(2-x); 求下列函数的符号积分 (1) y=cos(x); (2) y=1/(1+x^2); (3) y=1/sqrt(1-x^2); (4) y=(x-1)/(x+1)/(x+2); 求反函数 (1) y=(x-1)/(2*x+3); (2) y=exp(x); (3) y=log(x+sqrt(1+x^2)); 代数式的化简 (1) (x+1)*(x-1)*(x-2)/(x-3)/(x-4); (2) sin(x)^2+cos(x)^2; (3) x+sin(x)+2*x-3*cos(x)+4*x*sin(x); 2.函数与参数的运算操作。 从y=x^2通过参数的选择去观察下列函数的图形变化 (1) y1=(x+1)^2 (2) y2=(x+2)^2 (3) y3=2*x^2 (4) y4=x^2+2 (5) y5=x^4 (6) y6=x^2/2 3.两个函数之间的操作 求和 (1) sin(x)+cos(x) (2) 1+x+x^2+x^3+x^4+x^5 乘积 (1) exp(-x)*sin(x)

matlab实验报告

Matlab实验报告 ——定积分的近似计算 学生姓名: 学号: 专业:数学与应用数学专业

数学实验报告 实验序号:1001114030 日期:2012年10月20日 班级应一姓名陈璐学号1001114030 实验名称:定积分的近似运算 问题背景描述: 利用牛顿—莱布尼茨公式虽然可以精确地计算定积分的值,但它仅适合于被积分函数的原函数能用初等函数表达出来的情形。如果这点办不到或不容易办到, 这就有必要考虑近似计算的方法。在定积分的很多应用问题中,被积函数甚至没 有解析表达式,可能只是一条实验记录曲线,或者是一组离散的采样值,这时只 能应用近似方法去计算相应的定积分。 实验目的: 本实验将主要研究定积分的三种近似计算算法:矩形法、梯形法、抛物线发。对于定积分的近似数值计算,Matlab有专门函数可用。 实验原理与数学模型: 1.sum(a):求数组a的和。 2.format long:长格式,即屏幕显示15位有效数字。 3.double():若输入的是字符则转化为相应的ASCII码;若输入的是整型数之则转化为 相应的实型数值。 4.quad():抛物线法求数值积分。格式:quad(fun,a,b)。此处的fun是函数,并且

为数值形式,所以使用*、/、^等运算时要在其前加上小数点。 5.trapz():梯形法求数值积分。格式:trapz(x,y)。其中x为带有步长的积分区间;y为数 值形式的运算。 6.fprintf(文件地址,格式,写入的变量):把数据写入指定文件。 7.syms 变量1变量2……:定义变量为符号。 8.sym('表达式'):将表达式定义为符号。 9.int(f,v,a,b):求f关于v积分,积分区间由a到b。 10.subs(f,'x',a):将a的值赋给符号表达式f中的x,并计算出值。若简单地使用subs (f),则将f的所有符号变量用可能的数值代入,并计算出值。 实验所用软件及版本:Matlab 7.0.1

Matlab音乐合成实验报告(重大 通院)

重庆大学Matlab音乐合成实验报告 班级:实验班 指导老师:印勇 学生: 覃继良 20114909 学号:

音乐合成实验 介绍 本文共有三大部分:第一部分,简单的音乐合成;第二部分,用傅里叶变换分析音乐;第三部分,基于傅里叶级数的音乐合成。由潜入深,一步一步分析了用MATLAB 进行音乐合成的过程。通过本实验达到了加深对傅里叶级数和傅里叶分析的理解,熟悉对MATLAB 基本使用的目标。 第一部分 简单的合成音乐 1.1 合成《东方红》 根据《东方红》第一小节的简谱和十二平均律计算出该小节每个乐音的频率,在MATLAB 中生成幅度为1,抽样频率为8kHz 的正弦信号表示这些乐音,用sound 播放合成的音乐 由图可知《东方红》的曲调定为F ,即1=F ,对应的频率为349.23Hz ,据此可以计算出其他乐音的频率,例如5对应的频率为7/125349.232523.25f =?=,一次类推计算出第一小节各乐音对应的频率为: 在确定了各乐音的频率之后需要确定每个乐音的持续时间。每小节有两拍,一拍的时间是0.5s ,因此各乐音的持续时间为: 而在MATLAB 中表示乐音所用的抽样频率为fs=8000Hz ,也就是所1s 钟内有8000个点,抽样点数的多少就可表示出每个乐音的持续时间的长短。用一个行向量来存储这段音乐对应的抽样点,

在用sound函数播放即可。 根据以上分析在MATLAB中编写如下程序: east1.m clear;clc; fs=8000; %抽样频率 f=[523.25 523.25 587.33 392 349.23 349.23 293.66 392]; %各个乐音对应的频率 time=fs*[1/2,1/4,1/4,1,1/2,1/4,1/4,1]; %各个乐音的抽样点数 N=length(time); %这段音乐的总抽样点数 east=zeros(1,N); %用east向量来储存抽样点 n=1; for num=1:N %利用循环产生抽样数据,num表示乐音编号 t=1/fs:1/fs:time(num)/fs; %产生第num个乐音的抽样点 east(n:n+time(num)-1)=sin(2*pi*f(num)*t); %抽样点对应的幅值 n=n+time(num); end sound(east,8000); %播放音乐 在MATLAB中运行east1.m,播放出了《东方红》的第一段,但是可以听出效很不好,只能听出具有《东方红》的调子而已。 图1-1 由图1-1我们可以看到,每一个调子并没有能够区分出来,就是连续一片的。幅度也是相当的,都是1。

基于Matlab的MP3播放器

基于Matlab的MP3播放器 1.概述 MP3的全称为MPEG1(Moving Picture Experts Group) Layer – 3音频文件。它根据压缩质量和编码复杂程度划为三层,Layer –1 、Layer –2 、Layer –3 ,且分别对应MP1 、MP2\ MP3 这三种声音文件,并根据不同的用途,使用不同层次的编码。MPEG音频的层次越高,编码器越复杂,压缩率也越高,MP3的压缩率则高达10:1 – 12:1。 MA TLAB 是国际上公认的最优秀的科技应用软件,它在数据分析和处理功能都是很强大,利用它可以灵活方便地处理音频信号。本文将使用matlab对MP3进行解码,做一个简易的MP3播放器。 2.MP3文件格式 MP3文件大体分为三部分:TAG_V2(ID3V2),frame,TAG_V1(ID3V1) 一个MPEG音频文件是许多的称为帧的较小部分组成的,通常,帧是独立的组成部分,每个帧都拥有之间的头和音频信息,没有文件头。所以我们可以剪切MPEG文件的任何部分并且能够正常播放。但在LayerIII中就并不总是正确的。 2.1、帧头格式 下面是一个头内容图示,使用字符A到M表示不同的区域

AAAAAAAAAAA BB CC D EEEE FF G H II JJ K L MM A表示帧同步,都为1,长度为11; B 表示MPEG音频版本ID (00 – MPEG 2.5; 01 –保留;10 – MPEG 2; 11 – MPEG 1); C 表示Layer描述,(00 –保留;01- LayerIII;10 – LayerII;11 - LayerI); D 表示校验位(0 有跟16位CRC校验位;1 无校验位); E 位率索引,长度为4,对不同的版本,不同层索引值表示不同的位率;单位Kbit

matlab7.0x课后习题答案

1、利用基本矩阵产生3*3和15*8的单位矩阵、全1矩阵、全0矩阵、均匀分布随机阵([-1,1]之间)、正态分布随机阵(均值为1,方差为4)。 解: A1=eye(3); A2=ones(3); A3=zeros(3); A4=2*rand(3)-1; A5=2*randn(3)+1; B1=eye(15,8); B2=ones(15,8); B3=zeros(15,8); B4=2*rand(15,8)-1; B5=2*randn(15,8)+1; 结果:由于数据是随机产生的,所以在没有给出运行结果。 2、利用diag等函数产生下列矩阵: a=[0 0 8;0 -7 5;2 3 0] b=[2 0 4;0 5 0;7 0 8] 然后利用reshape函数将它们变换成行向量。 解: 产生a的程序: b=diag([8 -7 2]); c=b+diag([5 3],-1); a=fliplr(c) 产生b的程序: s=[2 2 8]; t=[4 3 7]; v=diag(s); p=diag(t)+fliplr(v); b=fliplr(p) 运行结果: a = 0 0 8 0 -7 5 2 3 0 b = 2 0 4 0 5 0 7 0 8 利用reshape函数将它们变换成行向量:reshape(a,1,9) ans = 0 0 2 0 -7 3 8 5 0 3、产生一均匀分布在(-5,5)之间的随机阵(50*2),要求精确到小数点后一位。 解: A=5-round(100*rand(50,2))/10 部分数据结果: A = 2.4000 4.2000 -0.1000 2.7000 -4.6000 -3.3000

matlab音乐合成报告

MATLAB音乐合成综合实验 学院: 班级: 指导老师:吴宪祥 同做者: 二0一六年十二月

摘要 本实验共有三部分:1.简单的音乐合成;2.用傅里叶变换分析音乐;3.基于傅里叶级数的音乐合成。一步一步分析了用MATLAB进行音乐合成的过程。通过本实验达到加深对傅里叶级数和傅里叶分析的理解,熟悉对MATLAB基本使用的目标。该实验采用MATLAB软件仿真来实现。首先,通过编程对一段真实的音乐进行分析、处理,求得这段音乐的基频、谐波分量、等数据;然后,通过对乐理的研究,根据分析中求得的数据编写程序,进行基于傅里叶分析的音乐合成设计,并设计了图形用户界面。

目录 1.绪论 1.1 引言 (3) 1.2 实验要求 (3) 1.3 实验原理 (3) 2.简单的合成音乐 2.1 乐理知识介绍 (4) 2.2 利用MATLAB实现音乐合成器,生成 WAV文件 (5) 2.3 除噪音,加包络 (5) 2.4 音乐升高和降八度 (9) 2.5 加入谐波 (9) 3.用傅里叶变换分析音乐 3.1 载入fmt.wav并播放 (11) 3.2 处理realware (11) 3.3 分析wave2proc的基波和谐波 (13) 3.4 自动分析fmt.wav的音调和节拍 (16) 4.基于傅里叶级数的音乐合成 4.1 重新加谐波 (17) 4.2 通过音调信息弹奏《送别》 (19) 5.制作GUI界面 (20) 6.实验难点及问题 (21) 7.实验收获 (22)

1.绪论 1.1 引言 信号与系统的概念及分析方法广泛应用于通信、自动控制、航空航天、电子信息、地震学、生物工程等领域,因此“信号与系统”是一门电子信息学科相关专业的主干技术课程。MATLAB 是国际上公认的优秀的科技应用软件,随着版本的不断升级,内容也在不断扩充。基于MATLAB 的音乐分析与合成实验是针对“信号与系统”课程的重点和难点之一的傅里叶变换和傅里叶级数等内容而设计的。由于该实验是真实音乐的实际应用,可以增进对傅里叶级数和傅里叶变换的理解,加深对信号分析工程应用的理解,提高在信号分析领域的应用能力。 1.2 实验要求 1、3-5人一组,选择不同乐曲,利用MATLAB 实现音乐合成器,生成WAV 文件; 2、给乐音加包络消噪; 3、实现音乐的升八度和降八度; 4、在音乐中添加谐波; 5、用傅里叶级数分析音乐的基频、音调和节拍; 6、模仿一些常用乐器(如钢琴、吉他等)实现音乐合成; 7、设计GUI 界面; 8、提交设计报告。 1.3实验原理 傅里叶变换建立了信号频谱的概念。所谓傅里叶分析即分析信号的频谱(频率构成)、频带宽度等。要想合成出一段音乐,就要了解该段音乐的基波频率、谐波构成等。因此,必须采用傅里叶变换这一工具。对于连续时间信号f(t),其傅里叶变换为: dt jwt e t f w ?∞ ∞--=)(F )( 由于其变换两边的函数f (t) 和F (w )都是连续函数,不适合于计算机处理。MATLAB 语言提供了符号函数FOURIER 来实现傅里叶变换,但该函数需要信号的解析表达式。而工程应用中经常需要对抽样数据进行傅里叶分析,这种情况下往往无法得到信号的解析表达式,必须采用傅里叶变换的数值计算方法。

matlab实验报告

MATLAB 数学实验报告 指导老师: 班级: 小组成员: 时间:201_/_/_

Matlab第二次实验报告 小组成员: 1题目:实验四,MATLAB选择结构与应用实验 目的:掌握if选择结构与程序流程控制,重点掌握break,return,pause语句的应用。 问题:问题1:验证“哥德巴赫猜想”,即:任何一个正偶数(n>=6)均可表示为两个质数的和。要求编制一个函数程序,输入一个正偶数,返回两个质数的和。 问题分析:由用户输入一个大于6的偶数,由input语句实现。由if判断语句判断是否输入的数据符合条件。再引用质数判断函数来找出两个质数,再向屏幕输出两个质数即可。 编程:function [z1,z2]=gede(n); n=input('please input n')

if n<6 disp('data error'); return end if mod(n,2)==0 for i=2:n/2 k=0; for j=2:sqrt(i) if mod(i,j)==0 k=k+1; end end for j=2:sqrt(n-i) if mod(n-i,j)==0 k=k+1; end end if k==0 fprintf('two numbers are') fprintf('%.0f,%.0f',i,n-i) break end

end end 结果分析: 如上图,用户输入了大于6的偶数返回两个质数5和31,通过不断试验,即可验证哥德巴赫猜想。 纪录:if判断语句与for循环语句联合嵌套使用可使程序结构更加明晰,更快的解决问题。 2题目:实验四,MATLAB选择结构与应用实验 目的:用matlab联系生活实际,解决一些生活中常见的实际问题。

基于MATLAB的简单音乐合成仿真设计

本科生毕业论文(设计)基于MATLAB的简单音乐合成仿真设计

学士学位论文原创性声明 本人郑重声明:所呈交的论文(设计)是本人在指导老师的指导下独立进行研究,所取得的研究成果。除了文中特别加以标注引用的内容外,本论文(设计)不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式表明。本人完全意识到本申明的法律后果由本人承担。 学位论文作者签名(手写):签字日期:年月日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权可以将本论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 (请在以上相应方框内打“√”) 学位论文作者签名(手写):指导老师签名(手写): 签字日期:年月日签字日期:年

摘要 科学技术的发展使得社会生活越来越趋于信息化和数字化,在此基础上语音信号也可以基于数字信号处理技术和语音学相关知识进行信息化处理,此类技术因应用性广便捷性高受到社会的广泛关注,已成为信息科学工程与研究领域的核心技术,被越来越多的高科技产业广泛使用。计算机合成音乐也在其基础上得以迅速普及,而且理论上可以创造出任何一种声音。 MATLAB是一种用于数据分析和处理的计算机应用软件,它可以将语音文件进行信息化处理转化为离散的数据文件,再通过内置强大的矩阵运算能力如数字滤波、时域和频域分析、傅里叶变换、时域和频域分析、声音合成以及各种图形的呈现等处理数据。利用MATLAB自带的功能函数可以快捷而又方便地完成语音信号的处理和分析以及信号的可视化,使人机交互更加便捷。音乐可视为不同频率与振幅的正弦波叠加并加以不同包络所形成的信号,它的这个特点使得MATLAB的处理有了可能,通过处理不同的音频MATLAB可以进行简单的音乐合成。 本文主要是基于MATLAB环境下的音乐合成研究,首先基于相关的处理函数合成简单的音乐,并且对音乐进行降噪、升降度和加谐波等处理;然后基于傅里叶变换分析处理后的音乐频谱;最后根据傅里叶级数的原理来再次合成音乐。 关键词:音乐合成;MATLAB;傅里叶分析

相关主题
文本预览
相关文档 最新文档