iOS FFT Accerelate.framework 在播放期间绘制频谱

2024-04-20

更新2016-03-15

请看一下这个项目:https://github.com/ooper-shlab/aurioTouch2.0-Swift https://github.com/ooper-shlab/aurioTouch2.0-Swift。它已被移植到 Swift,并且包含您正在寻找的所有答案(如果您来到这里)。


我做了很多研究,了解了很多有关 FFT 和加速框架的知识。但经过几天的实验,我有点沮丧。

我想在图表中显示音频文件播放过程中的频谱。对于每个时间间隔,它应该在 X 轴上通过 FFT 计算出的每个频率(在我的例子中为 512 个值)在 Y 轴上(以红色条显示)显示以 db 为单位的幅度。

The output should look like this: enter image description here

我用 1024 个样本填充缓冲区,开始时仅提取左通道。然后我做所有这些 FFT 的事情。

到目前为止,这是我的代码:

设置一些变量

- (void)setupVars  
{  
    maxSamples = 1024;

    log2n = log2f(maxSamples);  
    n = 1 << log2n;  

    stride = 1;  
    nOver2 = maxSamples/2;  

    A.realp = (float *) malloc(nOver2 * sizeof(float));  
    A.imagp = (float *) malloc(nOver2 * sizeof(float));  
    memset(A.imagp, 0, nOver2 * sizeof(float));

    obtainedReal = (float *) malloc(n * sizeof(float));  
    originalReal = (float *) malloc(n * sizeof(float));

    setupReal = vDSP_create_fftsetup(log2n, FFT_RADIX2);  
}

进行 FFT。 FrequencyArray 只是一个保存 512 个浮点值的数据结构。

- (FrequencyArry)performFastFourierTransformForSampleData:(SInt16*)sampleData andSampleRate:(UInt16)sampleRate   
{  
    NSLog(@"log2n %i n %i,  nOver2 %i", log2n, n, nOver2);

    // n = 1024
    // log2n 10
    // nOver2 = 512

    for (int i = 0; i < n; i++) {
        originalReal[i] = (float) sampleData[i];
    }

    vDSP_ctoz((COMPLEX *) originalReal, 2, &A, 1, nOver2);

    vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_FORWARD);

    float scale = (float) 1.0 / (2 * n);

    vDSP_vsmul(A.realp, 1, &scale, A.realp, 1, nOver2);
    vDSP_vsmul(A.imagp, 1, &scale, A.imagp, 1, nOver2);

    vDSP_ztoc(&A, 1, (COMPLEX *) obtainedReal, 2, nOver2);

    FrequencyArry frequencyArray;

    for (int i = 0; i < nOver2; i++) {
        frequencyArray.frequency[i] = log10f(obtainedReal[i]); // Magnitude in db???
    }

    return frequencyArray;  
}

输出看起来总是有点奇怪,尽管它似乎根据音乐移动。

我很高兴能够走到这里,感谢这里的一些非常好的帖子,如下所示:使用苹果FFT和加速框架 https://stackoverflow.com/questions/3398753/using-the-apple-fft-and-accelerate-framework

但现在我不知道该怎么办。我缺少什么?


首先你没有申请窗函数 http://en.wikipedia.org/wiki/Window_function在 FFT 之前 - 这将导致频谱模糊,因为频谱泄漏 http://en.wikipedia.org/wiki/Spectral_leakage.

其次,您只是使用 FFT 输出箱的实数分量来计算 dB 幅度 - 您需要使用复数幅度:

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

