jjzjj

c++ - 帮助 FFT(快速傅里叶变换)和/或 DSP

coder 2024-02-18 原文

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

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

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

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

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

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

最佳答案

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

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

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

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

这里面有很多繁琐的细节,我花了几个星期才让它运行良好。这是一个难题。

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

关于c++ - 帮助 FFT(快速傅里叶变换)和/或 DSP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3671935/

有关c++ - 帮助 FFT(快速傅里叶变换)和/或 DSP的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  3. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  4. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  5. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  6. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

    我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

  7. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  8. ruby - 帮助使用 Ruby 中的 "Whenever"gem 来执行 cron 任务 - 2

    我以前没有使用过cron,所以我不能确定我这样做是对的。我想要自动化的任务似乎没有运行。我在终端中执行了这些步骤:sudogeminstall每当切换到应用程序目录无论何时。(这创建了文件schedule.rb)我将此代码添加到schedule.rb:every10.minutesdorunner"User.vote",environment=>"development"endevery:hourdorunner"Digest.rss",:environment=>"development"end我将此代码添加到deploy.rb:after"deploy:symlink","depl

  9. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  10. ruby - 如何以表格格式快速打印 Ruby 哈希值? - 2

    有没有办法快速将表格格式的ruby​​哈希打印到文件中?如:keyAkeyBkeyC...1232343451253474456...其中散列的值是不同大小的数组。还是使用双循环是唯一的方法?谢谢 最佳答案 试试我写的这个gem(在表中打印散列、ruby对象、ActiveRecord对象):http://github.com/arches/table_print 关于ruby-如何以表格格式快速打印Ruby哈希值?,我们在StackOverflow上找到一个类似的问题:

随机推荐