matlab音乐合成报告
- 格式:doc
- 大小:2.53 MB
- 文档页数:25
在Matlab中实现音乐合成和音乐分析的方法音乐作为一种艺术形式,是人类情感和创造力的结晶。
如何在Matlab中实现音乐合成和音乐分析的方法,成为了许多音乐爱好者和研究者所关注的问题。
本文将介绍一些常用的音乐合成和音乐分析的方法,并说明它们在Matlab中的实现。
首先,我们来讨论音乐合成的方法。
音乐合成的目标是通过人工的方式生成音乐声音信号。
这可以通过基于规则的方法或基于样本的方法实现。
基于规则的音乐合成常常依赖于合成器,通过调整音色、音高、音量等参数来实现声音生成。
在Matlab中,我们可以利用`audioplayer`函数和音频波形生成函数来实现基于规则的音乐合成。
首先,我们需要定义一个音频波形生成函数,它可以根据输入的参数生成对应的音频波形。
然后,我们可以使用`audioplayer`函数将生成的音频波形播放出来。
通过调整参数可以实现不同的音乐效果。
而基于样本的音乐合成则是利用已有的音频样本来合成音乐。
在Matlab中,我们可以使用`audioread`函数来读取音频样本,然后通过重复拼接、叠加和变调等方式来生成新的音乐。
此外,我们还可以利用`resample`函数来改变音频的采样率,从而实现音乐的时间拉伸或压缩。
通过调整样本的选择和变换方式,我们可以获得不同风格和效果的音乐合成结果。
接下来,我们来讨论音乐分析的方法。
音乐分析的目标是对音乐进行特征提取和结构分析,以便深入理解音乐的内在规律和风格特点。
在Matlab中,有许多用于音乐分析的工具箱和函数可供使用。
一种常用的音乐分析方法是通过频谱分析来提取音乐的频率和强度信息。
在Matlab中,我们可以利用`fft`函数对音频信号进行傅里叶变换,得到音频信号的频谱。
通过分析频谱的峰值频率、能量分布等特征,我们可以获得音乐的基本音高、音色和音量等信息。
此外,我们还可以利用`spectrogram`函数来生成音频的时频谱图,以便更直观地观察音乐信号的时变特征。
如何在MATLAB中进行音频合成与分析在MATLAB中进行音频合成与分析音频合成与分析在音乐制作、声音特效处理、语音识别等领域起着重要作用。
MATLAB作为一款强大的数值分析和数据可视化软件,在音频处理方面具有丰富的功能和工具。
本文将介绍如何在MATLAB中进行音频合成与分析。
一、音频合成音频合成是指通过各种声音合成方法和算法生成人造音频的过程。
在MATLAB中,我们可以利用其丰富的信号处理工具箱来进行音频合成。
首先,我们需要了解音频合成中的一些基本概念和技术。
例如,有源声音合成,通过模拟振动源(如声乐器)的物理特性来生成声音;无源声音合成,通过合成算法生成各种声音效果;叠加合成,将多个声音信号叠加在一起;频率合成,通过操纵音频信号的频谱来生成新的声音效果等等。
了解这些概念和技术将帮助我们更好地进行音频合成。
在MATLAB中,可以通过调用信号处理工具箱中的函数来实现音频合成。
例如,可以使用fft函数来进行频谱分析和合成;使用wavread和audioread函数来读取和写入音频文件;使用声音合成函数synth和sound来生成和播放音频等等。
这些函数提供了丰富的参数选项,可以满足不同合成需求。
二、音频分析音频分析是指对音频信号进行各种分析和挖掘的过程。
在MATLAB中,我们可以利用其强大的信号处理和数据分析功能来进行音频分析。
音频分析的目的可以包括频谱分析、音高检测、节奏分析、音频特征提取等等。
这些分析可以帮助我们了解音频信号的特点、提取其中的有用信息,并为后续的处理和应用提供支持。
在MATLAB中,可以使用fft函数来进行频谱分析。
该函数可以将时域信号转换为频域信号,并得到信号的频率和幅度信息。
在进行频谱分析时,我们可以使用窗函数对信号进行窗口截断和平滑处理,从而得到更准确的频谱分析结果。
除了频谱分析,我们还可以使用自相关函数、互相关函数等来进行时域分析和相关分析。
MATLAB中提供了丰富的函数和算法,例如autocorr、xcorr等,可以满足不同分析需求。
一、实验目的1. 了解音乐合成的基本原理和方法。
2. 掌握使用MATLAB进行音乐合成的技巧。
3. 通过实验,加深对音乐合成理论的理解。
二、实验原理音乐合成是指利用电子技术模拟或生成音乐的过程。
音乐合成的基本原理是将音乐的基本元素(如音高、音色、持续时间等)进行数字化处理,然后通过电子设备输出。
本实验采用MATLAB进行音乐合成,主要涉及以下原理:1. 傅里叶级数:将音乐信号分解为不同频率的正弦波和余弦波的叠加。
2. 快速傅里叶变换(FFT):对音乐信号进行快速傅里叶变换,以分析其频谱。
3. 音高合成:通过调整正弦波的频率来模拟不同音高的声音。
4. 音色合成:通过调整正弦波的幅度和相位来模拟不同的音色。
三、实验内容1. 合成《东方红》(1)读取《东方红》的音符序列。
(2)根据音符序列,生成对应的正弦波信号。
(3)将所有正弦波信号叠加,得到完整的音乐信号。
2. 除噪音、加包络(1)读取含有噪音的音乐信号。
(2)对音乐信号进行傅里叶变换,分析其频谱。
(3)将噪音频率的分量从频谱中去除。
(4)为音乐信号添加包络,以调整音量变化。
3. 改变程序,实现音乐升高和降低一个八度(1)修改程序,调整音符序列中每个音符的频率。
(2)重新生成音乐信号。
4. 在音乐中加入谐波(1)在原有音乐信号的基础上,添加谐波分量。
(2)调整谐波分量的频率和幅度。
5. 自选音乐合成(1)选择一首自己喜欢的音乐。
(2)按照实验原理,对音乐进行合成。
四、实验步骤1. 打开MATLAB软件,创建一个新的脚本文件。
2. 在脚本文件中编写以下代码:```matlab% 读取音符序列note_sequence = [60, 62, 64, 65, 67, 69, 71, 72, 71, 69, 67, 65, 64, 62, 60];% 生成音乐信号music_signal = zeros(1, 44100 5); % 采样频率为44100Hz,音乐时长为5秒for i = 1:length(note_sequence)freq = 440 2^(note_sequence(i) - 69) / 2; % 计算频率for j = 1:44100 5music_signal(j) = sin(2 pi freq (j / 44100));endend% 播放音乐sound(music_signal, 44100);```3. 运行脚本文件,观察音乐合成效果。
matlab合成运算在MATLAB中,合成运算指的是将音频信号合并在一起。
你可以使用以下方法完成合成运算:1. 使用`audioread`函数读取所有要合并的音频文件,并将其加载到MATLAB中,例如:```matlab[y1, Fs1] = audioread('file1.wav');[y2, Fs2] = audioread('file2.wav');```这将把第一个文件的音频数据存储在`y1`中,采样率存储在`Fs1`中,第二个文件的音频数据存储在`y2`中,采样率存储在`Fs2`中。
如果需要,你可以在读取音频文件之前使用`resample`函数将其采样率调整为相同的值。
2. 如果需要,对音频数据进行加窗处理,例如:```matlabwindow = hann(length(y1)); % 使用汉宁窗y1_windowed = y1 .* window;y2_windowed = y2 .* window;```这将把`y1`和`y2`的每个样本乘以对应位置的窗函数值,以减少合并时产生的混响噪音。
3. 如果两个音频文件的长度不同,你可以选择使用以下方法来调整它们的长度:- 使用`resample`函数将较短的音频文件的采样率与较长的文件相匹配。
- 使用`padarray`函数在较短的音频文件的末尾添加零值,使其与较长的音频文件具有相同的长度。
4. 直接合并两个音频文件,例如:```matlaby_merged = y1 + y2;```这将把两个音频文件的对应样本位置的值相加,并将结果存储在`y_merged`中。
5. 最后,你可以使用`audiowrite`函数将合并后的音频信号保存为一个新的音频文件,例如:```matlabaudiowrite('merged.wav', y_merged, Fs1);```这将把`y_merged`写入到名为`merged.wav`的文件中,采样率设置为`Fs1`。
MATLAB及应用大作业MATLAB在音乐合成中的应用题目要求:编写程序,用图中给出的包络消除任务2中音乐中的噪音;这个包络如下图所示,每个乐音都经过冲激、衰减、持续、消失四个阶段。
结果图展示:程序特点:1.输入:各音音高frequency(1*number_syllables的向量),各音音符对应时长note_time(1*number_syllables的向量),乐音数number_syllables单位音节采样点量num_sample,各音时长time(1*number_syllables的向量),谐波harmonic(1*number_harmonic的向量),谐波数number_harmonic.包络特殊点special_points(包括开始点S0、转折点T1,T2,T3、终点E4,number_sp*2的数组)特殊点数number_sp状态数num_status2.过程:2.1建立包络2.1.1建立单音包络函数envelope_single()输入:此单音时长type,包络特殊点special_points(包括开始点S0、转折点T1,T2,T3、终点E4)2.1.1.1包络特殊点处理成创立此音节的特殊点special_points_single 2.1.1.2算线段参数line_parameter=[斜率slope 截距intercept]2.1.1.3创立各线端的对应开头与结束点status_list2.1.1.4 每个不同的状态都逐点遍历,赋值符号表达式进行计算输出:此单音包络对应的各点值:结果存储点time_storage_result (type(type_index)*1)2.1.2总音包络区段找出到底有几个类型的音长和总时长type_array 向量(1*num_type)num_typenum_time_all=sum(time,'all');结构矩阵type_structure (2×type struct )有:音长字段type(<-----type_cell),结果向量字段type_index(<-----num_type)type_structure(type_index).time_storage_result=envelope_single (type,special_points)更改time矩阵,使其便于索引type_index(<-----num_type)time(type_array(type_index)==time)=type_index;遍历位置得出所有点的包络,同时用泛波填充包络result_all (num_time_all*1)使用type_time_structure和type_frequency_structure每个结构体内置type和template两个成员result_all是最终结果点,有result_index遍历指针syllables_index遍历音节指针type_time_structure(time(syllables_index)).type/template找出当前time类型type和templatetype_frequency_structure(frequency(syllables_index)).type/template找出当前frequency类型type和templatenum_current_Ttype=type_time_structure(time(syllables_index)).type; result_index=1;result_index_end=result_index-1+num_current_Ttype;result_all(result_index:result_index_end)=...type_frequency_structure(frequency(syllables_index)).template(1:num_ current_Ttype)....*type_time_structure(time(syllables_index)).template;harmonic_template的函数编程:输入:最大时长Tmax,谐波的倍数n和对应幅值A,此刻的基频角频率w根据1到最大时长Tmax创造存储行向量storage_result基频角频率.*谐波的倍数构造出对角阵diag_nwstorage_result=repmat(存储矩阵storage_result,length(谐波的倍数行向量矩阵),1)对角阵diag_nw与storage_result相乘得出storage_result,正弦函数化幅值对角阵diag_A与storage_result相乘得出storage_result按行累加得存储矩阵storage_result3.输出:有谐波、经包络修正后的乐音程序部分1(之前做的,从网上的已有程序更正包络后得到的,比较慢,胜在便于理解的简单):clc;clear;close all;f=[261.63 392 261.63 392 261.63 293.66 329.63 261.63 392,...261.63 392 261.63 293.66 293.66 261.63 392 261.63 392 ,...293.66 261.63 220 220 196 261.63 293.66,...261.63 392 261.63 392 261.63 220 261.63];%各个乐音对应的频率fs=8000;%各个乐音的抽样点数time=fs*[3/2,1/2,1/2,1/2,1/2,1/2,4,3/2,...1/2,1/2,1/2,1/2,1/2,4,3/2,1/2,1/2,...1/2,1/2,1/2,2,1/2,1/2,1/2,1/2,3/2,1/2,1/2,1/2,1/2,1/2,4];%每个乐音的时间的长短%荷塘月色N=length(time);%这段音乐的音数time个sample_point_storage=zeros(1,N);%储存time个零元n=1;m=[1 0.2 0.3];%谐波for num=1:N%处理第num个音t=1/fs:1/fs:time(num)/fs;%展开这个音使它变成time(num)个的展开的抽样点P=zeros(1,time(num));%P为存储该包络数据的向量L=(time(num)*[0,1/5,333/1000,333/500,1]);%包络线端点对应的横坐标,333/1000,333/500如此处理是为了防止不出现整数,影响包络线处理T=[0,1.5,1,1,0];%包络线端点对应的纵坐标s=1;for k=1:4k1=k+1;%k1用作标识下一个元素L10=L(k1);%L10用作标识下一个横坐标元素L1=L10-1; %L1用作界定此次包络线段右端范围kk=(T(k1)-T(k))/(L(k1)-L(k));%斜率,纵坐标差比横坐标差b=1:L10-s;%产生包络线抽样点P(s:L1)=kk*b(1:end);%L10-s个c=ones(1,(L10-s));P(s:L1)=P(s:L1)+(T(k))*c;%包络线直线方程通式,就是造出有斜率的过原点的直线,然后向右移动,向上移动s=L10; %处理下一个包络线段end% plot(P);ss=zeros(1,time(num));%创造这个展开后的抽样点for mi=1:length(m)%展开的抽样点上每个谐波相加ss=ss+m(mi)*sin(2*mi*pi*f(num)*t);endsample_point_storage(n:n+time(num)-1)=ss.*P;%最终的该音的谐波n=n+time(num);%plot(sample_point_storage);end% sound(sample_point_storage, 8000);plot(sample_point_storage);%播放音乐audiowrite('music_assignment_04.wav',sample_point_storage,8000) ;程序部分2(之后做的,从头到尾自己写的,参数自己调的,比较快,缺点是编程繁琐和空间耗费大,以及自己调的参数走音严重)% 第零步:清场准备clc;clear all;close all;% 第一步:输入% 各音音高frequency(1*number_syllables的向量),g3_35=196.028;a3_37=220.0501;c4_40=262.0355;d4_42=291.9626;e4_44=330.0452;g4_47=392.0533;frequency=[c4_40 g4_47 c4_40 g4_47 c4_40 d4_42...e4_44 c4_40 g4_47 c4_40 g4_47 c4_40...d4_42 d4_42 c4_40 g4_47 c4_40 g4_47...d4_42 c4_40 a3_37 a3_37 g3_35 c4_40...d4_42 c4_40 g4_47 c4_40 g4_47 c4_40...a3_37 c4_40];% 各音音符对应时长(1*number_syllables的向量),note_time=[3/2,1/2,1/2,1/2,1/2,1/2,4,3/2,...1/2,1/2,1/2,1/2,1/2,4,3/2,1/2,1/2,...1/2,1/2,1/2,2,1/2,1/2,1/2,1/2,3/2,1/2,1/2,1/2,1/2,1/2,4];% 乐音数,num_syllables=length(note_time);% 单位音节采样点量num_sample,num_sample=8000;% 各音时长time(1*number_syllables的向量),time=num_sample*note_time;%谐波harmonic(1*number_harmonic的向量),谐波的倍数n和对应幅值Aglobal n;global A;n=[1 3 5 7];A=[1 0.4 0.2 0.1];%包络特殊点special_points(包括开始点S0、转折点T1,T2,T3、终点E4,number_sp*2的数组)global special_points;special_points=[0 0;0.20 1.50;0.333 1.00;0.666 1.00;1.00 0];% 第二步:% 构造时长/频率类型矩阵和找出总时长type_time_array=unique(time);type_frequency_array=unique(frequency);num_time_all=sum(time,'all');% 构造时长/频率结构数据变量,存储模板,以便免除重复计算% 更改时长/频率矩阵,使其便于索引type_time_structure=struct('type',num2cell(type_time_array));for type_index=1:length(type_time_array)type_time_structure(type_index).template=...envelope(type_time_array(type_index));time(type_time_array(type_index)==time)=type_index;endtype_frequency_structure=struct('type',num2cell(type_frequency_array) );global Tmax;Tmax=type_time_array(end);for type_index=1:length(type_frequency_array)type_frequency_structure(type_index).template=...harmonic_template(2*pi*(type_frequency_array(type_index)));frequency(type_frequency_array(type_index)==frequency)=type_index;end% 第三步:% 遍历位置得出所有点的结果result_all=zeros(num_time_all,1);result_index=1;for syllables_index=1:num_syllablesnum_current_Ttype=type_time_structure(time(syllables_index)).type;result_index_end=result_index-1+num_current_Ttype;result_all(result_index:result_index_end)=...type_time_structure(time(syllables_index)).template....*type_frequency_structure(frequency(syllables_index)).t emplate(1:num_current_Ttype);result_index=result_index_end+1;endaudiowrite('music_htys.wav',result_all,8000) ;plot(result_all);function [envelope]=envelope(type)global special_points;%创立结果存储点envelope=ones(1,type);%创立此音节的特殊点special_points_single=[special_points(:,1)*typespecial_points(:,2)];%创立各线端的对应开头与结束点status_list=[special_points_single(1:end-1,1)+1special_points_single(2:end,1)];%每个不同的状态都逐点遍历for status_index=1:length(special_points)-1envelope(status_list(status_index,1):status_list(status_index,2))=...interp1(special_points_single(status_index:status_index+1,1),special_poi nts_single(status_index:status_index+1,2),status_list(status_index,1):stat us_list(status_index,2),'linear');endfunction [storage_result]=harmonic_template(w) global n;global A;global Tmax;storage_result=1:Tmax;diag_nw=diag(w*n);storage_result=repmat(storage_result,length(n),1);storage_result=diag_nw*storage_result;storage_result=sin(storage_result);storage_result=diag(A)*storage_result;storage_result=sum(storage_result);end第一步:输入初始设定有音高和各音高出现的序列表frequency,各音符对应时长出现的序列表note_time,经过单位音节采样点量num_sample拉伸的时间点表time,每一个元素的大小代表接下来创造有多少个点的向量。
目录音乐合成实验................................................................................................. 错误!未定义书签。
摘要: (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);wave14=sin(2*pi*note_3*note4); wave15=sin(2*pi*note_1b*note8); wave16=sin(2*pi*note_6*note8); wave17=sin(2*pi*note_6*note8); wave18=sin(2*pi*note_5*note8); wave19=sin(2*pi*note_6*note2); wave20=sin(2*pi*note_5*note4); wave21=sin(2*pi*note_1*note4); wave22=sin(2*pi*note_2*note2); wave23=sin(2*pi*note_7*note2); wave24=sin(2*pi*note_7*note8); wave25=sin(2*pi*note_5*note8); wave26=sin(2*pi*note_3*note4); wave27=sin(2*pi*note_5*note2); wave28=sin(2*pi*note_1b*note8); wave29=sin(2*pi*note_6*note8); wave30=sin(2*pi*note_6*note8); wave31=sin(2*pi*note_5*note8); wave32=sin(2*pi*note_5*note8); wave33=sin(2*pi*note_6*note8); wave34=sin(2*pi*note_6*note8); wave35=sin(2*pi*note_5*note4); wave36=sin(2*pi*note_1*note4); wave37=sin(2*pi*note_3*note2); wave38=sin(2*pi*note_1b*note8); wave39=sin(2*pi*note_6*note8); wave40=sin(2*pi*note_6*note8); wave41=sin(2*pi*note_5*note8); wave42=sin(2*pi*note_5*note8); wave43=sin(2*pi*note_6*note8); wave44=sin(2*pi*note_6*note8); wave45=sin(2*pi*note_5*note4); wave46=sin(2*pi*note_1*note4); wave47=sin(2*pi*note_2*note2); wave48=sin(2*pi*note_3*note2); wave49=sin(2*pi*note_3*note8); wave50=sin(2*pi*note_1*note8); wave51=sin(2*pi*note_6*note4); wave52=sin(2*pi*note_1*note2); wave53=sin(2*pi*note_3*note4); wave54=sin(2*pi*note_5*note4); wave55=sin(2*pi*note_6*note4); wave56=sin(2*pi*note_6*note8);wave58=sin(2*pi*note_5*note4);wave59=sin(2*pi*note_6*note4);wave60=sin(2*pi*note_6*note8);wave61=sin(2*pi*note_1b*note2);wave62=sin(2*pi*note_7*note8);wave63=sin(2*pi*note_5*note4);wave64=sin(2*pi*note_6*note2);wave=[wave1 wave2 wave3 wave4 wave5 wave6 wave7 wave8 wave9 wave10 wave11 wave12 wave13 wave14 wave15 wave16 wave17 wave18 wave19 wave20 wave21 wave22 wave23 wave24 wave25 wave26 wave27 wave28 wave29 wave30 wave31 wave32 wave33 wave34 wave35 wave36 wave37 wave38 wave39 wave40 wave41 wave42 wave43 wave44 wave45 wave46 wave47 wave48 wave49 wave50 wave51 wave52 wave53 wave54 wave55 wave56 wave57 wave58 wave59 wave60 wave61 wave62 wave63 wave64]; %歌曲wave数组sound(wave,8000); %播放waveplot(wave); %描画函数在MA TLAB中运行,播放出了《葫芦娃》,但是可以听出效果很不好,只能听出具有《葫芦娃》的调子而已。
课程设计《音乐合成》实验报告专业:测控技术与仪器班级:测控11-2 班*名:***学号: ***********指导教师:**广东石油化工学院计算机与电子信息学院信号与系统课程设计-------利用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.25sy(0.25<t&t<0.5)=sin(392*2*pi*t(0.25<t&t<0.5)); %第二个音3,持续时间0.25ssound(y,8000) %播放音乐三.实验步骤3.1音乐合成根据《画心》第一小节的简谱和十二平均律计算出该小节每个乐音的频率,在MATLAB中生成幅度为1,抽样频率为8kHz的正弦信号表示这些乐音,用sound播放合成的音乐。
音乐合成大作业实验报告无84 王梦娣2008011134实验报告部分一、简单的音乐合成1.请根据《东方红》片断的简谱和“十二平均律”计算出该片断中各个乐音的频率,在MATLAB 中生成幅度为1 、抽样频率为8kHz 的正弦信号表示这些乐音。
请用sound 函数播放每个乐音,听一听音调是否正确。
最后用这一系列乐音信号拼出《东方红》片断,注意控制每个乐音持续的时间要符合节拍,用sound 播放你合成的音乐,听起来感觉如何?问题解答:《东方红》片段:其中所用音符的唱名、音名及对应频率(由十二平均律和相应键数间隔即可导出)如下:(单位是Hz)用sound播放单音,音调正确。
以一拍0.5秒计,播出合成音乐。
发现音乐听起来,总体上音调、节拍正确,但乐音无声音强弱变化,两音之间有明显的“啪”的杂声。
2.你一定注意到(1) 的乐曲中相邻乐音之间有“啪”的杂声,这是由于相位不连续产生了高频分量。
这种噪声严重影响合成音乐的质量,丧失真实感。
为了消除它,我们可以用图1.5 所示包络修正每个乐音,以保证在乐音的邻接处信号幅度为零。
此外建议用指数衰减的包络来表示。
问题解答:这个问题,实际上我并没有完全理解题意,没有明白是需要乐音之间有重叠,还是没有重叠,所以,我把两种方法都做了一遍,结果发现,用耳朵完全听不出区别。
对于无重叠的包络:我对包络所做的处理是,对于上图折线部分用指数实现,因为题目中有说当主观感受为线性变化时声音的概率实际上呈指数变化。
做出的结果的图像如下:包络0.511.522.533.54加包络后的音乐有重叠的包络:(处理后的音)从图像上可明显看出有重叠包络和无重叠包络的区别,但是听起来,基本听不出区别。
3. 请用最简单的方法将(2) 中的音乐分别升高和降低一个八度。
(提示:音乐播放的时间可以变化)再难一些,请用resample 函数(也可以用interp 和decimate 函数)将上述音乐升高半个音阶。
(提示:视计算复杂度,不必特别精确)问题解答:0.050.10.150.20.25未处理的一个音符加包络处理过的音符x 104-1.5-1-0.50.511.5由于题目中已有提示“音乐播放的时间可以变化”,所以很容易就想到用Sample函数实现音调的改变,用Sample函数也确实是最简单的方法。