使用 Apple 的 Accelerate 框架、FFT、Hann 窗和 Overlapping

2023-12-01

我正在尝试设置FFT对于一个项目,确实没有清楚地了解事情...... 基本上,我正在使用Audio Units从设备的麦克风获取数据。然后我想做FFT就该数据而言。到目前为止,这是我的理解:我需要为我的数据设置一个循环缓冲区。在每个填充的缓冲区上,我应用一个Hann window然后做一个FFT。但是,我仍然需要一些有关重叠的帮助。为了获得更精确的结果,我知道我需要特别使用它,因为我正在使用窗口。然而,我在这方面找不到任何东西...... 这是我到目前为止所拥有的(用于音调检测):

// Setup -------------  
UInt32 log2N          = 10; // 1024 samples  
UInt32 N              = (1 << log2N);  
FFTSetup FFTSettings  = vDSP_create_fftsetup(log2N, kFFTRadix2);  
COMPLEX_SPLIT FFTData;  
FFTData.realp         = (float *) malloc(sizeof(float) * N/2);  
FFTData.imagp         = (float *) malloc(sizeof(float) * N/2);  
float * hannWindow = (float *) malloc(sizeof(float) * N);  

// create an array of floats to represent a hann window  
vDSP_hann_window(hannWindow, N, 0);

// FFT Time ----------  
// Moving data from A to B via hann window  
vDSP_vmul(A, 1, hannWindow, 1, B, 1, N);                                 

// Converting data in B into split complex form  
vDSP_ctoz((COMPLEX *) B, 2, &FFTData, 1, N/2);  

// Doing the FFT  
vDSP_fft_zrip(FFTSettings, &FFTData, 1, log2N, kFFTDirection_Forward);   

// calculating square of magnitude for each value  
vDSP_zvmags(&FFTData, 1, FFTData.realp, 1, N/2);  

// Inverse FFT  
vDSP_fft_zrip(FFTSettings, &FFTData, 1, log2N, kFFTDirection_Inverse);  

// Storing the autocorrelation results in B  
vDSP_ztoc(&FFTData, 1, (COMPLEX *)B, 2, N/2);  

vDSP_Length lastZeroCrosssing;  
vDSP_Length zeroCrossingCount;  
vDSP_nzcros(B, 1, N, &lastZeroCrossing, &zeroCrossingCount, N);  

// Cleanup -----------  
vDSP_destroy_fftsetup(FFTSettings);  
free(FFTOutput.realp);  
free(FFTOutput.imagp);  
free(hannWindow);

那么我将在哪里以及如何包含重叠呢?此外,任何代码片段都会更受欢迎。谢谢

UPDATE:

该项目的最终目标是对音频进行指纹识别,尽可能接近实时,因此我需要结果尽可能准确 - 因此重叠。为此,我认为我实际上可以将所有部分从逆向清理中删除。


你实际上并不need重叠 - 通常帧会重叠以在时间轴上提供更高的分辨率,例如用于绘制频谱图或估计音符开始时间。您现在可以让代码在不重叠的情况下运行,因为它不太复杂,然后再决定是否需要时间轴上的更高分辨率。

如果您决定确实要添加重叠,那么您将需要保存先前缓冲区的一块(例如 50%),然后对于每个新缓冲区,您将处理两个完整的缓冲区,如下所示:

  • 处理旧缓冲区的最后 50% + 新缓冲区的前 50%
  • 处理 100% 的新缓冲区
  • 保存新缓冲区的最后 50% 以供下一次迭代使用

对于不同的重叠百分比,类似的逻辑适用。

请注意,增加超过某一点的重叠可能会适得其反,因为所需的处理带宽大大增加,而分辨率却几乎没有增益。

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

使用 Apple 的 Accelerate 框架、FFT、Hann 窗和 Overlapping 的相关文章

