我正在尝试使用MATLAB比较不同乐器演奏的同一音符的500毫秒短录音的相似度。
具体而言,我是一个音乐学生,被要求客观地确定各种现代低音铜管乐器的音色,以确定哪种乐器可以替代过时的“双音键大号”或低音单簧管。我首先使用了对其和其他6种乐器的光谱图形进行视觉比较,但这种方法太主观了。
我用相同的麦克风、设备、增益水平和相同的音符录制了所有的乐器。因此,我认为这些信号足够相似,可以使用MATLAB工具。
我认为比较fft
会是最准确的计算方法。起初我尝试了频域相关性,并测试了同一音调的不同片段(eu
和eu2
是变量)。
>> 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赫兹),它也可能考虑到相位,甚至总振幅。
有人知道比较这些复杂波形的谐波倍频比例的更好方法吗?
还是我在错误的方向上努力?