我正在尝试写一个Android程序,执行实时降噪。整个源代码太长了,但要点是:
麦克风->快速傅立叶变换->降噪和增益计算-> IFFT ->扬声器
如果我绕过中间的降噪功能,扬声器就会通过麦克风输入的任何东西。在这种情况下声音是清晰的。但如果我启用降噪功能,实际的降噪效果似乎是有效的,因为我启动的真空吸尘器发出的声音会被抑制,而我可以听到周围的人说话。然而,产出似乎被扭曲了。其中一些失真可能是由降噪算法本身造成的,但如果我仔细听声音,我可以注意到一种粗糙类型的失真,就好像声音是“跳过帧”一样。在我对一些其他类型的数字滤波器进行了实验后,我知道这是因为FFT、IFFT和降噪功能需要非常长的for循环。因为当程序停留在for循环中时,在此期间没有来自扬声器的输出。因为有很多for循环,这种破坏是显而易见的,而且输出听起来很粗糙。
有没有办法加快速度,让程序在for循环中花费尽可能少的时间?其他类型的循环会有所不同吗?如果我能找到一种方法将降噪函数中的操作分解为独立的部分,然后在单独的线程中进行计算,这是否有助于消除失真?或者增加线程的数量会导致类似的问题吗?
发布于 2013-10-17 15:18:34
降低分辨率,尽可能地内联所有内容。在java中,gc确实会减慢实时操作的速度,所以要及早分配资源并重用所有东西。
除此之外,如果它是慢的,它就是慢的。
那么,也要加速/剖析循环的内部,并减少瓶颈。
发布于 2013-10-17 15:45:45
预期输入和过滤声音之间的固定延迟。每个帧的处理时间可能不同,因此处理部分不应立即发送到输出,而是在其计划时间到来时发送到输出。
https://stackoverflow.com/questions/19420360
复制相似问题