(写在前边:《信号与系统》这门课的实验报告,同学们比较头疼,要么没有思路。属实折磨。到最后,大家都是东抄抄,西学学。
我们小组的项目题目是“音乐分析与合成”。本着互相帮助的精神,同时也是让我们的实验报告发挥更大的价值,所以这里给我们的matlab代码(全部代码在最后)和报告;希望可以帮助你,同学。
请你给我们点个赞,或者评论说点什么,都是捧个场。感谢!!
《信号分析与处理》
课程大作业设计报告
组长 |
|
组员 |
报告日期:2XXX年MM月DD日
报告撰写说明
1. 按照参考模板的内容和格式撰写报告
2. 理论部分须结合本课程知识分析问题
3. 程序设计部分应给出设计思路、主要流程图和关键函数的说明;结果分析不能只是简单给出结论,应结合具体问题,对关键参数或算法在不同取值条件下对结果的影响情况进行分析和总结。
4. 组内互评,相互评价彼此的贡献。
目 录
1 问题描述
2 理论部分
3 程序设计
3.1 编程思路
3.2 主要流程图及说明
3.3 结果分析
4 组内互评
5 总结与体会
参考文献
1 问题描述
当今时代,音乐越来越成为人们生活中不可缺少的娱乐活动。一些音乐播放、听歌识曲软件如雨后春笋般涌现。这些软件是如何来处理音频信号的呢?通过本学期《信号与分析》这门课程的学习,我们了解到:信号与系统的概念及分析方法广泛应用于通信、自动控制、电子信息等领域。MATLAB是国际上公认的优秀的科技应用软件,随着版本的不断升级,内容也在不断扩充。基于MATLAB的音乐分析与合成是较为常见、简单易操作的音乐处理方法。所以,我们决定用matlab对一段音乐进行分析、分解,并完成对乐音的指数包络的合成,演奏出自己合成的音乐。
2 理论部分
乐音的基本特征可以用基波频率、谐波频谱和包络波形三个方面描述。用C、D、E、F、G、A、B表示每个乐音的“音名”,当指定某一音名,它对应固定的基波信号频率。钢琴键盘上的部分琴键对应的乐音和基波频率如图1。在音乐中谐波起着音色变化的作用。当指定音调之后,仅指定了乐音信号的基波而未说明谐波情况,通常我们听到不同的乐器在某一音调下有明显不同感觉,这是由于谐波成分有所区别,频谱结构各异。不同类型的乐器,包络形状也不相同。在音乐合成的实验中,为了简化程序描述,我们通常把复杂的包络函数用少量的直线近似或者用指数衰减的形式表示。
音乐信号表示与分析:音乐信号通常可用时域、频域、时频域等多种方式表示,MATLAB中可以利用傅里叶变换等方法将时域信号转化为频域信号进行分析,可以对谱图、频谱密度、功率谱等参数进行计算和处理。
音乐合成:音乐合成是指通过各种数学算法模拟真实乐器发声原理,将数字信号转化为音频信号,在MATLAB中常见的方法有加性合成、减性合成、FM合成、物理模拟合成等。
音乐效果处理:音乐效果处理是指通过各种数字信号处理技术对音频信号进行改变,从而实现多种音乐效果,如回声、均衡器、压缩、失真等,MATLAB中可以使用数字滤波器实现这些效果。
音乐特征提取:音乐特征提取是指从音频信号中提取出一些数学参数,以描述音频的特征,如音高、节奏、旋律等,常见的方法包括傅里叶变换、小波变换、短时傅里叶变换、梅尔倒谱系数等。
傅里叶变换:
傅里叶变换是一种将时间域信号转换为频域信号的技术,可以将一个复杂的音频信号分解成不同频率的简单正弦波。因此,使用傅里叶变换可以绘制出每个乐音的时域波形和频谱图。
首先,在时域上,通过对音频信号进行采样和量化,我们可以获取到一组离散的采样值,这些采样值代表了声波在一段时间内的振幅。
然后,应用傅里叶变换算法将这些时域采样值转换为频域频率和振幅的表示。这样,就可以得到该音频信号在不同频率下的频谱信息,并且可以确定哪些频率分量对于该音乐乐器的音质和音色非常重要。
最后,将获得的频域信息再通过反向傅里叶变换转换回时域,即可得到原始音频信号的时域波形。同时,在频域图上,也可以表示出各频率成分的能量,以及它们之间的相对重要性。
3 程序设计
使用matlab读入一小段音乐;
绘制真实音乐的时域波形;
根据时域波形截取出单个乐音信号;
对每个乐音进行傅里叶变换,绘制每个乐音的频谱;
根据乐音的频率、幅值和持续时间信息进行指数包络的合成;
绘制合成音乐的频域波形(频域波形可视化效果更佳);
播放真实音乐和合成音乐,比较效果。
3.2 主要流程图及说明
A.流程图
图1. 主要流程图
- 具体思路和实现流程
1.加载歌曲。
%setting up song
clear; clc; clf; close all
mute=false;
[song,Fs]=audioread('Fur Elise_3.mp3');
%sound(song,Fs); %play the song
Fs=Fs*4;
figure, plot(song(:,1)),title('Fur Elise')
%set parameters
length(song)
t1=10; t2=565104;%start & end length
%analyse a window of the song
y=song(t1:t2);
n=length(y);
t=linspace(t1,t2,n);
audiowrite('Fur Elise.wav',y,Fs)%output .wav file
代码说明:
首先,通过audioread函数读取名为"Fur Elise_3.mp3"的音乐文件,并将音频数据存储在变量song中,采样率存储在变量Fs中。将采样率Fs乘以4,将其值赋给变量Fs,相当于将音乐的播放速率加快了4倍。
t1和t2为位置参数,起始位置t1设为10,结束位置t2设为565104。(记得根据自己的歌曲改动!!)
song中提取了位于t1到t2之间的部分音频数据,并将其存储在变量y中。变量n表示音频数据的长度。
生成等间距的时间向量t,用于在后续的分析中使用。
最后将提取的音频数据y以采样率Fs保存为"Fur Elise.wav"的.wav文件。
2.使用平均滤波器将其采样20次,去掉一些音频的高频内容,减少matlab运算量,提高程序分析速度。
%downsampled by m
clc;
m=20;
Fsm=round(Fs/m);
p=floor(n/m);
y_avg=zeros(1,p);
for i=1:p
y_avg(i)=mean(y(m*(i-1)+1:m*i));
end
figure, subplot(2,1,1), plot(linspace(0,100,n),abs(y))
title('Discrete notes of song')
legend('Original')
subplot(2,1,2), plot(linspace(0,100