我试图找到一种方法来比较使用 MATLAB 在不同乐器上播放的相同音符的短 500 毫秒录音的相似性。
详细讨论这个特定主题:我是一名音乐专业的学生,我的任务是客观地确定各种现代低铜管乐器的音调,以确定什么乐器应该取代过时的“ophicleide”或低音键号角。我首先对它的光谱仪和其他 6 种仪器进行了视觉比较,但这种方法过于主观。
我用相同的麦克风、设备、增益电平和相同的音符录制了所有乐器。出于这个原因,我相信信号足够相似,可以使用 MATLAB 工具。
我相信比较将fft
是最准确的计算。我首先尝试了频域相关性,并测试了相同音调的不同片段(eu
和eu2
是变量)
>> 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)它也可能是相位的原因,甚至总振幅。
有谁知道比较这些复杂波形的谐波比例的更好的清晰方法?
还是我在叫错树?