使用快速傅里叶变换(FFT)分离不同乐器的声音,对于MP3格式的文件是否可行?

6
我正在制作一款音乐可视化软件,希望为每种乐器显示不同的可视化元素。例如,蓝色条代表人声,红色条代表吉他,黄色条代表鼓等等。
有没有办法通过FFT分析结果来获取这些信息呢?
谢谢。
2个回答

12

这是音乐技术领域的一个研究热点挑战。

在一定程度上是可能的,但肯定不容易。使用mp3格式会更加困难,因为在压缩过程中会丢失很多重要的信息。

您所尝试的是音频源分离或声源分离,旨在将音频记录分解成其组成元素。

这些元素可以是语音(多人同时说话的情况-“鸡尾酒会问题”)或乐器(从录音中分离出一种乐器而不影响其他乐器-“盲源分离”)。

有各种方法可以采用,其中一些基于声音的频域特性,另一些则基于空间属性。

如果你正在尝试分离低音鼓和长笛(例如,FFT的低频区间将指定低音鼓,高频区间将指定长笛),那么基于频域的方法可能看起来相当简单。然而,现实中的声音很少被整齐地分割成有用的频率区域。例如,低音鼓将具有整个频谱范围内的谐波内容。这些类型的解决方案因此非常复杂,通常涉及统计建模。很艰涩。

基于声音空间属性的分离通常依赖于在录制之前了解每个声源的位置(这是“非盲”的情况)。通常需要多个麦克风(至少采用立体声录制)。通过使用一些巧妙的数学方法,可以根据每个麦克风上的信号关系来接近分离各个源。这也是称为波束成形的一种技术的基础,该技术可以使用一组麦克风确定源的位置。

因此,人们正在尝试做到这一点,但它很复杂,使用mp3格式将使您的生活变得更加困难!

我恐怕不知道足够的知识来更好地解释这些方法,但我可以找到一些参考资料供您开始:

http://www.cs.tut.fi/~tuomasv/demopage.html

http://www.cs.northwestern.edu/~pardo/courses/eecs352/lectures/source%20separation.pdf(PDF警告!)

祝你好运!


另外一个链接:http://itakura.kes.tul.cz/zbynek/tddeconv.htm <- 这个人整理了一些Matlab代码。 - Speedy

4

对于人声和低音,你可以利用它们通常位于立体声混音的中心这一事实。这意味着它们在左右声道中具有完全相同的波形。如果你从一个声道中减去另一个声道,你将得到一个新的声道,通常不会包含人声和低音。

类似于:

sound = LoadMP3(...)
length = sound.SampleCount
left = sound.Channels[LEFT]
right = sound.Channels[RIGHT]
for i = 0:length
    difference[i] = left[i] - right[i]

现在你可以看一下聪明的方法来可视化FFT(左)、FFT(右)和FFT(差异)。也许这会朝着你想要的效果迈出一小步?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接