分别提取演唱者音频与模版音频的特征参数,通过特征参数的差值得到演唱得分。

源码分三个部分:
1. main.m
主文件,运行入口
音频的读入,对基音特征进行分段DTW,根据DTW的结果计算得分
计算方式为:(cos((pl/tpl)*pi)+1)*50
其中,pl为待评分音频的结果 tpl为对照音频的结果
2. solve.m
基音特征提取函数
流程:
预加重->分帧->加窗->求短时平均能量->求自相关(求基音)
主要参数:
ek :高频提升参数
L :帧长(ms)
RL :帧移(ms)
kee:清浊音阈值
调整参数可以调整系统的整体特性以适应不同需求
3. DTW.m
动态时间规整函数
N^2复杂度,分段加快处理速度


%main.m
%西安电子科技大学 windroid
clear all;
%默认音源已提前进行统一化处理
%读取数据
file1 = 'C:\Users\97628\Desktop\音乐\music\暗香0.wma';
file2 = 'C:\Users\97628\Desktop\音乐\music\暗香1.wma';
[e1,Fs1] = audioread(file1);
[e2,Fs2] = audioread(file2);f1 = solve(e1, Fs1);
f2 = solve(e2, Fs2);figure(1);
subplot(211);plot(f1);title('file1基音频率');xlabel('帧数');ylabel('幅度');
subplot(212);plot(f2);title('file2基音频率');xlabel('帧数');ylabel('幅度');%DTW是为了小范围拟合 所以输入的音频需要提前对齐
%DTW -> n^2算法
%按帧分段
D = 100;
pl = 0;
for i=1:D:min(length(f1), length(f2))-Dpl = pl + DTW(f1(:,i:i+D), f2(:,i:i+D));
end
%空对照组
tpl = 0;
zf = zeros(1, length(f2));
for i=1:D:min(length(f1), length(zf))-Dtpl = tpl + DTW(f1(:,i:i+D), zf(:,i:i+D));
endif(tpl<pl)info = '音源差距太大,无法评分'
else%满分100%正弦曲线score = (cos((pl/tpl)*pi)+1)*50
end

