处理人声

时间:2013-04-09 07:39:27

标签: android audio fft

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

2 个答案:

答案 0 :(得分:2)

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

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

回复评论:

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

无论哪种方式,如果你想要的只是一个度量/值,这应该在时域中完成。正如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,应用滤波器在时间域通过卷积。

答案 1 :(得分:0)

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