比较" Tone" MATLAB中的乐器

时间:2014-06-01 21:32:50

标签: matlab signal-processing fft pitch-tracking

我试图找到一种方法来比较使用MATLAB在不同乐器上播放的相同音符的短500毫秒录音的相似性。

详细介绍这个特定主题:我是一名音乐专业学生,他的任务是客观地确定各种现代低铜乐器的音调,以确定哪种乐器应该取代过时的“ophicleide”或Bass keyed号角。我首先使用它的光谱仪和其他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)它也可以说明相位,甚至总幅度。

有没有人知道在比较这些复杂波形的谐波泛音的比例时有更好的明确方法?

还是我在错误的树上吠叫?

2 个答案:

答案 0 :(得分:2)

关于您的具体问题,您计算的数量基本上是光谱相干函数的最大值。问题在于,如果信号在统计上是静止的,则光谱相干性仅是两个信号之间相关性的良好量度。也就是说,如果信号中频率的概率分布不随时间变化。

不幸的是,乐器音符信号不太可能是静止的,因为在对同一音符"声音"之间的差异进行分类时,最重要的功能非常重要。不同乐器上的人耳是由于在音符持续时间内可能随时间变化的谐波和调制。

因此,您不需要使用频谱相干性,而是需要频域或时频域度量,以更好地捕获非静态部分之间的相似性。 注意光谱。

此时,选择MATLAB的问题就不那么简单了(尽管从Signal Processing Toolbox文档中查看this example可能会帮助您入门,如果您有这个工具箱) 。这更像是研究信号处理和特征分类技术的问题。在这里你真的要去关于音乐声学的文献。这是just one abstract link - 我无法访问ACM,但如果您是学生,您可以通过您的大学访问。

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

答案 1 :(得分:1)

我不是这个主题的专家,但我知道有几个音频功能可以帮助解决这些问题:线性预测编码(LPC)和梅尔频率倒谱系数(MFCC)

快速搜索将显示大量信息。作为一个例子,我发现this onethis one(没有读过它们,但它们看起来很相关)。

这应该让你开始。根据您的兴趣,您可以深入了解此主题。例如,有一件事是比较不同乐器演奏的音符的稳定状态,但我的理解是瞬态(攻击)在感知上非常相关。

祝你好运!