%solve.m
function f = solve(e, Fs)
%e:音频数据; Fs:采样率
%返回基音频率 列向量
%
%函数过程:
%   预加重->分帧->加窗->求短时平均能量->求自相关(求基音)
%关键参数:
%   ek L RL kee
%西安电子科技大学 windroid%预加重
ek = -0.98; %-1 ~ 0
e = filter([1,ek],1,e);  %un为经过高频提升后的时域信号
log = '预加重完成'
un = e;
%figure(1);plot(e);title('原始语音信号');xlabel('样点数');ylabel('幅度');
%figure(2);plot(un);title('预加重后的语音信号');xlabel('样点数');ylabel('幅度');L = 30; % 帧长(ms)
RL = 20; % 帧移(ms)
t = length(e)*1000/Fs; % 时长(ms)
N = floor((t-L)/RL); % 帧数
ns = floor(Fs*L/1000); %帧采样点数
rnl = floor(Fs*RL/1000); %帧移点数un(length(un)+1:ceil(t/L)*ns, :) = 0; % 信号尾0扩充
su = size(un);
if su(2) == 2un = (un(:, 1) + un(:, 2))/2;
end%分帧
e1 = zeros(N, ns);
for i = 1:1:Ne1(i, :) = un((i-1)*rnl+1:(i-1)*rnl+ns, 1)';
end
%figure(3);plot(e1(100, :));title('分帧后的第100帧信号');xlabel('样点数');ylabel('幅度');
log = '分帧完成'%加窗
e2 = zeros(N, ns);
for i = 1:1:Ne2(i, :) = e1(i, :).*(hamming(ns))';
end
%figure(5);plot(e2(100, :));title('加窗后的第100帧信号');xlabel('样点数');ylabel('幅度');
%figure(6);plot(ee);title('加窗后的短时平均能量');xlabel('帧数');ylabel('能量');
log = '加窗完成'%{
%削波
emax = max(abs(e2'))';%中心削波
t = 0.7;
e3 = zeros(N, ns);
for i = 1:1:N for j = 1:1:nstc = t*emax(i);if e2(i, j) > tce3(i, j) = e2(i, j) - tc;elseif e2(i, j) < -tce3(i, j) = e2(i, j) + tc;elsee3(i, j) = 0;endend
end
%figure(7);plot(e3(100, :));title('中心削波后的第100帧信号');xlabel('样点数');ylabel('幅度');%TODO %三电平削波
%}
%{
%声频分离
LE = 1024;
t = zeros(LE, 1);
t(51:950, 1) = hanning(900);
ef = zeros(N, LE);
for i= 1:1:Nfe = fft(e1(i, :), LE);fe = fe.*(t');ef(i,:) = ifft(fe, LE);
end
%}%短时平均能量
ee = sum(e1.^2, 2)';
ne = sum(ee)/N;%figure(8);
%subplot(211);plot(ee);title('短时平均能量');xlabel('帧数');ylabel('能量');log = '正在求基音'
%求自相关
LE = ns;
re = e2;
tR = zeros(1, N);
kee = 1;%阈值
for i = 1:1:Nif ee(:, i) < kee*necontinueendR = zeros(1, LE);for k = 1:1:LEfor t = 1:1:LE-kR(1, t) = R(1, t) + re(i, t)*re(i, t + k);endend[~ ,tR(1, i)] = max(R);
end
%subplot(212);plot(tR);title('基音频率');xlabel('帧数');ylabel('幅度');f = tR;

%DTW.m
function dist = DTW(t,r)
%西安电子科技大学 windroid
%参考:http://www.cnblogs.com/luxiaoxun/archive/2013/05/09/3069036.html
%↑链接代码有问题
n = length(t);
m = length(r);
% 帧匹配距离矩阵
d = zeros(n,m);
for i = 1:nfor j = 1:md(i,j) = (t(:,i)-r(:,j))^2;end
end
% 累积距离矩阵
D = ones(n,m) * realmax;
D(1,1) = d(1,1);log = '正在DP'
% 动态规划
for i = 1:nfor j = 1:mif i>1D1 = D(i-1,j);if j>1D2 = D(i-1,j-1);D3 = D(i,j-1);elseD2 = realmax;D3 = realmax;endelseD1 = realmax;D2 = realmax;if j>1D3 = D(i,j-1);else%D3 = realmax;%此时 i == 1 && j == 1D(i, j) = d(i, j);continueendendD(i,j) = d(i,j) + min(min(D1,D2),D3);end
end
dist = D(n,m);

测试音频结果:







音乐评分系统MATLAB仿真相关推荐

  1. 高斯信道、单径Rayleigh信道和多径衰落信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列)

    前3节仿真了基带BPSK调制下DSSS-CDMA系统在高斯信道.单径Rayleigh衰落信道和多径衰落信道下的性能仿真,同时采用了m序列和正交Gold序列进行对比. 高斯信道下基带模型的多用户BPSK ...

  2. 多径衰落信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列)

    接上一节 单径Rayleigh信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列.Gold序列和正交Gold序列) 下面再来看一下m序列与正交Gold序列在多径衰落信道下的性能. ...

  3. 单径Rayleigh信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列)

    接上一节 高斯信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列.Gold序列和正交Gold序列) 下面再来看一下m序列与正交Gold序列在单径Rayleigh衰落信道下的性能. ...

  4. matlab仿真限幅发散,基于模糊控制的直流电机调速系统MATLAB仿真_贾东耀

    基于模糊控制的直流电机调速系统MATLAB 仿真 贾东耀,曾智刚 (广东工业大学,广州市 510090) 摘 要:采用Fuzzy-PI 控制策略进行直流电机的调速系统设计,它克服了简单模糊控制和传统P ...

  5. matlab中megn函数,直接序列扩频完整系统matlab仿真

    <直接序列扩频完整系统matlab仿真>由会员分享,可在线阅读,更多相关<直接序列扩频完整系统matlab仿真(9页珍藏版)>请在人人文库网上搜索. 1.直接序列扩频通信系统仿 ...

  6. matlab在数字传输系统,数字基带传输系统matlab仿真.doc

    数字基带传输系统matlab仿真 姓名:范浩如 学号:107551400879 数字通信作业:二进制调制最佳接收机的matlab仿真第一章 基础理论知识第一节 知识框架图 数字基带信号传输模型第一步: ...

  7. 光伏储能直流系统MATLAB仿真(PV光伏阵列+Boost DCDC变换器+负载+双向DCDC变换器+锂离子电池系统)

    PV光伏阵列+Boost DCDC变换器+负载+双向DCDC变换器+锂离子电池系统 资源地址: 光伏储能直流系统MATLAB仿真(PV光伏阵列+BoostDCDC变换器+负载+双向DCDC变换器+锂离 ...

  8. matlab 调速系统试验,实验三 开环直流调速系统Matlab仿真

    开环直流调速系统Matlab仿真 实训三 晶闸管开环直流调速系统的 MATLAB 仿真实训 一.实验实训目的 1.学习并掌握晶闸管开环直流调速系统模型建立及模型参数设置的方法和步骤. 2.熟悉并掌握系 ...

  9. matlab直接扩频序列,直接序列扩频系统matlab仿真.doc

    直接序列扩频系统matlab仿真.doc --0--直接序列扩频通信系统仿真一.实验的背景及内容1.直接扩频通信的背景扩频通信,即扩展频谱通信(SpreadSpectrumCommunication) ...

最新文章

  1. 语义分割--Pixel Deconvolutional Networks
  2. ICLR 6-6-6!自注意力可以替代CNN,能表达任何卷积滤波层丨代码已开源
  3. Mysql在字符串类型的日期上加上10分钟并和如今的日期做比較
  4. CSS 盒模型之外边距 margin属性
  5. #includealgorithm里的函数
  6. 5年单片机学习总结-ED China【转】
  7. 银行统一支付平台(介绍、架构)
  8. 一个免费全格式MP3音乐播放器的工具
  9. Excel VBA:数据管理与维护
  10. max等聚合函数和group by搭配使用的注意事项
  11. python-docx 标题字体设置失败如何解决?
  12. 【玖哥乱弹】祭天时不同程序员的不同杀法
  13. 数据标签体系与用户画像
  14. 黄冠|南昌大学计算机科学与技术,课制|这里有全华师最好看的课件
  15. 【JZOJ4884】【NOIP2016提高A组集训第12场11.10】图的半径
  16. spring和jump区别_jump和leap之间的区别
  17. htc hd2刷android,一代神机HTC HD2成功刷入Android 6.
  18. Bootstrap方法在R语言中的运用
  19. 很久没上来写点东西了,今天把N年前的代码看了一遍。随手写了点寄托哀思--多播委托...
  20. Git如何删除本地仓库

热门文章

  1. BAT54C做电源保护使用电路及理解
  2. GDB调试指南-单步调试
  3. TCP 连接的建立 断开
  4. mac 连接阿里云服务 ssh 一会自动断开
  5. uniapp - 超详细录音上传功能,点击开始录音 / 最后保存文件上传到服务器功能(附带详细示例源码及整个过程的实现方法,注释详细小白轻松上手改造)全端兼容!
  6. vue集成vis-network实现拓扑图
  7. gif透明背景动画_PS实用技巧——视频转GIF
  8. 美国夏令时与冬令时的区别
  9. CleanMyMac软件最新的版本下载安装详细教程
  10. 电商搜索全链路(PART I)Overview