我正在尝试做一个屏幕闪烁的应用程序,它根据音乐(这将是频率,如治疗频率,等等)闪烁屏幕。我已经制作了播放器,我知道如何使屏幕闪光,但我需要根据音乐使屏幕闪光超级快,例如,如果音乐速度加快,屏幕闪光将更快。我知道我会通过FFT或DSP来实现这一点(因为我只需要知道当频率从某个Hz上升时,假设20赫兹就可以改变颜色,使屏幕闪烁)。
但我发现我什么都不懂,更不用说尝试在我的应用程序中实现它了。
有没有人能帮我学习他们中的任何一个?我的邮箱是sismetic_chaos@hotmail.com。我真的需要帮助,我已经被困了3天,根本没有编码或做任何事情,试图理解,但我没有。
PS:我的应用程序是用C++和Qt编写的。
PS:感谢你花时间阅读这篇文章,并愿意提供帮助。
编辑:感谢所有人的答案,问题还没有解决,但我感谢所有的答案,我没想到我会得到这么多的答案和信息。感谢你们所有人。
发布于 2010-09-09 08:37:02
这是一个困难的问题,需要的不仅仅是FFT。我将简要描述我在为专业DJ设备编写软件时是如何实现节拍检测的。
首先,您需要减少正在处理的数据量,因为每秒只有两到三个节拍,但却有数万个样本。你还需要查看不同的频率范围,因为一些类型的音乐以低音线为节奏,而其他类型的音乐以打击乐或其他乐器为节奏。因此,将信号通过几个带通滤波器(我选择了8个滤波器,每个滤波器覆盖一个八度,从低音到高音),然后通过对数百个样本的平均功率来对每个频带进行下采样。
每隔几秒钟,你就会在每个波段有一千个左右的样本。你的下一个工具是自相关,用来识别音乐中的重复模式。自相关的峰值告诉你拍子或多或少可能是什么;但你需要编造一些启发式方法来比较所有的频带,以找到你可以自信的拍子,并避免误导性的切分。如果你能做到这一点,那么你就会对节奏有一个合理的猜测,但对阶段却一无所知(即确切地说何时闪屏)。
现在,您可以查看峰值的音频数据的平滑版本,其中一些峰值可能对应于节拍。最初,在几秒钟的过程中寻找最强的峰值,并将其视为悲观情绪。结合您在第一阶段中估计的节奏,您可以预测下一个节拍何时到期,并测量您实际看到的地方,如节拍,并调整您的估计以更接近于数据。您还可以根据预测的节拍与测量的峰值的匹配程度来维护置信度;如果该值降得太低,则从头开始重新启动节拍检测。
这有很多繁琐的细节,我花了几个星期才让它很好地工作。这是一个困难的问题。
或者,对于简单的可视化效果,您可以简单地检测峰值并为每个峰值闪烁屏幕;它可能看起来足够好了。
发布于 2010-09-09 05:42:52
FFT的输出将为您提供音频样本的频谱,但从FFT输出中提取节拍可能不是您想要的方式。
您可以做的一件事是使用峰值检测来识别音量“尖峰”,这些“尖峰”通常出现在音乐的“低拍”上。如果您能够识别出慢节奏,那么您就可以使用诸如bpmdatabase.com之类的资源来查找歌曲的节奏。节拍会告诉你闪光有多快,你检测到的峰值会告诉你什么时候开始闪光。让你的应用程序监控你的闪光,以确保它们通常与峰值同时发生(如果两者开始背离,那么节奏可能在歌曲中途改变)。
这听起来可能很简单,但实际上这不是一件容易实现的事情。您可能想要阅读this SO question以了解更多信息。答案中有一些高质量的链接。
如果我完全错误地解释了您正在尝试做的事情,而您需要做一些不同的FFT,那么您可能想要考虑使用现有的FFT库来为您完成繁重的工作。FFTW和KissFFT就是一些例子。
发布于 2010-09-09 05:28:49
这听起来像是你试图让你的视觉化工具以某种方式随着音乐及时闪现屏幕。我不认为计算FFT在这里对你有帮助。在任何给定的时刻,音频频谱(大约20 Hz到20 kHz)上都会有许多同时的频率分量。但您可能对音乐节奏(每分钟的节拍--更像是5 Hz或更低)更感兴趣,而这不会在原始音频信号的FFT中显示出来。
您可能需要更简单的东西--某种实时峰值检测。当你看到一个峰值高于平均音量的某个阈值时,让你的屏幕闪烁。
当然,更复杂的可视化可能会很好地利用FFT,但不是你所描述的那个。
https://stackoverflow.com/questions/3671935
复制相似问题