iOS FFT Accerelate.framework 在播放期间绘制频谱 的相关文章

  • 反应本机无法解析模块“warnOnce”

    我的英语有点生疏 对此我很抱歉 当我在 iOS 模拟器上启动 React Native 项目时 出现错误 为了排除与我的代码的任何冲突 我开始了一个新项目 react native init demo react native start
  • iOS 13.1 AVAudio 播放器崩溃

    当我跟踪问题时 我的应用程序在 iOS 13 1 上崩溃 然后发现应用程序崩溃是因为AVAudioPlayer 以下是我的播放器设置 if let wrongURL Bundle main url forResource wrongAudi
  • 如何让NSManagedObject不出错?

    我目前正在调试另一个开发人员编写的一个大项目 该项目使用CoreData我对此很陌生 我遇到了崩溃 这是由于某些NSManagedObject是一个错误 我对什么是错误不太了解 我想将对象转换为 非错误 看看它是否有帮助 阅读文档让我想到t
  • AVAudioRecorder 未写出正确的 WAV 文件头

    我正在 iPhone 上开发一个项目 我使用 AVAudioRecorder 从设备麦克风录制音频 然后对录音进行操作 为了确保我正确地从文件中读取样本 我使用 python 的 wave 模块来查看它是否返回相同的样本 然而 当尝试打开
  • 更改流程布局的 itemSize 后单元格大小未更新

    在我的应用程序中 我有一个全屏分页集合视图 每个单元格也需要全屏 因此集合视图布局的项目大小需要与视图控制器的视图边界大小相同 为此 在viewDidLayoutSubviews我只是设置了项目大小 它就按预期工作了 当我呈现这个屏幕时 v
  • 在iOS中启动应用程序时如何复制sqlite数据库?

    每次启动应用程序时 我想将带有最新更新的 sqlite 数据库从数据库位置复制到我的 iOS 应用程序 有什么办法可以做到吗 您可以将以下方法添加到您的应用程序委托中 void copyDatabaseIfNeeded Using NSFi
  • 在 ios 7 设备上获取多个应用程序图标

    我在 ios7 iPhone5 设备 上遇到一个奇怪的错误 我在ios7上使用xcode5安装了iPhone应用程序我的问题是每当我在设备上安装应用程序时 我都会收到多个应用程序图标 多次使用相同的名称 我还尝试通过我的系统使用不同的应用程
  • 尝试在写入事务之外修改对象

    所以我不知道为什么会出现这个错误 错误信息如下 由于未捕获的异常 RLMException 而终止应用程序 原因 尝试在写入事务之外修改对象 首先在 RLMRealm 实例上调用 beginWriteTransaction 首先抛出调用堆栈
  • Xcode 9,我的 NSLog() 去哪里了?未显示在 Xcode 控制台或 Console.app 中

    我正在尝试在开发应用程序时进行一些基本的日志记录 我扔了一些NSLog s 到我的代码中 但没有任何内容打印到下面的 Xcode 控制台 从字面上看什么都没有 甚至没有应用程序启动时的一些启动信息等 我已将 Xcode 控制台设置为显示Al
  • 自定义 UITableViewRowAnimation 或持续时间

    我有一个用户可以拖动的应用程序UITableViewCells从一TableView到另一个 我通过在用户触摸的 UITableViewCell 顶部渲染一个 虚拟 单元格来实现此目的 并禁用 真实 单元格 然后我在目标中插入一个新行UIT
  • 使用 Swift p2/OAuth2 并行刷新 OAuth2 访问令牌请求

    我在用https github com p2 OAuth2 https github com p2 OAuth2用于通过 OAuth2 连接到我的应用程序的后端 效果非常好 我遇到的问题是 当访问令牌过期并且同时发生多个请求时 其中一些请求
  • Mapbox-iOS-SDK 6.3.0 Pod 安装错误 403 Forbidden

    下载Mapbox示例 运行pod install 报错 403 Forbidden 为什么 请帮忙 谢谢 pod Mapbox iOS SDK gt 6 3 0 ios sdk examples 298e050be7352eb28cee6f
  • 如何在 SwiftUI 中管理 AVPlayer 状态

    我有 SwiftUI 中的 URL 列表 当我点击某个项目时 我会呈现一个全屏视频播放器 我有一个 EnvironmentObject它处理一些查看器选项 例如 是否显示时间码 我还有一个显示和隐藏时间码的切换开关 我只在本例中包含了该切换
  • IOS:使用@property释放变量(非原子,保留)

    带有 property 非原子和保留的变量是否应该显式释放 interface MyScreenViewController UIViewController
  • TTTAttributedLabel可以检测链接,但无法正确按下

    我正在使用 TTTAttributedLabel 来检测链接 这是我初始化标签的代码 TTTAttributedLabel getLinkLabelWithSize CGSize size text NSString text TTTAtt
  • UITableView更改标题标题颜色

    我正在设计 UITableView 的样式应用内设置工具包 http InAppSettingsKit并想要更改标题的颜色 标签Without title and Text Field应该是白色的 如何才能做到这一点 Thanks 这是一个
  • 尝试在iPhone上生成随机数,得到相同的数字[重复]

    这个问题在这里已经有答案了 我正在尝试制作一款纸牌游戏 我正在使用以下代码来绘制随机卡 iCard 随机 55 但 icard 总是以 28 开头 似乎它以相同的顺序返回数字 有没有办法在每次第一次调用该函数时获得不同的随机数 random
  • 错误 ITMS-90168:“您上传的二进制文件无效。”

    我正在尝试将应用程序上传到 App Store 它包含一个 watchOS 2 应用程序 watchOS 1 扩展和一些 iOS 扩展 我不明白为什么会发生这种情况 当我使用 Xcode 7 的 上传到 App Store 功能 或使用应用
  • 将相机移动到点击的 SCNNode

    我在用着SceneKit and Swift尝试移动相机 使其 聚焦 在所选节点上 我知道我启用了 defaultCameraController 但我试图通过调整相机的位置dolly rotate and translateInCamer
  • 由于某种原因,AdColony 的 AdReward 无法在 Swift 2.0 上运行

    我想在我的游戏中实现奖励插页式广告 但我收到了很多 AdColony 错误 例如 未填写广告请求 或我的区域 ID 无效 首先 这就是我配置 AdColony 区域的方式 Zone is active Yes Zone Type Prero

随机推荐