好文档 - 专业文书写作范文服务资料分享网站

Matlab音乐合成实验报告

天下 分享 时间: 加入收藏 我要投稿 点赞

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

2.1

载入fmt.wav并播放

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

wave=wavread('fmt.wav'); sound(wave) 这段音乐听起来比之前合成的音乐更加真实,因为里边含有丰富的谐波。

2.2 载入文件Guitar.mat,处理原始数据realwave

载入文件Guitar.mat,分析wave2proc是怎么由realwave得到的。利用 load Guitar.mat;载入并用plot函数将realwave、wave2proc分别画出,得到以下两幅图

0.250.20.150.10.050-0.05-0.1-0.15-0.2realwave050100150200250

0.25wave2proc0.20.150.10.050-0.05-0.1-0.15050100150200250

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

sound_2_2.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); 个周期的对应点分别求和 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); %将所给的数据绘出,蓝色

运行后的结果为:

0.250.20.150.10.050-0.05-0.1-0.15050100150200250

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

2.3 分析wave2proc的基波和谐波

为了分析wave2proc的基波和谐波,可以对wave2proc进行傅里叶变换,得到wave2proc的幅值谱,在频谱图上的第一个突出的波峰对应的频率即为wave2proc基频,利用help fft学习了MATLAB中快速傅里叶变换函数fft的用法,编写了如下程序:

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)))

运行后得到的结果为

0.080.070.060.050.040.030.020.01005001000150020002500300035004000

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

0.080.070.060.050.040.030.020.01005001000150020002500300035004000

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

利用repmat函数可以将wave2proc在时域重复。将程序修改为 sound_2_3.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)))

运行后得到的幅值谱为

0.080.070.060.050.040.030.020.010 05001000150020002500300035004000

Matlab音乐合成实验报告

第二部分用傅里叶变换分析音乐2.1载入fmt.wav并播放利用wavread函数载入,用sound函数播放,程序如下:sound_2_1.mwave=wavread('fmt.wav');sound(wave)这段音乐听起来比之前合成的音乐更加真实,因为里边含有丰富的谐波。2.2
推荐度:
点击下载文档文档为doc格式
2qdjt24dmf79c964hjsm5kaxd91bpl00krm
领取福利

微信扫码领取福利

微信扫码分享