在MATLAB中比较乐器的音色

10

我正在尝试使用MATLAB比较不同乐器演奏的同一音符的500毫秒短录音的相似度。

具体而言,我是一个音乐学生,被要求客观地确定各种现代低音铜管乐器的音色,以确定哪种乐器可以替代过时的“双音键大号”或低音单簧管。我首先使用了对其和其他6种乐器的光谱图形进行视觉比较,但这种方法太主观了。

我用相同的麦克风、设备、增益水平和相同的音符录制了所有的乐器。因此,我认为这些信号足够相似,可以使用MATLAB工具。

我认为比较fft会是最准确的计算方法。起初我尝试了频域相关性,并测试了同一音调的不同片段(eueu2是变量)。

>> corr(abs(fft(eu)),abs(fft(eu2)))
ans = 0.9963

这是朝着正确方向迈出的一步,但当我比较不同信号时,似乎得到了相反的结果:(euphonium和ophicleide的声音几乎完全相同)

>> corr(abs(fft(eu)),abs(fft(ophi)))  
ans =   0.5242

虽然低音号和低音单簧管的声音完全不同,但它们之间存在更高的相关性。

>> corr(abs(fft(eu)),abs(fft(basscl)))   
ans = 0.8506

我尝试了一个在线找到的标准化最大互相关幅度公式,但是我得到了相同的结果。

>> norm_max_xcorr_mag = @(x,y)(max(abs(xcorr(x,y)))/(norm(x,2)*norm(y,2))); x =eu2; y = eu; norm_max_xcorr_mag(x,y)
ans =   0.9638

当比较其他样本时,我得到了类似的结果。

 >> norm_max_xcorr_mag = @(x,y)(max(abs(xcorr(x,y)))/(norm(x,2)*norm(y,2))); x = eu; y = basscl; 
ans = 0.6825

相比之下

>> norm_max_xcorr_mag = @(x,y)(max(abs(xcorr(x,y)))/(norm(x,2)*norm(y,2))); x = eu; y = ophi; norm_max_xcorr_mag(x,y)
ans = 0.3519

低音号和低音单簧管的声音和谐波序列完全不同,但这些公式显示的相关性比低音号和欧菲克莱德更接近,后者的频率带几乎看起来像完全匹配。

我担心这些相关性正在展示真实音高的相关性(我在所有这些乐器上演奏相同的音符,但欧菲克莱德可能会失调最多1赫兹),它也可能考虑到相位,甚至总振幅。

有人知道比较这些复杂波形的谐波倍频比例的更好方法吗?

还是我在错误的方向上努力?


1
有趣的问题!正如你所说,如果音符走调,我认为这可能会扭曲相关系数。也许你可以对其中一个信号应用一系列音高变化(通过时间域重新采样),从-2 Hz到2 Hz(针对特定的演奏音符),然后选择与其他音频文件具有最高相关性的变化。这样,你就可以纠正可能存在的音准问题。 - Luis Mendo
你解决了这个问题吗?我很感兴趣你是怎样求得音高的,你使用了什么类似于z-chirp变换来获取缩放的fft谱以确定音高吗? - Trilarion
2个回答

2
关于你的具体问题,你计算出来的数量实际上是谱相干函数的最大值。问题在于,如果信号不是统计平稳的,则谱相干只能作为衡量两个信号之间相关性的良好指标。也就是说,如果信号中频率的概率分布随时间变化,则不能进行有效的测量。
不幸的是,乐器音符信号很可能不是平稳的,因为分类不同乐器演奏相同音符所依据的特征,往往与调制和谐波有关,这种特征在音符持续时间内多半是时变的。
因此,你需要使用更能捕捉音符谱中非平稳部分相似性的频域或时频域指标,而不是使用谱相干。
此时,问题不再是选择哪些MATLAB函数(尽管查看信号处理工具箱文档中的这个例子可能会对你有所帮助),而是研究信号处理和特征分类技术。在这里,你必须去查阅有关音乐声学的文献。这里有一个摘要链接,我没有ACM的访问权限,但如果你是学生,可能可以通过你所在大学来获得访问权限。
祝你好运,这听起来是一个有趣的问题!

你的观察是正确的,攻击、释放和颤音是其他独特的特征。铜管乐器上的颤音在这个时期“应该”不会被使用,而是由演奏者进行修改。Ophicleide的攻击时间是现代阀门乐器的三倍左右(约35毫秒)。我将在本章中包含这些信息。我所拥有的样本是静止的,因为我只讨论“音色”或乐器的频谱。但是你链接的那篇文章...!!! Centroid Mean目前运作良好!! 我会更新的。 - Euphman
重心平均值按感知“亮度”对声音进行排序,这是我发现的最佳音质客观测量。 - Euphman

1
我虽然不是该主题的专家,但我知道有一些音频特征可以帮助解决这些问题:线性预测编码(LPC)和梅尔倒谱系数(MFCCs)。
快速搜索就可以找到大量信息。例如,我找到了this onethis one(没有阅读它们,但它们看起来相关)。
这应该能帮助你入门。根据您的兴趣,您可以深入研究这个主题。例如,一件事情是比较不同乐器演奏的音符的稳态,但我的理解是瞬态(攻击)在知觉上极其重要。
祝好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接