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 绘制频谱 的相关文章

  • Swift 闭包作为 AnyObject

    我尝试使用这个方法 class addMethod 在 Obj c 中使用如下 class addMethod self class selector eventHandler imp implementationWithBlock han
  • 如何在 ios 7 上更改重新排序控制图像

    我正在寻找一种更改重新排序控件图像和大小的方法 我使用此代码来更改重新排序图像 void tableView UITableView tableView willDisplayCell UITableViewCell cell forRow
  • 如何自动缩放mapView以显示叠加层

    我可以在 mapView 上绘制多边形 但是我需要找到多边形并手动缩放它 有没有办法自动执行此过程 例如调整中心多边形 我浏览过互联网并阅读了一些相关文章 其中大多数都是基于折线和点的 任何形式的帮助将不胜感激 因为我正在寻找解决方案一段时
  • ViewWillAppear 没有被 UISplitViewController 调用

    背景和目标 我有一个基于 UISplitViewController 的 iPad 应用程序 到目前为止它支持 4 个方向 但现在我想将其锁定为仅横向 我变了shouldAutorotateToInterfaceOrientation左视图
  • 防止UIScrollView的UIPanGestureRecognizer遮挡UIScreenEdgePanGestureRecognizer

    我有一个UIScrollView它填满了我应用程序的一页上的屏幕 但我希望允许用户从屏幕边缘平移以显示其后面的视图 问题是 UIScrollView 窃取了我的触摸UIScreenEdgePanGestureRecognizer在屏幕边缘
  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he
  • 是什么导致了这个 iPhone 崩溃日志?

    我有点卡住了 需要解决这个问题 因为我的一个应用程序出现了随机崩溃 而这些崩溃并不总是能够重现 这是崩溃日志之一 Incident Identifier 59865612 9F00 44EA 9474 2BF607AD662E CrashR
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项
  • 如何在 Swift 3 中解析 JSON 数组 [重复]

    这个问题在这里已经有答案了 我从 Socket 获取了一些我想访问的数据 但收到错误消息 指出每次都无法将 NSArray 转换为 NSDictionary struct SocketEventHandler let event Strin
  • Transit MKDirectionsRequest 产生 null 错误 Error Domain=MKErrorDomain Code=5 "(null)"

    我正在尝试使用 MapKit Directions Request 来获取两个坐标之间的交通方向 当我切换到其他 非 Transit 类型时 下面的代码可以工作 但是当我切换到 Transit 时 它会抛出一个错误 该错误在 Apple 文
  • iOS 8 中的 UISplitViewController 状态恢复

    在 iOS 8 上 UISplitViewController 似乎可以保存和恢复其子视图的状态 例如 主视图是否隐藏 这是不可取的 因为我的应用程序应该始终以横向方式显示主视图 并始终以纵向方式隐藏它 如果用户以横向模式关闭应用程序 保存
  • 如何请求用户开启定位服务

    我需要我的应用程序来访问用户的当前位置 它在应用程序开始时检查用户是否已设置 如果没有 我需要应用程序显示提示以使其使用位置服务 就像警报视图一样 点击按钮 它应该会带您进入 iPhone 上的位置服务屏幕 您可以通过以下代码检查 loca
  • 无法使用 Xamarin 和 WCF 访问 Web 服务

    我想使用 Xamarin 和 WCF 来使用公共 Web 服务 对于这个演示 我将使用Xamarin iOS 这是我试图使用的 公共 网络服务 http www webservicex net globalweather asmx WSDL
  • iPhone 快照,包括键盘

    我正在寻找拍摄整个 iPhone 屏幕 包括键盘 的正确方法 我找到了一些截取屏幕的代码 CGRect screenCaptureRect UIScreen mainScreen bounds UIView viewWhereYouWant
  • PrepareForSegue之谜

    我在两个不同的 VC 中有一个prepareForSegue 方法 一个使用一个if声明 而另一个旨在使用switch 除了名称之外 代码几乎相同 这个效果很好 void prepareForSegue UIStoryboardSegue
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • Xcode 9 中的“addingPercentEncoding”是否损坏?

    在 Swift 3 x 和 Xcode 9 beta 2 中 使用addingPercentEncoding https developer apple com documentation swift string 1690785 addi
  • 在 iOS 上从 GPS 获取时间

    我正在开发一个跟踪器应用程序 该应用程序需要高精度地了解设备位置 即它使用位置服务并忽略水平精度低于 20 米的位置 CLLocation没有明确声明是否通过 GPS 确定 但是 如果水平精度为 20 米或更好 则可以认为它是来自 GPS
  • 退出导航控制器

    我试图离开初始视图控制器 并进入空白视图控制器 这很好 但是这会使空白视图控制器也成为导航控制器的一部分 这不是我想要的 我想脱离视图控制器 在视图控制器中 我尝试退出 它会自行弹出 当我尝试视图中的方法时 将出现目标视图控制器 self
  • 如何获取 UIWebView 中元素的位置?

    我在 iPad 程序中加载了 html 的 UIWebView 通过使用 webkit column width 我将 html 分为几列 padding 0px height 1024px webkit column gap 0px we

随机推荐

  • 如何正确理解“光标”

    我正在尝试将光标应用于我的应用程序 但是 该文档对我来说不够清晰 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