如何使用 iphone 麦克风输入进行开关以计算车轮转数?
Posted
技术标签:
【中文标题】如何使用 iphone 麦克风输入进行开关以计算车轮转数?【英文标题】:How to make a switch with iphone mic input to count turns of wheel? 【发布时间】:2013-04-04 06:22:22 【问题描述】:我正在开发应用程序,我想测量车轮的转数。我买了一个便宜的自行车里程表,它使用磁铁开关计算自行车车轮的转数,当磁铁离传感器足够近时,每转一圈就会闭合一次电路。我的想法是将此磁铁开关添加到iphone耳机的麦克风电路,然后使用音频框架来管理麦克风的连接,制作一个开关,可以识别麦克风何时连接或未连接,然后用它做一个计数器。我可以进行切换的方法是使用带有[AVCaptureDevice] 类的AVFoundation 框架,因为我发现这是在[this-post] 回答问题之后区分外部和内部麦克风的唯一方法。
我从我的代码中粘贴了一段摘录来测试开关。计时器循环中的代码。
NSString *name;
static int micSwitch=0;
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio];
for (AVCaptureDevice *device in devices)
name = [ device localizedName];
if ([name isEqual:@"iPhone Microphone"])
micSwitch=0;
else
micSwitch=1;
但是,此开关的更新速度比我需要的要慢。据我估计,开关需要在不到 1.5 毫秒 内更新。有人有更好的想法,我该如何使用音频插孔输入?
【问题讨论】:
我的数学会很粗糙。在距车轮中心 12' 处的开关以 20Hz 旋转时,其速度约为 3800 sm/s。如果开关在 5sm 半径范围内运行,您有大约 2ms 的窗口来检测它,这意味着您需要能够在每个 N s whereN < 1ms
处检查一次设备,而不是 50ms。
是的,我明白你的意思。考虑到转弯的时间,我很快就做出了这个计算。但是考虑磁铁通过传感器的速度是关键。我正确测量了车轮尺寸和传感器距车轮中心的距离,我得到了一个 1.5 毫秒的窗口。谢谢。
【参考方案1】:
与其将簧片开关连接到麦克风电路以虚拟连接和断开耳机,不如让开关直接在麦克风线路输入上产生噪音并处理音频输入。根据线路的噪声程度,您可能需要对传入的音频数据应用非常短周期的平均滤波器,以便可靠地检测尖峰。
如果您无法让簧片开关在其打开/关闭时产生足够长且嘈杂的尖峰,那么在其位置放置一个小线圈应该可以将磁铁连接到车轮上。
更新:我发现本教程用于检测吹入麦克风的噪声尖峰 - 检测簧片开关或线圈咔哒声的原理应该相同(检测窗口更短),代码将非常相似。
http://mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/
【讨论】:
感谢建议,抱歉耽搁了。我按照教程并用它测试了开关。它工作得很好,它检测到峰值,但速度不足以制作计数器。我的意思是,我使用示波器应用程序进行了测试,并在激活开关时创建了一个尖峰。然后,我按照教程进行了测试,但 NSLog 多次显示“检测到麦克风击穿”,而只有一个尖峰。我想这是因为计算 peakPowerForChannel 的时间窗口太长了。您知道如何缩短窗口,因为 [recorder updateMeters] 无法更改?? 哦,我猜内置电平表的过滤周期一定太长了,不能满足你的需要。在这种情况下,您必须自己处理音频,而不是使用AVAudioRecorder
。看看 Apple 的这个示例项目:developer.apple.com/library/ios/#samplecode/aurioTouch2/… - 如果您测量尖峰持续多长时间(多少个样本),您可以应用一个略低于该长度的非常短的过滤器来可靠地检测尖峰。
这个项目进展如何?
实际上我停止了一段时间的工作。我一回来就让你更新。谢谢。以上是关于如何使用 iphone 麦克风输入进行开关以计算车轮转数?的主要内容,如果未能解决你的问题,请参考以下文章