2013年认证杯SPSSPRO杯数学建模
B题 流行音乐发展简史
原题再现:
随着互联网的发展,流行音乐的主要传播媒介从传统的电台和唱片逐渐过渡到网络下载和网络电台等。网络电台需要根据收听者的已知喜好,自动推荐并播放其它音乐。由于每个人喜好的音乐可能横跨若干种风格,区别甚大,需要分别对待。这就需要探讨如何区分音乐风格的问题。
第二阶段问题: 近几十年来,流行音乐的风格经历了相当复杂的演变过程。每个时代都有其代表性的人物和风格,歌曲的成功要素也随时间不断改变。请你建立合理的数学模型,对曾经走红过的流行歌曲,通过其原唱录音或曲谱来推断其所处时代。并请你写一篇短文2,向大众简述(在某个时期内)流行歌曲的“成功要素”是如何变化的。
整体求解过程概述(摘要)
近几十年来,中国流行音乐的风格经历了相当复杂的演变过程,每个时代都有其代表性的人物和风格,歌曲的成功要素也随着时间不断变化。不同时期的流行音乐不仅反映了不同历史时期人们的精神面貌,也用音乐这个特殊的方式记载着不同历史时期人们的日常生活和人文背景。
我们建立了基于层次分析法的模糊评价模型,先对各时代的流行歌曲进行随机选择(各 30 首,时间有限,理论上各 100 首为宜),然后对它们的音乐标签进行分析,总结出各时代的特点。接着随机选择 10 首歌,通过分析其特点判断出它所属的年代。并通过对近几十年来音乐发展的分析,得出了歌曲成功要素的变化趋势。
在对歌曲的年代进行判断的问题中,我们首先使用了层次分析法,把影响歌曲分类的因素分为风格,主题和情感这三个因素。将风格又分为流行、乡村、摇滚和布鲁斯这四种;将主题分为爱国、爱情、友情、亲情和理想;将情感分为喜悦、忧伤、思念和励志。我们选取百度音乐、酷狗音乐、酷我音乐、QQ 音乐及 Last.fm 等大型音乐网站,从上面免费获得音乐(所筛选的歌曲)的标签(包括风格、主题和情感三个方面)。统计得出不同的时代各个因素在总体中的比例,然后运用模糊评价法,建立因子集、评判集等,从而确定风格、主题、情感对应的权值,即这三种因素在不同年代对流行音乐的影响程度。
为了验证模型的正确性,我们对每个年代的流行歌曲再次进行随机选取(各 10 首,时间有限,理论上 30 首为宜)。我们建立了 BP 神经网络模型,并用matlab对歌曲的风格进行频谱和波形的分析,然后从歌词中总结其主体和情感。结果,运用所建模型得到的音乐标签与权威音乐网站所给标签的一致性很高(均超过 70%)。这表明所建模型具有可行性,因此,是正确的。
在对音乐的成功要素进行分析的过程中,我们根据之前所统计的结果,并对其建立柱状图,可以清晰地得出风格、主题、情感这三种要素随时代的变化情况,从而分析出成功要素的变化趋势。从 60 年代开始,流行音乐在风格方面从单一化慢慢发展成丰富多元化。主题上以爱国、亲情和友情为主题的流行音乐逐渐减少,表达达爱情的歌曲则明显增加。情感方面表达忧伤的歌曲的比重上升明显,而表达喜悦的歌曲则明显下降;以励志和思念为情感的歌曲则变化不大。
问题分析:
不同时期的流行音乐不仅反映了不同历史时期人们的精神面貌,也用音乐这个特殊的方式记载着不同历史时期人们的日常生活和人文背景。
我们研究一首歌曲能够成为一个时代的流行歌曲的原因,首先要从其流行要素来分析。所谓流行要素,即歌曲在流行过程中所必须具备的条件。毫无疑问,好的歌词在歌曲的流行要素中比之音乐是第一位的。词作者借助于艺术想象力和各种其它处理,使得艺术幻象中的空间形象得以再现。歌词创作是一种造型的艺术,词作者要通过各种想象和艺术处理,创造一种美的艺术的幻象。同时,所有的歌词又必须能够传达一个可以用音乐来谱写的思想,并且能够提供某种感情基调和联系线索,以此来激发音乐家的想象力。实际上,当今的流行歌曲已经成为体现当代社会群体文化生活质量的重要衡量标准之一,歌曲的主题和情感主要通过歌词来表现。
歌曲的第二个重要的流行要素是音乐。当作曲家被一首好的歌词所激励并为它谱曲时,这首词才能变成一支歌。在音乐艺术的创作过程中,音乐家始终处于一种纯粹音响的天地里,大脑里所有的世界有形的影象和现实都变得模糊不清了,感觉对象变得与视觉影象关系不再那么紧密,在其音乐想象中异常充实的是具有广阔连续性的无比激情,每一种东西都能用一种曲调表现出来,并使其组合成为一部完整的作品。音乐的旋律能够反映一首歌的风格。
我国流行音乐逐渐发展起来是在 70 年代,改革开放后,随着通俗文艺的兴起,流行歌曲在中国大陆保持着迅猛的发展态势,产生了广泛的社会影响。为了进行有针对性的研究,我们将研究对象定义在中国流行音乐范围内,并且将研究阶段分为:60 年代-70年代末、80 年代、90 年代、21 世纪-今…四个时期。
我们将研究分为两个步骤完成,第一步总结出每个时期流行音乐的特点,第二步根据所得结论将音乐按时代分类。因此建立基于层次分析法的模糊评价模型和 BP 神经网络模型。
1.第一部分:每个时代流行音乐的特点:可以利用逐层分析法,通过分析不同时代流行音乐的不同标签,总结出其风格特点、主题特点、情感特点这三种具有决定性因素的性质,从而归纳总结出每个时代的流行要素。然后将音乐按时代划分等级,即 60-80年代音乐、80 年代音乐、90 年代音乐、21 世纪音乐,构成评语集。利用模糊分析法,将影响因素分为两个层次,组成一级、二级因素集,再根据抽取的歌曲的数据找出相应的权重集,模糊矩阵,建立模糊评价模型,从而得出歌曲所属的年代。
2.第二部分:将音乐按时代分类:先建立 BP 神经网络模型,找出能提取流行音乐风格的方法,在分析其主题和情感,按权重得出所在年代。
模型假设:
(1)随机抽取的音乐具有代表性,能购反映时代的音乐特点。
(2)音乐的高潮部分能反映它的音乐风格特征。
(3)流行音乐所属年代的判别因素主要由风格、主题和情感三种因素决定。
(4)流行音乐的风格特征主要由流行、乡村、摇滚、新世纪这四种因素决定;其他因素影响不大。
(5)流行音乐的主题特征主要由理想、爱国、爱情、亲情、友情这五种因素决定,其他因素忽略不计。
(6)流行音乐的情感特征主要由喜悦、忧伤、思念、励志这四种因素决定,其他因素忽略不计。
(7)所选取的百度音乐、酷狗音乐、酷我音乐、QQ 音乐及 Last.fm 等大型音乐网站上给出的音乐标签具有权威性,即所给标签是正确合理的。
论文缩略图:
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
部分程序代码:(代码和文档not free)
%画出频谱图和波形图
[y,Fs,bits]=wavread('1yao.wav');%读出信号,采样率和采样位数。
y=y(:,1);
sigLength=length(y);
Y = fft(y,sigLength);
Pyy = Y.* conj(Y) / sigLength;
halflength=floor(sigLength/2);
f=Fs*(0:halflength)/sigLength;
figure;plot(f,Pyy(1:halflength+1));
title('摇滚音乐的频谱图');
xlabel('Frequency(Hz)');%频谱图
t=(0:sigLength-1)/Fs;
figure;plot(t,y);
title('摇滚音乐的波形图');%波形图
xlabel('Time(s)');
%这是提取特征值函数,返回值为各个端点之间距离的平均值和方差。
function [ FileName,mean_value,variance ] = Feature_Extract( FileName )
%UNTITLED2 Summary of this function goes here
% Detailed explanation goes here
[F,Fs,bits]=wavread(FileName,20*44100);%读入波形函数
time=20;%采样时间
T=1:time*Fs;%采样时间轴
Wave=F(T);
Wave=Wave/max(abs(Wave));%数据统一化处理
WLen=length(T);
winlen=2^nextpow2(Fs*20/1000);
dupwin=2^nextpow2(Fs*5/1000);
stepwin=winlen-dupwin;
E=zeros(WLen-stepwin,1);%初始化能量矩阵
for i=1:stepwin:WLen-stepwin%计算帧能量 FE
xm=Wave(i:i+stepwin);
E(i)=sum(xm.*xm);
end
E0=[E zeros(length(E),1)];
E0=setxor(E0(:,1),0);
j=1;
for i=1:length(E)%记录帧的位置
if E(i)>0
E0(j,1)=E(i);
E0(j,2)=i;
j=j+1;
end
end
Emin=min(E0(:,1));%计算帧能量的最小值
Emax=max(E0(:,1));%计算帧能量的最大值
Emean=mean(E0(:,1));
lamda=0.5;%设定静止阀值
Ttfe=Emin+lamda*(Emean-Emin);
for i=1:length(E0(:,1))%屏蔽 E0 中对帧能量小于静止阀值的值
if E0(i,1)<Ttfe
E0(i,1)=0;
end
end
FER=ones(length(E0(:,1)),2);%初始化帧能量比例矩阵
for i=1:(length(E0(:,1))-1)%计算帧能量比
if(and(E0(i,1),E0(i+1,1)))%若当前帧与后一帧都不为 0
FERa=E0(i+1,1)/E0(i,1);
FERb=E0(i,1)/E0(i+1,1);
FER(i,1)=max(FERa,FERb);
FER(i,2)=E0(i,2);
end
end
level=mean(FER(:,1));%设定高潮阀值
result0=zeros(length(FER(:,2)),1);%初始化结果矩阵
j=2;
if FER(1,1)-level>0
result(1)=FER(1,2);
end%过滤出高潮端点
for i=2:length(FER(:,2))-1
if FER(i,2)-level>0
if FER(i-1,2)-level<0
result0(j)=FER(i,2);
j=j+1;
end
end
end
result0=setxor(result0,0);%删除多余的 0 元素
result=zeros(length(result0)-1,1);
for i=1:length(result0)-1
result(i)=result0(i+1)-result(i);
end
charaction=zeros(size(result));
for i=1:length(result)-1
charaction(i)=result(i+1)-result(i);
end
result=charaction;
%特证分析
FileName;
u=mean(result);
d=var(result);
disp([FileName])
disp(['均值:' num2str(u) ' 方差:' num2str(d)]);%输出结果
mean_value=u;
variance=d;
end