实验目的与意义
- 掌握matlab中生成声音波形的方法
- 掌握matlab中函数的定义、调用
- 掌握对非周期离散时间信号进行傅里叶变换的运算过程以及绘出幅度谱和相位谱的方法
实验过程
- 定义singletone_melody函数,其作用为传入乐谱x,返回声音波形y %% 定义函数singletone_melody,传入乐谱x,返回声音波形y
function y = singletone_melody(x)
%设定简谱对应频率,根据十二平均律,以A4=440Hz为基准
index = -99:12;
wave = [];
%设定声音持续时间
BeatTime = 0.5;
%设定采样率为2000Hz
fs = 2000;
%求乐谱长度
note_length = length(x);
for note_index = 1:note_length
note_freq = 4402^(x(note_index)/12); note_wave = cos(2pinote_freq[1:BeatTime*fs]/fs);
wave = [wave,note_wave];
end
y = wave;
end
- 根据所选歌曲《北京欢迎你(片段)》的简谱编写乐谱tune %编写乐谱
tune = [-5 -2 -5 -7 -5 -7 -5 -99 -5 -7 -12 -9 -5 -7 -99 …
-7 -9 -12 -9 -7 -5 -2 -7 -5 0 -2 -12 -7 -9 -99 …
-7 -9 -12 -9 -7 -5 -2 -7 -5 0 -2 0 -5 -99 …
-7 -5 -7 -9 -2 0 -7 -99 -12 -5 -5 -99 -7 -99 -5 -99 -99 -99 …
-5 -2 3 -2 0 -99 0 -2 -5 -5 -2 -2 -99 …
-2 -5 -2 0 3 3 -2 -5 -7 -2 -2 -5 -5 -99 …
-5 -2 3 -2 0 -99 3 5 3 -2 -5 -2 3 0 -99 …
-5 -7 -5 -2 7 5 -99 3 -99 3 3];
- 调用singletone_melody函数,传入乐谱tune,生成声音波形wave并导出wav格式音频文件 %调用singletone_melody函数,生成声音波形并导出
wave = singletone_melody(tune);
audiowrite("exp3_ZhangNuo.wav",wave,2000);
%播放
sound(wave,2000);
- 对声音波形wave进行傅里叶变换,因为wave是非周期离散时间信号,所以使用公式
%对声音波形进行傅里叶变换
p = [];
n = 1:1:length(wave);%列标
w = 0:0.0004*pi:pi;%频率分辨率=2000/2*0.0004=0.4
p = exp(-1i*n'*w);%exp(-jΩn)
wave_f = wave*p;%傅里叶变换结果
5. 使用subplot函数在同一个窗口中绘出幅度谱和相位谱。幅度谱中标出的点的横坐标为tune中出现的十种频率、其中最小的2Hz对应的-99为占位延长间隔时间用,无实际意义,剩下的七个从小到大分别对应乐谱中的降八度la、do、re、mi、so、la、升八度do、升八度re、升八度mi。
%绘出幅度谱
subplot(2,1,1);
plot(1000*w/pi,abs(wave_f));
title('北京欢迎你(片段)幅度谱');
xlabel('频率(Hz)');
%绘出相位谱
subplot(2,1,2);
plot(1000*w/pi,angle(wave_f));
title('北京欢迎你(片段)相位谱');
xlabel('频率(Hz)');