小编ben*_*wig的帖子

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

更新2016-03-15

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


我做了很多研究,并学到了很多关于FFT和Accelerate Framework的知识.但经过几天的实验,我有点沮丧.

我想在图表中播放期间显示音频文件的频谱.对于每个时间间隔,它应该在X轴上通过FFT计算的每个频率(在我的情况下为512个值)显示Y轴上的数值(由红色条显示).

输出应如下所示: 在此输入图像描述

我用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);  
}
Run Code Online (Sandbox Code Playgroud)

做FFT.FrequencyArray只是一个包含512个浮点值的数据结构.

- (FrequencyArry)performFastFourierTransformForSampleData:(SInt16*)sampleData andSampleRate:(UInt16)sampleRate   
{  
    NSLog(@"log2n %i n %i, …
Run Code Online (Sandbox Code Playgroud)

fft frequency spectrum ios

14
推荐指数
1
解决办法
6925
查看次数

CoreBluetooth:检测设备超出范围/连接超时

我正在设计一个iOS框架来处理多个BLE设备(所有类型).除了一件事之外,目前一切都运转良好:

客户端需要包含可用设备的列表.但是,我怎样才能检测到过去发现的设备何时不再可用?

当我尝试连接到不再可用的设备时,会出现另一个问题.文档说:连接尝试永远不会超时

是的,我从来没有通过didFailToConnectPeripheral收到错误.

我做了一些研究,但无法弄清楚如何通过CoreBluetooth正确处理这些问题.所以我开发了自己的解决方案,但我不确定这是否是正确的方法(或者至少是一种好方法,因为可能有几种方法可以做到这一点).

1.检测不再可用的设备

我用扫描

[_centralManager scanForPeripheralsWithServices:services options:@{CBCentralManagerScanOptionAllowDuplicatesKey: @(TRUE)}];
Run Code Online (Sandbox Code Playgroud)

所以只要设备没有连接,我就会一直收到广告.我用计时器检查广告在给定的时间间隔内重新固化(足够大,对应于设备广告间隔).如果在间隔中没有出现广告,我将从列表中删除该设备.

2.检测连接超时 嗯,我觉得这很容易.我使用自己的超时功能,并在计时器到期时取消连接请求.

如果有人遇到过这些问题,我会对您的意见和/或您的解决方案非常感兴趣.

更新2014-12-17:

与此同时,我使用计时器开发了我自己的解决方案,它看起来效果很好.

连接超时是直接的.只需将计时器设置为5秒或您认为对您有益的任何东西.如果计时器到期且设备未连接,只需取消连接并告诉用户存在问题.

检测超出范围的设备有点棘手.对于每个发现的设备,我启动一个计时器,在两倍的时间后触发,设备发送广告.如果设备确实发送了另一个广告,直到计时器到期,它可能超出范围或被关闭或连接到另一个设备.

我不想回答我自己的问题,因为我希望苹果有朝一日可以解决这些问题.

ios bluetooth-lowenergy

14
推荐指数
1
解决办法
3616
查看次数

CBPeripheralManager 连接回调

我正在尝试在两个 iOS 设备之间建立蓝牙连接。这个想法是一个设备提供一项服务,而多个设备连接到它:

设备 A(服务):用户滑动演示文稿

设备 B(多客户端):用户观看演示,无交互

根据我的理解,提供服务的人应该通过创建 CBPeripheralManager 并实现 CBPeripheralManagerDelegate -> Device A 来宣传它并分别成为外围设备

另一方面,有多个中央设备使用 CBCentralManager 扫描外围设备并实现 CBCentralManagerDelegate。建立连接后,它们使用 CBPeripheral 类和 CBPeripheralDelegate -> Device B 向外围设备发送读写请求

现在我感到困惑:据我所知,设备 A 无法直接向设备 B 发送信息,甚至无法识别连接是否已建立或丢失。但是客户端(设备 B)可以读取和写入数据并获得连接和断开连接通知。

所以我的第一个想法是交换角色。现在,中央设备通过扫描广告他们想要使用该服务的设备(?!?)来提供服务,并且多个外围设备可以连接到一个中央设备。听起来肯定是错的,对吧?麻烦来了:如果连接已经建立或丢失(aaahhhhh),现在外围设备(观看演示的用户)不会再收到通知。

现在的问题是:是否有一种好方法可以使 iOS 设备成为外围设备并识别连接和断开连接(应包括按距离等断开连接)?

添加:在 WWDC 2012 Session 705 (链接到演示幻灯片)中提到了 central:didConnect 和 central:didDisconnect 方法。但即使在 CBPeripheralManagerDelegate 的 iOS 7 beta 文档中也没有提到这些方法。也许这是一个死胡同,苹果现在正在嘲笑我......

谢谢你的帮助!

本杰明

ios core-bluetooth

4
推荐指数
2
解决办法
4304
查看次数