0

我正在尝试编写一个执行实时降噪的 Android 程序。整个源代码太长,但要点是:
麦克风 -> FFT -> 降噪和增益计算 -> IFFT -> 扬声器
如果我绕过中间的降噪功能,扬声器会通过麦克风输入的任何内容。在这种情况下声音很清晰。但是如果我启用降噪功能,实际降噪似乎正在起作用,因为我启动的吸尘器发出的声音被抑制了,而我可以听到周围的人说话。但是,输出似乎失真。这种失真有些可能是由降噪算法本身引起的,但如果我仔细听声音,我会注意到一种严重的失真,就好像声音在“跳帧”一样。在我对一些其他类型的用于声音的数字滤波器进行实验之后,我知道这是因为 FFT 需要很长的 for 循环,IFFT和降噪功能。由于当程序卡在 for 循环中时,在此期间扬声器没有输出。由于存在大量 for 循环,因此这种破损很明显,并且输出听起来很粗糙。

有没有办法加快速度,使程序在 for 循环中花费尽可能少的时间?任何其他类型的循环会有所作为吗?如果我能以某种方式找到一种方法将降噪功能中的操作分解为独立的部分,然后在单独的线程中进行计算,是否有助于消除失真?或者增加线程数会导致类似的问题吗?

4

2 回答 2

0

降低分辨率,尽可能内联所有内容。在 Java 中 gc 真的可以减慢实时操作,所以尽早分配并重用一切。

除此之外,如果它要慢,那就是慢。

好吧,还可以加速/分析循环内部并减少瓶颈。

于 2013-10-17T07:18:34.267 回答
0

预计输入和过滤声音之间的固定延迟。每帧的处理时间可能不同,因此处理的部分不应立即发送到输出,而是在其预定时间到来时发送。

于 2013-10-17T07:45:45.120 回答