使用 FFT 执行音频分析

2024-05-13

我已经被这个问题困扰好几天了,并且浏览了几乎所有相关的 StackOverflow 页面。通过这次活动,我现在对 FFT 是什么及其工作原理有了更深入的了解。尽管如此,我在将其实现到我的应用程序中时遇到了极大的困难。

简而言之,我想做的是为我的应用程序制作一个频谱可视化工具(类似于this http://a3.mzstatic.com/us/r30/Purple/v4/19/5e/83/195e83f1-1e87-0b22-a726-881dd719672c/screen568x568.jpeg)。根据我收集的信息,我非常确定我需要使用声音的大小作为条形的高度。因此,考虑到所有这些,目前我能够一次分析整个 .caf 文件。为此,我使用以下代码:

    let audioFile = try!  AVAudioFile(forReading: soundURL!)
    let frameCount = UInt32(audioFile.length)

    let buffer = AVAudioPCMBuffer(PCMFormat: audioFile.processingFormat, frameCapacity: frameCount)
    do {
        try audioFile.readIntoBuffer(buffer, frameCount:frameCount)
    } catch {

    }
    let log2n = UInt(round(log2(Double(frameCount))))

    let bufferSize = Int(1 << log2n)

    let fftSetup = vDSP_create_fftsetup(log2n, Int32(kFFTRadix2))

    var realp = [Float](count: bufferSize/2, repeatedValue: 0)
    var imagp = [Float](count: bufferSize/2, repeatedValue: 0)
    var output = DSPSplitComplex(realp: &realp, imagp: &imagp)

    vDSP_ctoz(UnsafePointer<DSPComplex>(buffer.floatChannelData.memory), 2, &output, 1, UInt(bufferSize / 2))

    vDSP_fft_zrip(fftSetup, &output, 1, log2n, Int32(FFT_FORWARD))

    var fft = [Float](count:Int(bufferSize / 2), repeatedValue:0.0)
    let bufferOver2: vDSP_Length = vDSP_Length(bufferSize / 2)
    vDSP_zvmags(&output, 1, &fft, 1, bufferOver2)

这工作正常并输出一长串数据。然而,此代码的问题是它会立即分析整个音频文件。我需要的是分析音频文件as它正在播放,与此视频非常相似:频谱可视化仪 https://www.youtube.com/watch?v=fMH9f6QM8Hs.

所以我想我的问题是:如何进行 FFT 分析while音频正在播放?

此外,除此之外,如何将 FFT 分析的输出转换为条形的实际高度?我使用上面的 FFT 分析代码收到的音频文件的输出之一是这样的:http://pastebin.com/RBLTuGx7 http://pastebin.com/RBLTuGx7。 Pastebin 的唯一原因是它的长度。我假设我将所有这些数字平均在一起并使用这些值? (仅供参考,我通过打印上面代码中的“fft”变量来获取该数组)

我尝试阅读 EZAudio 代码,但是我无法找到他们如何实时读取音频样本。任何帮助是极大的赞赏。


以下是在 AudioKit 中使用 EZAudio 的 FFT 工具完成的方法:

为您的 FFT 创建一个用于保存数据的类:

@objc public class AKFFT: NSObject, EZAudioFFTDelegate {

    internal let bufferSize: UInt32 = 512
    internal var fft: EZAudioFFT?

    /// Array of FFT data
    public var fftData = [Double](count: 512, repeatedValue: 0.0)

...
}

初始化类并设置 FFT。还要在适当的节点上安装分接头。

public init(_ input: AKNode) {
    super.init()
    fft = EZAudioFFT.fftWithMaximumBufferSize(vDSP_Length(bufferSize), sampleRate: 44100.0, delegate: self)
    input.avAudioNode.installTapOnBus(0, bufferSize: bufferSize, format: AKManager.format) { [weak self] (buffer, time) -> Void in
        if let strongSelf = self {
            buffer.frameLength = strongSelf.bufferSize;
            let offset: Int = Int(buffer.frameCapacity - buffer.frameLength);
            let tail = buffer.floatChannelData[0];
            strongSelf.fft!.computeFFTWithBuffer(&tail[offset], withBufferSize: strongSelf.bufferSize)
        }
    }
}

然后实现回调来加载内部 fftData 数组:

@objc public func fft(fft: EZAudioFFT!, updatedWithFFTData fftData: UnsafeMutablePointer<Float>, bufferSize: vDSP_Length) {
    dispatch_async(dispatch_get_main_queue()) { () -> Void in
        for i in 0...511 {
            self.fftData[i] = Double(fftData[i])
        }
    }
}

AudioKit 的实现可能会改变,所以你应该检查https://github.com/audiokit/AudioKit/ https://github.com/audiokit/AudioKit/看看是否有任何改进。 EZAudio 位于https://github.com/syedhali/EZAudio https://github.com/syedhali/EZAudio

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 FFT 执行音频分析 的相关文章

  • 从软件查找服务返回无效结果

    我尝试通过 XCode 组织者提交 iOS 应用程序 但在身份验证后失败 组织者说 从软件查找服务返回的结果无效 我怎么解决这个问题 检查 iTunes Connect 中您的应用程序状态是否为 等待上传 您可以更改状态以按 准备上传二进制
  • 带有自定义 init 的 SwiftUI 视图

    假设我正在制作一个如下所示的自定义输入元素 struct CustomInput View Binding var text String var name String var body some View TextField name
  • 如何在 UITextView 中禁用放大功能

    我想摆脱 UITextView 中的放大和文本选择 但我需要电话号码 链接和地址检测器 我在用 void addGestureRecognizer UIGestureRecognizer gestureRecognizer if gestu
  • Draggable Boxview 不更新 Xamarin

    我的第一个问题是框视图生成在左上角 而不是我指定的设计网格第 10 行和网格第 3 列 第二个问题在于可拖动视图 在代码本地可拖动视图的第一部分中 它正确地调用了触摸事件 但也许它没有在GUI中更新
  • 从 iOS 设备向 Google App Engine 进行身份验证

    我正在开发一个 iPhone 应用程序 它使用 Google 应用程序引擎来托管后端 我需要通过 Google 进行身份验证 但我似乎无法找到从我的应用程序中执行此操作的方法 看来我要做一个UIWebView让用户登录到我从 Google
  • 如何为所有整数类型创建通用整数到十六进制函数?

    我想为所有整数类型创建一个整数到十六进制函数 对于1字节的Int8 它返回两个字母 例如0A 对于2字节的Int16 它返回四个字母 例如0A0B 对于8字节的Int64 它返回16个字母 例如0102030405060708 func h
  • 设置UITextField的光标位置

    我查看了单点触控示例并尝试过 var range new NSRange selectionStart 1 NumberTextField SelectedTextRange IndexedRange GetRange range 但这会在
  • Xcode 11 - 在 Catalyst Swift 中禁用调整大小模式

    We are 将我们基于 Swift 的 iOS 应用程序转换为 Mac兼容使用Catalyst在 Xcode 11 中 当用户使用时 我们在 UI 中面临一个问题resize应用程序窗口 那么我们可以禁用调整大小模式并为应用程序窗口提供修
  • 在音频文件中查找音频样本(频谱图已存在)

    我正在努力实现以下目标 使用 Skype 拨打我的邮箱 有效 输入密码并告诉邮箱我要录制新的欢迎信息 有效 现在 我的邮箱告诉我在嘟嘟声后录制新的欢迎消息 我想等待蜂鸣声然后播放新消息 不起作用 我如何尝试实现最后一点 使用 FFT 和滑动
  • 解析迁移到 mLabs 和 Heroku 的错误

    我至少一年前将解析数据库迁移到 Mlabs 从那时起我就一直在开发该应用程序 解析仪表板表示我已成功迁移 Mlab 和 Parse 都收到了数据库的更新 然而 在过去一两周内 该应用程序不再经过登录页面 没有调整代码 这是服务器问题 以下是
  • 为什么我无法更改 UIBarButtonItem 的标题?

    我想改变UIBarButtonItem s title 但这段代码不起作用 void viewDidLoad self smay void smay AppDelegate apd AppDelegate UIApplication sha
  • 如何让位置音频在 SceneKit 中工作?

    我在使位置音频在 SceneKit 中工作时遇到问题 从 Xcode 生成的 SceneKit 游戏模板开始 我将以下代码添加到handleTap 方法的末尾 let ship scnView scene rootNode childNod
  • 在后台运行 URL 请求

    我想在一定的时间间隔内发出 url 请求 例如 每 10 分钟应用程序应该发出一次 url 调用并获取一些 json 数据 应用程序在后台运行时应该能够执行此操作 这可以做到吗 如果是这样 这是否违反 Apple 服务条款 有什么限制吗 i
  • UIImageWriteToSavedPhotosAlbum 选择器语法问题

    努力让 UIImageWriteToSavedPhotosAlbum 快速工作https developer apple com library ios documentation UIKit Reference UIKitFunction
  • 旋转 GPUImageTiltShiftFilter - GPUImage

    我想要一个非水平 GPUImageTiltShiftFilter 旋转 我想将其旋转到任意旋转角度 我还希望过滤器速度快 可以通过带有 UIRotationGestureRecongizer 的 UI 进行旋转 我该怎么做呢 啊 想通了 不
  • UNTimeIntervalNotificationTrigger nextTriggerDate() 是否给出了错误的日期?

    我正在更新本地通知以与 iOS 10 配合使用 但遇到了一个问题 我认为 nextTrigger 函数返回的不是 满足触发条件的下一个日期 而是返回当前日期时间加上您最初设置 UNTimeInvervalNotificationTrigge
  • 如何在多个视图中显示相同的导航栏?

    我可以为一个视图重现以下导航栏 但是 一旦我单击按钮后移至下一个视图 我就会丢失最右边的两个图标 搜索 个人资料 据我所知 从故事板设置导航项目通常是按视图进行的 我可以为每个视图复制这些项目 但我想知道是否有更好的方法来完成一次 是否有教
  • 如何在没有 MFMessageComposeViewController 的情况下发送和接收短信?

    我想发送和接收短信而不显示MFMessageViewController从我的申请中 有人能告诉我这怎么可能吗 不可能 除非您使用第 3 方 api 发送 接收短信
  • iOS 开发:如何强制 UIWebView 加载 Facebook 的非移动版本?

    我正在深入研究 iOS 开发 当我尝试在 UIWebView 中加载特定的 Facebook 粉丝页面时 它会加载该网站的移动版本 该版本仅加载粉丝页面的墙 而不是我需要加载的特定选项卡 在我的应用程序的 iPad 版本中 UIWebVie
  • 如何删除以前的 ViewController

    我是一名学生 对编程还很陌生 我正在尝试在业余时间学习 Objective C Swift 我使用 spriteKit 和 swift 制作了一个游戏 有多个菜单 场景 我正在尝试从一个视图控制器转换到另一个视图控制器 为此 我使用了以下代

随机推荐

  • 在 Python 中进行模糊键查找的最佳方法?

    我遇到一个问题 我需要在哈希映射中进行模糊查找 即返回与最接近查询的键相对应的值 在我的例子中是通过 Levenshtein 距离测量的 我目前的方法是子类化dict使用特殊的查找方法计算所有键的编辑距离 然后返回得分最低的键的值 基本上是
  • 用于 OAuth 身份验证的 WSGI 中间件

    我使用构建了一个非常小的网络应用程序Flask http flask pocoo org 现在我想向网站添加非常基本的身份验证 我不需要授权 由于 Flask 不支持开箱即用的 auth auth 我想插入 WSGI 中间件来完成这项工作
  • 将自定义 CSS 添加到使用 Compass 生成的精灵中

    我有这个代码my images scss file icon layout smart icon sprite dimensions true import icon png include all icon sprites 输出是这样的
  • Pandas:将 DataFrame 列值转换为新的 Dataframe 索引和列

    我有一个如下所示的数据框 a b c 0 1 10 1 2 10 2 2 20 3 3 30 4 1 40 4 3 10 上面的数据帧作为默认索引 0 1 2 3 4 我想将其转换为如下所示的数据框 1 2 3 0 10 0 0 1 0 1
  • 无法使用 Unity 函数在 Visual Studio Code 中获得完整的 Intellisense

    好吧 我知道这个问题已经被问过并回答过很多次了 但我花了大约 3 天的时间试图解决这个问题 但到目前为止我所做的一切都没有奏效 我基本上在 Visual Studio Code 中有部分智能感知 也就是说 它似乎只识别 Unity 类和变量
  • 如何以编程方式确定 C 中 int 数据的最大和最小限制?

    我正在尝试 K R 的练习 2 1 练习内容如下 编写一个程序来确定范围char short int and long变量 两者signed and unsigned 通过从标准标题打印适当的值并通过直接计算 如果计算它们会更困难 确定各种
  • Reflection.Emit 中的短格式操作码错误

    我正在制作一种与以下非常相似的小语言hlsl但仅支持像素着色器 该语言使用reflection emit构建实现相同功能的 NET 程序集 我目前正在测试分支指令的实现if在我的一个单元测试中 一个大的if与内if elses 失败并显示以
  • 长按 HOME 按钮菜单隐藏 Android 应用程序

    我想从 且仅从 完成后长时间按住 HOME 按钮时出现的菜单中隐藏我的 Android 应用程序 有没有办法做到这一点 以编程方式调用 finish 并不能解决问题 有很多关于从启动器和任务管理器隐藏应用程序的线程 但这不是我想要的 我只是
  • django REST框架多源领域

    假设我的 models py 中有这些 models py class Theme models Model An theme is an asset of multiple levels adventure models ForeignK
  • 如何让应用更新以吸引人的屏幕形式提供给用户? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我最近在使用 Make My Trip 应用程序 我发现每当我启动应用程序时都会出现一个非常有吸引力的应用程序更新弹出屏幕 它说要更新应用程
  • 如何从MediaCodec获取解码格式?

    我正在与MediaCodec 我用它来解码 mp4 video MediaCodec 将视频解码为YUV格式 但我需要得到RGBA 一切都很好 但我发现有几种可能的格式 例如YUV420 YUV422等等 因此 据我所知 要进行转换 我需要
  • 使用 ASP.Net 和 C# 统计网站的访问者数量

    我想跟踪我网站的访问者数量 我在 Global asax 类中尝试了以下代码
  • 调用axios成功后如何更新页面?反应

    所以我正在做一个使用的项目Axios with Json server 但我有一个问题 每次我做Patch 我必须在主页上按 F5 才能更新 我想知道如何才能做到这一点 这样它就不会自动发生 My Patch onSubmitDate ev
  • 从 CCL 检索(加载)源代码?

    我打了电话 load code lisp 用CCL 然后不小心删除了code lisp 有什么办法可以找回源代码吗 CCL 在内存中是否有它 这是一个非常特殊的功能 这里只为克洛祖尔CL 该代码在其他地方不起作用 这在 CCL IDE 中对
  • 无重叠的抖动点

    My data a lt sample 1 5 100 replace TRUE b lt sample 1 5 100 replace TRUE c lt sample 1 10 100 replace TRUE d lt sample
  • 覆盖Java中的属性[重复]

    这个问题在这里已经有答案了 在 Java 中 我最近有几个项目 我使用了这样的设计模式 public abstract class A public abstract int getProperty public class B exten
  • ApiController 操作无法从查询字符串解析数组

    使用 Visual Studio 2012 2 MVC4 Web 应用程序 我有请求发送到我的 ApiController 如下所示 http localhost api keys ids 1 ids 2 ids 3 我的印象是以下方法应该
  • 如何在 Xcode 4.2 中创建 Shell 脚本目标?

    我想知道是否有人知道 XCode 4 1 如何创建 shell 脚本 该选项不存在 但在最新版本中可能会被称为其他名称 塔 在导航器中选择您的项目 单击 添加目标 为空目标选择 聚合 添加构建阶段 gt 添加运行脚本 单击构建阶段并编辑运行
  • App.Config 和 Web.Config 之间的区别?

    当在 wpf 中构建桌面应用程序时 您可以阅读问题文档并在人们的答案引用 web config 时安全地替换 app config 吗 如果是这样 您是否需要注意任何明显的陷阱 tnx 阅读文档 http msdn microsoft co
  • 使用 FFT 执行音频分析

    我已经被这个问题困扰好几天了 并且浏览了几乎所有相关的 StackOverflow 页面 通过这次活动 我现在对 FFT 是什么及其工作原理有了更深入的了解 尽管如此 我在将其实现到我的应用程序中时遇到了极大的困难 简而言之 我想做的是为我