iOS FFT 绘制频谱

2024-02-03

我读过这些问题:

使用 Apple FFT 和加速框架 https://stackoverflow.com/questions/3398753/using-the-apple-fft-and-accelerate-framework

使用 Accelerate 框架进行 FFT 时如何设置缓冲区? https://stackoverflow.com/questions/4804119/how-do-i-set-up-a-buffer-when-doing-an-fft-using-the-accelerate-framework?rq=1

iOS FFT Accerelate.framework 在播放期间绘制频谱 https://stackoverflow.com/questions/10636134/ios-fft-accerelate-framework-draw-spectrum-during-playback

它们都描述了如何使用加速框架设置 fft。在他们的帮助下,我能够设置 fft 并获得基本的频谱分析仪。现在,我正在显示从 fft 获得的所有值。但是,我只想显示 10-15 个或可变数量的代表某些频率的条形。就像 iTunes 或 WinAmp 电平表一样。 1. 我是否需要对一系列频率的幅度值进行平均?或者他们只是向您显示特定频率条的幅度? 2. 另外,我需要将震级值转换为 db 吗? 3. 如何将我的数据映射到某个范围。我是否根据声音位深度的最大分贝范围进行映射?获取箱的最大值将导致跳跃最大映射值。

我的渲染回调:

static OSStatus PlaybackCallback(void *inRefCon,
                                 AudioUnitRenderActionFlags *ioActionFlags,
                                 const AudioTimeStamp *inTimeStamp,
                                 UInt32 inBusNumber,
                                 UInt32 inNumberFrames,
                                 AudioBufferList *ioData)
{
    UInt32 maxSamples = kAudioBufferNumFrames;

    UInt32 log2n = log2f(maxSamples); //bins
    UInt32 n = 1 << log2n;

    UInt32 stride = 1;
    UInt32 nOver2 = n/2;

    COMPLEX_SPLIT   A;
    float          *originalReal, *obtainedReal, *frequencyArray, *window, *in_real;

    in_real = (float *) malloc(maxSamples * sizeof(float));

    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));
    frequencyArray = (float *) malloc(n * sizeof(float));

    //-- window

    UInt32 windowSize = maxSamples;
    window = (float *) malloc(windowSize * sizeof(float));

    memset(window, 0, windowSize * sizeof(float));
    //    vDSP_hann_window(window, windowSize, vDSP_HANN_DENORM);

    vDSP_blkman_window(window, windowSize, 0);

    vDSP_vmul(ioBuffer, 1, window, 1, in_real, 1, maxSamples);

    //-- window

    vDSP_ctoz((COMPLEX*)in_real, 2, &A, 1, maxSamples/2);

    vDSP_fft_zrip(fftSetup, &A, stride, log2n, FFT_FORWARD);
    vDSP_fft_zrip(fftSetup, &A, stride, log2n, FFT_INVERSE);

    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);
    vDSP_zvmags(&A, 1, obtainedReal, 1, nOver2);

    Float32 one = 1;
    vDSP_vdbcon(obtainedReal, 1, &one, obtainedReal, 1, nOver2, 0);

    for (int i = 0; i < nOver2; i++) {
        frequencyArray[i] = obtainedReal[i];
    }


    // Extract the maximum value
    double fftMax = 0.0;
    vDSP_maxmgvD((double *)obtainedReal, 1, &fftMax, nOver2);

    float max = sqrt(fftMax);
}

播放一些音乐,我得到的值从 -96db 到 0db。 绘制一个点:

CGPointMake(i, kMaxSpectrumHeight * (1 - frequencyArray[i]/-96.));

给了我一条相当圆润的曲线:

plot1 http://pitchmywatch.wanjaja.com/photo.PNG

如果我不转换为 db,我可以通过将数组值乘以 10000 来绘制并获得漂亮的峰值。

plot2 http://pitchmywatch.wanjaja.com/photo2.PNG

我做错了什么吗?我如何才能显示可变数量的条形图?


  1. 我是否需要对一系列频率的幅度值进行平均?或者他们只是向您显示特定频率条的幅度?

