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