帮助FFT(快速傅立叶变换)和/或DSP

时间:2010-09-08 21:10:35

标签: c++ qt screen signal-processing fft

我试图做一个屏幕闪烁的应用程序,根据音乐闪烁屏幕(这将是频率,如愈合频率等......)。 我已经制作了播放器并且知道如何让屏幕闪烁,但是我需要根据音乐使屏幕快速闪烁,例如如果音乐加速,屏幕闪光会更快闪烁。我知道我会通过FFT或DSP实现这一点(因为我只需要知道频率从某些Hz升高时,让我们说20改变颜色,使屏幕闪烁)。

但是我发现我理解没什么,甚至更少尝试将它实现到我的应用程序中。

有人可以帮助我学习他们两个吗?我的电子邮件是sismetic_chaos@hotmail.com。我真的需要帮助,我已经被困了3天没有编码或做任何事情,试图理解,但我不喜欢。

PS:我的应用程序是用C ++和Qt编写的。

PS:感谢您花时间阅读此内容以及愿意提供帮助。

编辑:感谢大家的答案,问题尚未解决,但我很欣赏所有的答案,我没想到会得到这么多的答案和信息。谢谢大家。

5 个答案:

答案 0 :(得分:3)

FFT的输出将为您提供音频样本的频谱,但从FFT输出中提取速度可能不是您想要的方式。

您可以做的一件事是使用峰值检测来识别通常出现在音乐“下拍”中的音量“尖峰”。如果您可以识别下拍,那么您可以使用bpmdatabase.com之类的资源来查找歌曲的速度。速度会告诉您闪光的速度有多快,您检测到的峰值会告诉您何时开始闪烁。让您的应用程序监控您的闪光灯以确保它们通常与峰值同时出现(如果两者开始发散,那么节奏可能在歌曲中期发生变化)。

这可能听起来很简单,但这实际上是一件非常重要的事情。您可能需要阅读this SO question以获取更多信息。答案中有一些高质量的链接。

如果我完全误解了你要做的事情并且你需要为不同的东西做FFT,那么你可能想看看使用现有的FFT库之一为你做繁重的工作。一些示例是FFTWKissFFT

答案 1 :(得分:3)

这是一个难题,需要的不仅仅是FFT。我将简要介绍在为专业DJ设备编写软件时如何实现节拍检测。

首先,你需要减少你正在处理的数据量,因为每秒只有两到三个节拍,但成千上万的样本。您还需要查看不同的频率范围,因为某些类型的音乐会在低音线中播放节奏,而其他类型的音乐则在打击乐器或其他乐器中播放。因此,通过几个带通滤波器传递信号(我选择8个滤波器,每个滤波器覆盖一个八度音阶,从低音到高音),然后通过平均几百个样本的功率对每个频段进行下采样。<​​/ p>

每隔几秒,你就会在每个乐队中拥有大约一千个样本。您的下一个工具是自相关,以识别音乐中的重复模式。自相关的高峰告诉你节拍的可能性或多或少;但你需要编制一些启发式算法来比较所有频段,以找到你可以信赖的节拍,并避免误导性的切分。如果你可以管理它,那么你将对速度有一个合理的猜测,但不知道相位(即确切地何时闪烁屏幕)。

现在,您可以查看峰值音频数据的平滑版本,其中一些可能与节拍相对应。最初,在几秒钟内寻找最强的峰值并将其视为悲观。结合您在第一阶段估计的速度,您可以预测下一个节拍到期的时间,并测量您实际看到的节拍类型,并调整您的估计值以更接近地匹配数据。您还可以根据预测的节拍与测量峰值的匹配程度来保持置信水平;如果降得太低,则从头开始重新开始节拍检测。

这里有很多细节,我花了好几个星期的时间才能让它运转良好。这是一个难题。

或者对于简单的可视化效果,您可以简单地检测峰值并为每个峰值闪烁屏幕;它可能看起来不错。

答案 2 :(得分:0)

听起来好像你正试图让你的可视化工具及时闪现屏幕 音乐莫名其妙。我不认为计算FFT会对你有所帮助。在任何 在瞬间,在整个音频频谱(大约20 Hz到20 kHz)内将会有许多同步频率分量。但你很可能对这个问题更感兴趣 音乐节奏(每分钟节拍 - 更像是5赫兹或更低),这是不会显示的 在原始音频信号的FFT中的任何地方。

您可能需要更简单的东西 - 某种实时峰值检测。 每当您看到峰值高于某个阈值高于平均音量时, 让你的屏幕闪烁。

当然,更复杂的可视化可能会利用FFT, 但不是你所描述的那个。

答案 3 :(得分:0)

我的建议是找一个能为你做这件事的图书馆。除非你有很多数学支持你,否则我认为当你真正想要的是某种“每分钟基本命中数”时,你会浪费大量的时间来学习FFT,你可以调整你的相应的图形。

查看此类似帖子: here

我花了大约三个星期的时间来理解FFT背后的数学,然后又花了一周的时间来使用这些概念在Matlab中编写一些东西。如果您在三天后气馁,请不要尝试自己动手。

我希望这是有用的建议,而不是令人沮丧。

-Brian J. Stinar -

答案 4 :(得分:0)

正如之前的答案所指出的,FFT可能不是您解决问题所需的工具,这需要速度检测而非光谱分析。

有关可以使用FFT完成的示例 - 以及如何将特定FFT实现集成到Qt应用程序中的示例,请查看描述频谱分析器演示的this blog post我开发了。演示代码随Qt本身一起提供在demos/spectrum目录中。