matlab - MATLAB中乐器的 "Tone"比较

标签 matlab signal-processing fft pitch-tracking

关闭。这个问题不满足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

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

Euphonium 和 Bass Clarinet (basscl) 具有完全不同的声音和完全不同的谐波系列,但这些公式比 Euphonium 和 Ophicleide 表现出更密切的相关性,它们的频段看起来几乎完全相同。

我担心这些相关性显示了真实音高的相关性(我在所有这些乐器上演奏相同的音符,但 Ophicleide 可能会失调高达 1 Hz)它也可能是相位的原因,甚至总振幅。

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

还是我叫错了树?

最佳答案

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

不幸的是,乐器音符信号不太可能是静止的,因为在对相同音符在不同乐器上对人耳“听起来”的差异进行分类时,最重要的特征是由于谐波和调制,这很可能是时间随音符的持续时间变化。

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

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

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

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

相关文章:

python - 如何匹配同一数据集的 lomb-scargle 和 FFT 图?

java - 使用 FFT 进行频谱分析、基频推导

c - 在哪里可以找到 radix-5 FFT 实现?

python - 如何在嘈杂的曲线中找到拐点?

matlab - 将 DICOM 数据读入元胞数组的性能问题

matlab - 确定每个四分音符的脉冲

c++ - sepFilter2D Opencv 意外结果

CMSIS DSP 库中的复杂点积

winapi - 流畅播放实时网络音频样本

matlab - 通过傅立叶空间填充进行插值