给定类似103个数据点($ N = 103 $),DFT将返回103个频率值。然后要做类似高频滤波的操作,包括将DFT的高频值设置为零,然后进行逆DFT来获取103个数据点,这些数据点代表没有高频的原始信号。

鉴于所有103个数据点都一次,这对我来说很有意义。但是,如何流式传输较大的音频WAV文件呢(例如$ N = 10 ^ 5 $)。如果要过滤高频,那么我刚才在$ 10 ^ 5 $的整个数据上描述的方法在逻辑上是有意义的。但这在流式播放WAV文件时不合理。如何高频过滤音频文件的流播放?

#1 楼

FFT->调零系数-> IFFT不是正确的滤波方法-这样做实现的实际滤波器具有较差的特性。

正确的信号滤波方法是计算数字系数过滤器,一个称为过滤器设计的过程,针对该过程,可以使用大量的软件工具/文档,并将其应用于输入序列。简而言之,这包括为每个样本评估过去输入样本和过去输出样本的线性组合。根据滤波器在阻带抑制/纹波方面的要求,可能仅需要几个系数,使其比FFT效率更高。由于计算输出样本所需的唯一信息是过去的几个输入/输出样本,因此将其应用于流音频没有问题。

仅当您决定使用FFT时,才需要使用FFT。使用FIR滤波器,并且如果您的滤波器要求导致它们具有大量的系数。在这种特殊情况下,通过FFT和重叠叠加将滤波器应用于输入数据的连续块将非常有效。

#2 楼

对信号流应用频域滤波的最佳方法是重叠添加(或相关的样式重叠保存或块卷积等)。

您基本上一次拍摄一帧(例如1024个样本) )。零填充至两倍长度(2048),进行FFT,乘以滤波器的传递函数(也为零填充),进行逆FFT。将最后1024个样本保存为下一帧的重叠,将前一帧的重叠与前1024个样本相加,这就是您的输出。对于每1024个输入样本,您将获得1024个输出样本,然后只需对下一帧重复此操作,直到完成流。

由于频域中的乘法实现,因此需要填充和重叠为零的整个业务循环卷积,您真的需要在大多数应用中进行线性卷积。

这些方法有一些变体,它们使用不同的窗口函数和重叠部分,但原理都是相同的:将其切成小块并在其中处理一个块时间。

评论


$ \ begingroup $
是否有一本书详细介绍了此内容?
$ \ endgroup $
–user782220
2012年7月29日在5:46

$ \ begingroup $
@ user782220:dsp.stackexchange.com/questions/427/…
$ \ endgroup $
–马丁·汤普森(Martin Thompson)
2012年7月30日在11:01