随机推荐

  • MVC Razor 视图 Intellisense 在 VS 2013/2015/2017 中损坏

    我有一个用 VS2010 编写的现有项目 在 VS2010 中加载时可以完美运行 当我在 VS2013 中加载同一个项目时 MVC Razor 视图包含很多错误 就好像视图文件夹中缺少配置文件一样 它似乎没有使用根目录和视图文件夹中的配置文
  • 时区和本地化

    目前 我将所有时间存储为 UTC 以便当我开始将多个站点和服务器联机时 事情会变得更容易 翻译的时候就出现了问题date and datetime对象在我的模板中以及接受用户输入时转换为字符串 对于采用太平洋标准时间 PST 的人来说 下午
  • bash 中数组的动态变量名称

    我有一个名为 循环 的数组 对于 循环 中的每个元素 我想创建一个数组 其名称包含当前元素的文本 然后我想循环遍历每个新数组并打印每个数组中的每个元素 这个帖子似乎对变量有一个很好的解决方案 但我不知道如何使其适用于数组 我的脚本 bin
  • objc_copyClassList:更新到 iOS 13.4 / XCode 11.4 后崩溃 EXC_BAD_INSTRUCTION

    更新到 iOS 13 4 XCode 11 4 后 这段代码 func getSubclassInfos gt ClassInfo let superObject CityModel self let superClassInfo Clas
  • 如何在 PHP 中使用 imap 从电子邮件中提取内联图像(不是附件)[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 当我在 php 中使用 imap 获取电子邮件时 我收到电子邮件正文内容 但我无法提取粘贴但未附加在电子邮件正文中的内联图像 在电子邮件内容正文中搜索图像 假设您的电子邮件正文是 body
  • WinForms 中的图层效果(模糊等)

    在WinForms中 我正在寻找一种方法来实现类似于Java Swing中的JXLayer类的功能 更具体 我想模糊窗口的整个内容 并在上面绘制一些东西 例如 等待圆圈 任何想法都将受到高度赞赏 这是我的解决方案 截图 Blur it 将模
  • bash tail 不带变量的文件夹中的最新文件

    我的文件夹中有一堆日志文件 当我 cd 进入该文件夹并查看文件时 它看起来像这样 ls lhat rw r r 1 root root 5 3K Sep 10 12 22 some log c48b72e8 log rw r r 1 roo
  • 从文件中读取而不锁定它

    每次收到请求时 我都会不断地向一个文件写入一些数据 有时我还想解析该文件并从中读取 如果文件不断被写入 我该如何读取 模式是什么 你可以利用sync RWMutex Then 当需要读取文件时 调用RLock 阅读 然后调用RUnlock
  • PHP:可以自动获取所有发布的数据吗?

    简单的问题 即使您不知道所有字段 是否可以将所有数据发布到页面 例如 我想编写一个简单的脚本来收集所有发布的数据并通过电子邮件发送 我可以预见表单中的字段可能会随着时间的推移而发生很大变化 因此从长远来看 为了节省自己一些时间 我想知道是否
  • 如何编译 Groovy 源代码而不是从文件系统

    我使用 GroovyClassLoader parseClass src 即时 编译单个 groovy 源模块 一切正常 但问题是当这个源模块导入其他类时 这些类还没有编译 当我开始编译一个源代码但其他源代码是必需的并且在源路径上准备就绪时
  • 在 Python 中使用 NLTK 时,generate() 会做什么?

    这三天我一直在和NLTK进行熟悉 并阅读 自然语言处理 一书来了解发生了什么 我很好奇是否有人能为我澄清以下问题 请注意 第一次运行此命令时 它会很慢 因为它 收集有关单词序列的统计数据 每次运行它时 您 将得到不同的输出文本 现在尝试在中
  • Pandas groupby.size vs series.value_counts vs collections.Counter 具有多个系列

    有很多疑问 1 2 3 处理 a 中的计数值单系列 然而 关于最佳计数方法的问题较少两个或多个系列的组合 提出了解决方案 1 2 但没有讨论何时以及为何应该使用每一种 以下是三种潜在方法的一些基准测试 我有两个具体问题 Why is gro
  • 如何在Java中更改图表比例

    我有一个图表 其中 x 轴显示时间 y 轴显示我的数据 我想通过为 x 轴选择不同的指标来更改比例 例如秒 分钟和小时刻度 默认是第二个 因此 如果我选择分钟 图表应该更小并且更弯曲 任何想法 UI 尚未完成 但您认为会有 x 轴和 y 轴
  • 在 C# 中保存来自 Web 请求的图像

    我正在使用 jQuery 网络摄像头插件与页面中的网络摄像头进行通信并拍摄快照 它的工作方式是通过与 Flash 助手进行通信 为了保存图片 它会获取另一个页面的名称并向该页面发送 Web 请求 我已成功收到对方的请求 我想保存该请求中的图
  • PyQt5 无法在 ChromeOS 上运行?

    我正在尝试在 chromeOS 上开发一些 pyqt 应用程序 然而 在安装过程中不断出现一些错误 我尝试了两种方法 首先使用 conda 后来直接安装软件包 用conda安装的时候没有出现错误 但是当我尝试运行时 出现了这个错误 qt q
  • Jquery Ui 选项卡中的 JWYSIWYG 或 jHtmlArea

    我无法让我的 jwysiwyg 和 Jhtmlarea 文本编辑器在 AJAX 加载的 Jquery UI 选项卡中工作 正常加载时 两个文本编辑器都可以工作 这将加载 查看页面 上的选项卡 这将通过 AJAX 在 查看页面 上加载页面 l
  • 过渡盖箱未撞击

    我正在从数据总线采样值 因为预期值是不连续的 因此容器没有达到转换覆盖范围 虽然垃圾箱在没有过渡的情况下独立运行 示例 我们想要涵盖地址 W 的值的转换 A W X W Z D 7 0 8 0 covergroup cg with func
  • Cloud Functions for Firebase 是否尊重实时数据库规则?

    我正在尝试在特定节点使用安全规则来保护我的实时数据库 我了解当我使用我的设备写入 读取时 Firebase 规则将适用 如果写入 读取恰好来自 Cloud Functions 怎么办 如果我保护 用户 节点 那么 Cloud Functio
  • 任意手指扫描iPhone sdk示例教程

    我在应用商店里看到很多关于指纹扫描的应用 我想获得一个教程 它是如何工作的 或者是否有免费 付费的 sdk 可用 背后的目标是使用指纹扫描作为登录 而不是每次都必须使用用户名 密码登录 非常感谢 这不可能 你无法通过iPhone屏幕获取用户
  • 使用 Apple 的 Accelerate 框架、FFT、Hann 窗和 Overlapping

    我正在尝试设置FFT对于一个项目 确实没有清楚地了解事情 基本上 我正在使用Audio Units从设备的麦克风获取数据 然后我想做FFT就该数据而言 到目前为止 这是我的理解 我需要为我的数据设置一个循环缓冲区 在每个填充的缓冲区上 我应