Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。












想要改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

2年前关闭。



Improve this question




我试图找到一种方法,使用在不同乐器上演奏的同一音符的MATLAB,比较短500毫秒录音的相似度。

关于这个特定主题的细节:我是一名音乐专业的学生,​​他的任务是客观地确定各种现代低铜乐器的音色,以确定哪种乐器应该代替过时的“ophicleide”或低音键号角。我首先对它与其他6种仪器的光谱仪进行了视觉比较,但是这种方法过于主观。

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

我相信比较fft将是最准确的计算。首先,我尝试了频率域相关性,并测试了相同音调的不同段(eueu2是变量)
>> corr(abs(fft(eu)),abs(fft(eu2)))
ans = 0.9963

这是朝正确方向迈出的一步,但是当我比较不同的信号时,我似乎得到了相反的结果:(上低音号和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

上低音号和低音单簧管(basscl)的声音完全不同,谐波序列也完全不同,但是这些公式显示出比上低音号和Ophicleide更紧密的相关性,后者的频段几乎就像是完全相同的匹配项。

我担心这些相关性会显示出真实音高的相关性(我在所有这些乐器上都演奏相同的音符,但是Ophicleide可能不协调高达1 Hz)。总振幅。

有谁知道比较这些复杂波形的谐波泛音比例更好的清晰方法?

还是我吠错了树?

最佳答案

关于您的特定问题,您计算出的数量本质上是光谱相干函数的最大值。问题在于,如果信号在统计上是固定的,则频谱相干性仅是两个信号之间相关性的良好度量。即,如果信号中频率的概率分布不随时间变化。

不幸的是,乐器音符信号不太可能是固定的,因为在区分同一音符在不同乐器上对人耳的“声音”之间的差异时,最重要的功能是归因于谐波和调制的时间超过了可能的时间。在音符的持续时间内变化。

因此,与其使用频谱相干性,不如需要一个频域或时频域度量标准,以更好地捕获非平稳部分之间的相似性。
注意光谱。

在这一点上,选择哪个MATLAB函数的问题就不那么多了(尽管有信号处理工具箱的文档,看看this example可能会帮助您入门)。这更多是研究信号处理和特征分类技术的问题。在这里,您确实必须查阅有关音乐声学的文献。这是just one abstract link-我没有访问ACM的权限,但是如果您是学生,则可以通过您的大学访问。

祝您好运,这听起来像是一个有趣的问题!

关于matlab - 比较MATLAB中乐器的 "Tone",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23984712/

10-12 23:53