是的,您肯定需要对您定义的范围内的值进行平均。只显示一个 FFT bin 是疯狂的。

  1. 另外,我需要将幅度值转换为 db 吗?

是的:dB 是对数刻度。并非巧合的是,人类的听觉也(大致)以对数尺度工作。因此,如果在绘制这些值之前采用 log2() 值,这些值对人类来说看起来会更自然。

  1. 如何将数据映射到特定范围。我是否根据声音位深度的最大分贝范围进行映射?获取 bin 的最大值将 导致跳跃最大映射值。

我发现最简单的事情(至少在概念上)是将您的值从任何格式转换为0..1,即“标准化和缩放”浮点值。然后,如果需要,您可以从那里转换为您需要绘制的内容。例如

SInt16 rawValue = fft[0]; // let's say this comes back as 12990

float scaledValue = rawValue/32767.; // This is MAX_INT for 16-bit;
        // dividing we get .396435438 which is much easier for most people
        // to see conceptually as 39% of our max possible value

float displayValue = log2(scaledValue);

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

iOS FFT 绘制频谱 的相关文章

  • 无法识别的选择器调用静态 iOS 库中的类别方法

    我正在使用一些第三方软件来帮助使用 Xcode 4 3 2 编写 iPad 应用程序 该软件是开源的 通常经过设置 因此其代码将与开发人员为应用程序编写的任何代码一起编译 因为我在很多地方使用该软件 所以我决定将其构建为 iOS 模拟器的静
  • 如何避免 NSNumberFormatter 中的四舍五入

    我试图拥有一个最大精度为 2 位小数的数字字符串 而其余小数只是被修剪掉而不是四舍五入 例如 I have 123456 9964 I want 123456 99 gt Just want to trim rest of the deci
  • 调用了 numberOfRowsInSection 但未调用 cellForRowAtIndexPath

    在我的表视图中节中的行数被调用两次但是cellForRowAtIndexPath不叫 我想在 tableView 中显示 Facebook 好友列表 如果 cellForRowAtIndexPath 调用我的问题就解决了 我在这里的数组中得
  • 如何像谷歌日历一样将单元格的内容滚动到表格视图中的另一个单元格中?

    我希望用户界面像谷歌日历那样进入桌面视图 它在不同的行中显示相同的日期事件 但是当您向上或向下滚动时 左侧的日期也会向上向下滚动 Can you please help me how to achieve this Please take
  • Android - API 请求

    我开发了一个应用程序 它也在 iPhone 上 问题出在 api 请求上 我为所有请求设置了超时 有时会出现 30 60 秒的中断 看起来这个应用程序执行了几个请求 然后就中断了 一直超时 大约 45 秒后一切正常 不知道是服务器问题还是安
  • 当自定义子视图处理触摸时防止 UITableView 滚动

    在我的 iOS 应用程序中 有一个 UITableView 其中一个单元格中包含一个自定义子视图 该单元格是一个交互式视图 它处理触摸事件 touchesBegan touchesEnded touchesMoved 以更新自身 问题是 当
  • 无法安装企业应用程序 - 此配置文件无法安装在此设备上

    我正在设置 Jenkins 来构建应用程序的企业版本 以便在我们的内部应用程序商店中分发 如果我将应用程序存档在 Xcode 中 然后在手机上下载内置的 ipa 则应用程序安装不会出现任何问题 但是当我使用 Jenkins 生成的具有相同私
  • 如何从 iOS 应用程序检测不安全的 wifi 网络

    我想检测我的应用程序中是否存在不安全的 wifi 网络 是否有任何公共 iOS API 可以实现相同的目的 没有记录的 API 可以获取该信息 如果您的应用程序需要通过网络发送和接收敏感数据 您通常应该假设没有安全连接
  • 使用 UIKeyCommand 检测删除键

    任何人都知道如何使用检测 删除 键UIKeyCommand在 iOS 7 上 当人们在使用 Swift 时遇到问题时 我认为用 Objective C 和 Swift 编写一个小型的 完整的例子可能是一个很好的答案 请注意 Swift 没有
  • 你如何在react-native中实现捏合缩放?

    我一直在研究 PanResponder 我当前的工作假设是 我将检测是否有两个触摸正在向外移动 如果是 则增加元素大小onPanResponderMove功能 这似乎是一种混乱的方法 有没有更顺畅的方法呢 如果您只需要简单的捏缩放功能 只需
  • PhoneGap 1.4 封装 Sencha Touch 2.X - 性能怎么样?

    我正在构建一个多平台平板电脑应用程序 仅使用其 Webview 使用 Phonegap 1 4 对其进行包装 然后使用 Sencha Touch 2 框架发挥我的魔力 我所说的多平台是指 iOS 5 X 和 Android 3 0 目前 到
  • UICollectionReusableView 方法未被调用

    我希望我的部分位于UICollectionView有一个带有图像的标题 我已按照以下步骤操作 在故事板中 分配了一个标题作为我的附件UICollectionView 给它一个标识符 创建了一个子类UICollectionReusableVi
  • iOS NSURLSession,如何在didCompleteWithError中重试

    我想在我的服务器上尝试一次调用 直到成功为止 我想每 30 秒尝试一次 所以我使用 NSURLSession 进行通话 NSURLSessionDownloadTask task self session downloadTaskWithR
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 使用 nib 作为带有 nib 类的表节标题

    我想创建一个加载 nib 文件并将其设置为标题 UIView 的节标题 这个 nib 文件还将有一个关联的类 其中插座和操作连接到 因此我想像平常一样使用 nib 加载该类 我在网上搜索并找到了几个类似的答案 但我找不到任何适合我的答案 经
  • 进入后台时 Alamofire 请求卡住?

    我正在使用 Alamofire 调用 Web 服务 该服务需要相当长的时间才能加载 如果应用程序进入后台 当我返回应用程序时 我会被加载程序卡住 我想这是因为调用永远不会向我的完成处理程序返回任何内容 我该如何解决这个问题 您可以使用后台抓
  • 选择 UITableViewCell 时 UIView 背景颜色消失

    我在界面生成器中构建了一个简单的 tableViewCell 它包含一个包含图像的 UIView 现在 当我选择单元格时 会显示默认的蓝色选择背景 但 UIView 的背景颜色消失了 我的 UITableViewCell 的实现文件没有做任
  • 使用 UItableViewCell 类型的表达式初始化“CustomCellView *”的指针类型不兼容

    你能帮我理解和 修复下面的错误吗 我不明白CustomCellView是一个子类UItableViewCell 代码已编译 但警告仍然存在 Incompatible pointer type initializing CustomCellV
  • iOS 13 检查 CLLocationManager 的临时授权状态

    根据 WWDC 视频 https developer apple com videos play wwdc2019 705 https developer apple com videos play wwdc2019 705 当你要求 Al
  • iOS WKWebView 处理文件下载

    我面临以下问题 在 Web 界面中 文件下载是通过锚标记触发的 如下所示 a href bla blabla a 虽然 Safari 浏览器可以处理此请求并打开一个对话框来处理文件 但 WKWebView 将此视为普通链接并且不对其执行任何

