有没有办法通过FFT分析结果来获取这些信息呢?
谢谢。
这是音乐技术领域的一个研究热点挑战。
在一定程度上是可能的,但肯定不容易。使用mp3格式会更加困难,因为在压缩过程中会丢失很多重要的信息。
您所尝试的是音频源分离或声源分离,旨在将音频记录分解成其组成元素。
这些元素可以是语音(多人同时说话的情况-“鸡尾酒会问题”)或乐器(从录音中分离出一种乐器而不影响其他乐器-“盲源分离”)。
有各种方法可以采用,其中一些基于声音的频域特性,另一些则基于空间属性。
如果你正在尝试分离低音鼓和长笛(例如,FFT的低频区间将指定低音鼓,高频区间将指定长笛),那么基于频域的方法可能看起来相当简单。然而,现实中的声音很少被整齐地分割成有用的频率区域。例如,低音鼓将具有整个频谱范围内的谐波内容。这些类型的解决方案因此非常复杂,通常涉及统计建模。很艰涩。
基于声音空间属性的分离通常依赖于在录制之前了解每个声源的位置(这是“非盲”的情况)。通常需要多个麦克风(至少采用立体声录制)。通过使用一些巧妙的数学方法,可以根据每个麦克风上的信号关系来接近分离各个源。这也是称为波束成形的一种技术的基础,该技术可以使用一组麦克风确定源的位置。
因此,人们正在尝试做到这一点,但它很复杂,使用mp3格式将使您的生活变得更加困难!
我恐怕不知道足够的知识来更好地解释这些方法,但我可以找到一些参考资料供您开始:
http://www.cs.tut.fi/~tuomasv/demopage.html
http://www.cs.northwestern.edu/~pardo/courses/eecs352/lectures/source%20separation.pdf(PDF警告!)
祝你好运!
对于人声和低音,你可以利用它们通常位于立体声混音的中心这一事实。这意味着它们在左右声道中具有完全相同的波形。如果你从一个声道中减去另一个声道,你将得到一个新的声道,通常不会包含人声和低音。
类似于:
sound = LoadMP3(...)
length = sound.SampleCount
left = sound.Channels[LEFT]
right = sound.Channels[RIGHT]
for i = 0:length
difference[i] = left[i] - right[i]