更新2016-03-15
我做了很多研究,并学到了很多关于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) 我正在设计一个iOS框架来处理多个BLE设备(所有类型).除了一件事之外,目前一切都运转良好:
客户端需要包含可用设备的列表.但是,我怎样才能检测到过去发现的设备何时不再可用?
当我尝试连接到不再可用的设备时,会出现另一个问题.文档说:连接尝试永远不会超时
是的,我从来没有通过didFailToConnectPeripheral收到错误.
我做了一些研究,但无法弄清楚如何通过CoreBluetooth正确处理这些问题.所以我开发了自己的解决方案,但我不确定这是否是正确的方法(或者至少是一种好方法,因为可能有几种方法可以做到这一点).
1.检测不再可用的设备
我用扫描
[_centralManager scanForPeripheralsWithServices:services options:@{CBCentralManagerScanOptionAllowDuplicatesKey: @(TRUE)}];
Run Code Online (Sandbox Code Playgroud)
所以只要设备没有连接,我就会一直收到广告.我用计时器检查广告在给定的时间间隔内重新固化(足够大,对应于设备广告间隔).如果在间隔中没有出现广告,我将从列表中删除该设备.
2.检测连接超时 嗯,我觉得这很容易.我使用自己的超时功能,并在计时器到期时取消连接请求.
如果有人遇到过这些问题,我会对您的意见和/或您的解决方案非常感兴趣.
更新2014-12-17:
与此同时,我使用计时器开发了我自己的解决方案,它看起来效果很好.
连接超时是直接的.只需将计时器设置为5秒或您认为对您有益的任何东西.如果计时器到期且设备未连接,只需取消连接并告诉用户存在问题.
检测超出范围的设备有点棘手.对于每个发现的设备,我启动一个计时器,在两倍的时间后触发,设备发送广告.如果设备确实发送了另一个广告,直到计时器到期,它可能超出范围或被关闭或连接到另一个设备.
我不想回答我自己的问题,因为我希望苹果有朝一日可以解决这些问题.
我正在尝试在两个 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 文档中也没有提到这些方法。也许这是一个死胡同,苹果现在正在嘲笑我......
谢谢你的帮助!
本杰明