随机推荐

  • 如何正确理解“光标”

    我正在尝试将光标应用于我的应用程序 但是 该文档对我来说不够清晰 Google 对光标的描述http code google com appengine docs python datastore queries html Query Cu
  • 在 C++ 中使用友元类与添加访问器进行单元测试?

    添加返回对象内部状态的函数进行单元测试是否比使测试类成为友元更好 特别是 当除了单元测试之外的功能没有用处时 95 的时间单元测试应该只测试类的公开暴露的表面 如果您正在幕后测试某些内容 那就是测试实现细节 这本质上是脆弱的 因为您应该能够
  • 如何通过 JavaScript 在锚标记中导航 href

    有没有一种简单的方法可以让 JavaScript 模仿用户单击页面上的锚标记 这意味着需要设置 Referrer Url 仅设置 document location href 不会设置 Referrer Url a href http ex
  • 有没有办法在Windows上监听信号

    我正在用 Rust 为 Windows 编写一个小 shell 并且想杀死Command我生成并阻止我的 shell 退出 有没有办法捕获WindowsSIGINTRust 中的等价物 有a crate https crates io cr
  • 如何通过页面刷新使Angular服务中的数据持久化

    我有一个 Angular 服务 如下所示 var lunchrServices angular module lunchrServices lunchrServices service authService function var us
  • 应用程序初始化时的 Firebase 身份验证

    这是作品 console log User ID user id Provider user provider 但这不是 scope authenticated currentUser user id 我的目标是获取一些身份验证变量 电子邮
  • 如何删除 SQL Server 数据库中所有表中的所有行?

    如何删除 SQL Server 数据库中所有表中的所有行 请注意 如果您设置了任何引用完整性 则 TRUNCATE 将不起作用 在这种情况下 这将起作用 EXEC sp MSForEachTable DISABLE TRIGGER ALL
  • 重复捕获组

    我有一个包含零个或多个数字 然后包含零个或多个字符的字符串ABCD 我想将数字解析为一组 然后将所有字符解析为每个字符的单独组 我试过了 0 9 ABCD 正确捕获数字 但仅捕获最后一个字母 0 9 ABCD 正确捕获数字 但首先捕获一组中
  • 权限错误:[Errno 13] 权限被拒绝

    我收到此错误 Exception in Tkinter callback Traceback most recent call last File C Python34 lib tkinter init py line 1538 in ca
  • 删除/清除 django.contrib.messages

    我想有条件清除django contrib messages 这两个问题中讨论的解决方案都不起作用 删除所有 django contrib messages https stackoverflow com questions 3951831
  • Angular v4:我们将数据存储在服务或组件中还是两者都存储?

    Angular v4 我们将数据存储在服务或组件中还是两者都存储 在查看了相当多的教程以及阅读了 Angular 的文档之后 我仍然不清楚这个主题 https angular io tutorial toh pt2 https angula
  • Eclipse + maven:忽略配置文件

    这是我的 pom xml
  • 使用主机文件的本地主机上的通配符子域[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在 Windows 7 上运行 IIS 7 的开发计算机上设置子域 看起来可以通过编辑hosts文件输入C Windows Sy
  • 重写onDraw()还是draw()?

    我的项目基于 SurfaceView 到目前为止 我已经在 onDraw 中进行了所有渲染 我正在覆盖它 一切似乎都很好 然而 我刚刚更新了我的 SDK 现在它给我一个错误告诉我 可疑的方法调用 可能应该调用 draw 而不是 onDraw
  • JQuery UI:如何使用其命名空间调用小部件函数

    我创建了两个具有相同名称但具有不同命名空间的自定义 JQuery UI 小部件 如下所示 第一个小部件 widget finance dialog this was created in the file jquery finance di
  • webpack 引用不带变量的类型

    running yarn run webpack dev 没问题 但是 yarn run webpack prod 产生这个错误 ERROR in Illegal State referring to a type without a va
  • OpenCV 将 Mat 保存为二进制(1 位深度)TIFF

    假设我们有一个Mat应用OpenCv后Imgproc adaptiveThreshold Mat srcImage Mat binaryImage new Mat Imgproc adaptiveThreshold srcImage bin
  • 将 JSON 转换为 .csv

    我发现有人正在将一些数据下载到 JSON 文件中 我想 我是新手 该文件包含近 600 名足球运动员的数据 这是文件 https raw githubusercontent com llimllib fantasypl stats f944
  • 如何获取当前键盘布局的代码页?

    我的非 Unicode 应用程序需要能够处理 Unicode 键盘输入 WM CHAR 等 从而接收 8 位字符代码 然后在内部将其转换为 Unicode 需要 9x 兼容性 因此不能选择使用大多数 Unicode API 目前 它查看 P
  • iOS FFT 绘制频谱

    我读过这些问题 使用 Apple FFT 和加速框架 https stackoverflow com questions 3398753 using the apple fft and accelerate framework 使用 Acc