【问题标题】:Help with FFT(Fast Fourier Transforms) and/or DSP帮助 FFT(快速傅里叶变换)和/或 DSP
【发布时间】:2011-04-09 23:21:16
【问题描述】:

我正在尝试做一个屏幕闪烁应用程序,它根据音乐闪烁屏幕(这将是频率,例如治疗频率等......)。 我已经制作了播放器并且知道如何使屏幕闪烁,但是我需要根据音乐使屏幕闪烁超快,例如如果音乐加快,则屏幕闪烁会更快。我知道我可以通过 FFT 或 DSP 来实现这一点(因为我只需要知道频率何时从一些 Hz 升高,比如说 20 来改变颜色,使屏幕闪烁)。

但我发现我什么都不懂,更不用说尝试在我的应用程序中实现它了。

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

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

PS:感谢您花时间阅读本文并愿意提供帮助。

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

【问题讨论】:

  • 如果您没有任何 DSP 经验,那么这可能会非常困难。我建议您查看 dspguide.com 上的免费在线书籍。几年前,当我被要求在没有任何经验的情况下使用 DSP 做一些事情时,我就是从这里开始的。但是,如果您没有数学背景来理解这一点,那么您需要先解决这个问题。
  • 我不明白你所说的“音乐(将是频率......”)是什么意思。你的意思是有一个主导频率,你想确定那个主导频率是什么?
  • 嗯,我不知道怎么说,因为英语不是我的母语,我的意思是这样的:youtube.com/watch?v=5tJGS2WKidY&feature=related
  • 我认为我没有数学背景,但我擅长数学并且我喜欢它,但我只有 17 岁,我见过的最后一个与数学相关的东西(除了“数字”)就像2-3 年前,所以我生锈了

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


【解决方案1】:

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

首先,您需要减少处理的数据量,因为每秒只有两三个节拍,但有数万个样本。您还需要查看不同的频率范围,因为某些类型的音乐在低音线中带有节奏,而其他类型的音乐在打击乐器或其他乐器中带有节奏。所以让信号通过几个带通滤波器(我选择了 8 个滤波器,每个滤波器覆盖一个八度,从低音到高音),然后通过平均数百个样本的功率来对每个频段进行下采样。

每隔几秒钟,您就会在每个波段中获得大约一千个样本。您的下一个工具是自相关,用于识别音乐中的重复模式。自相关的峰值告诉您节拍或多或少可能是什么;但是您需要编造一些启发式方法来比较所有频段,以找到您可以确信的节拍,并避免误导性切分音。如果你能做到这一点,那么你就会对节奏有一个合理的猜测,但不知道阶段(即何时闪烁屏幕)。

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

这有很多繁琐的细节,我花了几个星期才让它正常工作。这是一个难题。

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

【讨论】:

  • 我如何检测峰值?
  • @Sismetic:一种简单的方法是跟踪平均幅度,并寻找比平均幅度大得多的样本,并且在较小的距离(比如 100 毫秒)内大于所有其他样本他们。通过校正信号(使负样本为正)、平滑信号(使用低通滤波器)和寻找攻击(幅度突然增加),您可能会获得更好的结果,但这更复杂。
  • 我如何获得样品?对不起,我是一个真正的新手
  • @Sismetic:抱歉,我不知道如何获取音频流;这完全取决于您用来播放音频的内容。你说你制作了播放器——你能以某种方式从中获取音频数据吗?
  • 我不知道该怎么做
【解决方案2】:

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

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

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

如果我完全误解了您要执行的操作,并且您需要为不同的事情执行 FFT,那么您可能需要考虑使用现有的 FFT 库之一来为您完成繁重的工作。一些例子是FFTWKissFFT

