基于Matlab MIRToolbox的音乐信号分析和音符提取

项目背景和技术分析

音符提取与编辑商业解决方案:Melodyne5 Studio

在这里插入图片描述

测试样例选用依据:

东方的竹笛是音色和奏法最复杂的单声部乐器之一,本测试样例中含有滑音、颤音等奏法,可以很好地检测音符提取系统对瞬态和谐波的响应能力。

工程代码

%% filepath and paras
filename = 'testAudio_edited.wav';
threshold = 0.6;
%% input
sig=audioread(filename);
sig=sig(:,1);
m_sig=miraudio(sig,48000);
%% Get Envelope of notes
% pre-processing
f = mirfilterbank(m_sig, 'Channels', 1);
p = mirenvelope(f, 'Normal');
% peak detection
peak = mirpeaks(p, 'Threshold', threshold);
peak_times = mirgetdata(peak);
% get envelope
seg = mirsegment(m_sig, peak);
pos = get(seg, 'FramePos');
num_notes = length(pos{1});
% display
disp('音符的起止时间:');
for i = 1:num_notes
    disp(['音符 ', num2str(i), ': 起始时间 ', num2str(pos{1}{i}(1)), ' 结束时间 ', num2str(pos{1}{i}(2))]);
end
%% Pitch detection
fs=48000;
sig=audioread("testAudio_edited.wav");
sig=sig(:,1);
m_sig=miraudio(sig,fs);
[p,ac]=mirpitch(m_sig,'Frame','Compress',0.8,'Gammatone');
% display
mirautocor(ac)

函数默认运行结果

默认参数为: Compression=0.5; threshold=0.3; filterbank=’NoFilterbank’

结果展示:

在这里插入图片描述
在这里插入图片描述

结果分析:

音符的音高分析部分与melodyne的结果在形态学上较为相似,但音高的锚定点、细节和干扰的纠正能力不足。至于音符的时间信息则差之甚远,密密麻麻且缺少逻辑和辨识度,估测是由于长笛复杂的谐波结构干扰了阈值附近的触发。

参数说明

  • ‘Compress’ in mirpitch
    • 自相关曲线中峰值的宽度(集中程度)
  • ‘filterbank’ in mirpitch
    • 选用的预滤波器组
    • 可选*‘2Channels’, ‘Gammatone’* 或 ‘NoFilterbank’.
  • ‘threshold’ in mirpeaks
    • 判定为完整音符持续时间的阈值

程序调整过程

  1. 调整Compress为0.8后的光谱结果如下:
    在这里插入图片描述

    可以发现能量更为集中,有效过滤了低频干扰,使得结果更为纯净,同时颤音和滑音的细节都得以保留,是较为理想的参数值。

  2. 调整filterbank为’Gammatone‘的结果如下:

    在这里插入图片描述

    Gammatone是基于ERB的心理声学滤波器组,心理声学模型在音频压缩中有很重要的地位,但在音乐特征提取上引入了失真并滤除了部分细节信息,极大程度地恶化了音频光谱。由此可见不采用滤波器或仅采用带通滤波对于音符提取而言更加合适,因为它们能更好地还原声音本身。

  3. 调整threshold为0.6的结果如下:
    在这里插入图片描述

    提高threshold后音符的数量明显减少,相当于进行了一个平滑滤波的降噪处理。其中已经能辨别出如音符1、2是开头滑音带来的短音符,3、5是持续超过1秒的连续音符;数量上也与人耳能够分辨的大致接近,能够初步提供音符时间分割参照的功能。

遇到的问题以及如何解决

  1. MIRToolbox和Matlab的版本兼容性问题:

    由于新版本的matlab移除了wavread函数,MIRToolbox无法直接由文件路径调用函数读取,解决方法是用新版的audioread函数读入矩阵,再将单列向量入数miraudio形成MIRToolbox支持的对象。

  2. 结果显示的问题:

    根据之前的编程习惯,在语句最后统一加上分号后发现,程序没有报错,但也没有结果输出。去掉行末的分号即可解决该问题,且matlab不会将此分号确实报告为提示。

总结

本实验综合了许多音乐信号分析的知识,如autocorrelation, peak detection, envelope extraction等等,调整参数后能够达到近似于Melodyne的识别结果,但对于其他音频可能需要再次调整参数以进行适应。

  • 32
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值