0

我正在尝试制作一个 android 应用程序来检查一个人录制的声音是否是高频的。我已经完成了录制部分,但不知道如何进一步进行。经过搜索,我发现必须使用 FFT 算法,但问题是如何获取必须作为输入传递给算法的数组值。有人可以帮忙吗?

4

2 回答 2

2

假设您已经定义了“包含高频”的含义,并且您只需要对此进行测量(无需在图表中可视化频率内容),则实际上无需计算 FFT。

我将计算信号的 RMS 值(总能量的度量),然后对数据应用低通滤波器(在时域中)并再次计算滤波后的信号的 RMS 值。比较能量损失是衡量您的初始能量值有多少高频成分。

回复评论:

您需要数据才能处理它!也许我不明白你的问题?您希望“获得确切值”的内容您已经说过您“完成了记录部分”,所以我假设您将信号存储在内存中,现在您需要计算信号的总能量以便 A)计算滤波后的能量变化或B)将能量与一些预定义的硬编码值进行比较(顺便说一句坏主意)。

无论哪种方式,如果您想要的只是一个度量/值,这应该在时域中完成。正如 Parseval 定理所述,无需执行 cpu 密集处理并转到频域来计算信号的能量。http://en.wikipedia.org/wiki/Parseval 's_theorem

阐述:

当您录制用户的声音(为您的信号收集数据)时,您需要确保数据不会丢失并正确存储在内存中(在某些数组类型的对象中)并且您有对该数组的引用。收集数据后,您无需将信号转换为值,它已经存储为一系列值。因此,您现在已准备好执行一些计算,以衡量“有多少高频”......

RMS(均方根)值是测量信号总能量的标准化方法 - 您采用“所有值平方平均值的平方根”。见http://mathworld.wolfram.com/Root-Mean-Square.html

RMS 计算起来既快速又容易,但它为您提供了总信号、低频分量和高频分量的能量,并且无法知道高 RMS 值是由于大量高频分量还是低频率成分。因此,我建议您去除高频分量并再次计算 RMS 值,以查看这样做的总能量变化了多少,即。高频对初始“原始” RMS 值的影响有多大。将这两个值相除是您的高频比率测量...我不确定这是您想要做的,但这是我会做的。

为了执行低通滤波,你需要选择一个频率值 Fcut 并说任何超过这个值的东西都被认为是“高”,然后应用一个截止点设置为 Fcut 的低通滤波器,应用一个滤波器是在时域中完成的卷积的手段。

于 2013-04-09T07:54:48.320 回答
0

通常他们使用AudioRecord类。它写入原始 PCM 数据,然后他们可以对数据进行一些计算。

于 2013-04-09T07:47:11.680 回答