【讨论】:

  • 我找到了 FFTW 库,但我不懂蹲 :P,我只需要知道什么时候闪屏,需要每秒闪屏几次
  • @Sismetic- 如果这就是你想要做的,那么不要担心 FFT。查看我链接的其他 SO 问题中的一些链接,以获取有关如何解决该问题的一些描述(特别是 GameDev 文章)。
  • @bta - 我不认为 BPM 中的节拍检测是我要寻找的,因为它不在音乐中我会应用这个,至少不是像三天恩典、邦乔维或 anthing 这样的普通音乐像那样。它的频率是数字化的,不使用贝斯、吉他或类似的东西。这就像以非常低的频率发出的声音,以诱使您进入某种状态(例如困倦或活跃)。很难用语言表达,但我希望我能正确表达自己
  • @Sismetic- 如果您使用纯音频率,那么您的工作真的很简单。声音的频率以每秒周期数来衡量,如果您想随着音调及时闪烁,那么您希望以相同的速率闪烁。无需计算。请注意,屏幕刷新速度可能不会超过 60-72 Hz,因此,如果您的音调高于该音调,您将需要使用该音调的一些谐波(将频率除以 2 的幂,直到您得到一个在屏幕的刷新率)。
  • 我如何获得音调(以编程方式,我的意思是,因为每个不同的音调频率将以每秒不同的周期播放,不是吗?)每个音调频率将播放(一个在一次)什么是谐波?
【解决方案3】:

听起来您可能正试图让您的可视化工具与 音乐不知何故。我认为计算 FFT 对您没有帮助。在任何 给定瞬间,整个音频频谱(大约 20 Hz 到 20 kHz)都会有许多同时出现的频率分量。但你可能对 音乐节奏(每分钟节拍 - 更像是 5 Hz 或更低),这不会显示 在原始音频信号的 FFT 中的任意位置。

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

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

【讨论】:

  • 如何进行实时峰值检测?
  • @Sismetic:请不要误会,但我认为您可能需要一个基本的音频处理教程,而不是适合 Stack Overflow 的简单答案或代码片段。 bta 发布了一些很好的链接——从那里向下钻取,你会发现一些很好的信息,尽管不一定是 C++。对于初学者的编程项目,您尝试做的事情有点困难......祝你好运!
  • 谢谢 Jim,我知道这有点难,但我爸爸离开了,这真的是我的第一个项目,就像开始学习 C++ 3 个月后,但我有信心,这是我认为我会遇到的最后一个问题,因为我已经解决了所有其他问题(显然)。谢谢你的回答,非常感谢
【解决方案4】:

我的建议是找到一个可以为您执行此操作的库。除非您有大量的数学知识来支持您,否则我认为您将浪费大量时间来尝试学习 FFT,而您真正想要的只是某种“每分钟基本命中”数字,您可以调整您的图形相应地。

看看这个类似的帖子: here

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

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

-布莱恩·J·斯蒂纳尔-

【讨论】:

  • 你能给我一个如何实现它的实际例子吗?
  • 如果我遇到你这种情况,我会开始使用“Vamp Plugin”系统。从这个角度来看,他们似乎有一个方法,该方法将音轨和采样方法作为输入,并返回给您(除其他外)一个速度数据结构,其中包括每分钟的节拍,以及某种计时机制将速度与音轨中的时间点相关联。但是,很抱歉,我没有准备好执行此操作的有效示例。
  • 谢谢,我会研究 Vamp 插件
【解决方案5】:

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

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

【讨论】:

  • 我看到了,右边的红条正是我想要的,我正在查看代码,看看他们是如何做到的:P Ty 提示
  • 右边的红条是LevelMeter类渲染的。它显示两个信号: RMS 信号电平,应用了少量平滑;和最近的峰值信号电平,随时间衰减。请注意,此信号不会为您提供节拍速度的准确测量,因为它通常包含太多噪声。正如其他回复中指出的那样,您需要进行一些更复杂的处理来检测音乐的节奏。
  • 哦,谢谢你告诉我在哪里可以找到那个特定的部分。非常感谢,你的是我今天发现的最有用的(虽然大家的帖子也很有用)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 2021-07-12
相关资源
最近更新 更多