过滤流式音频

信息处理 过滤器 声音的 低通滤波器 高通滤波器
2022-01-18 11:22:17

给定 103 个数据点 ( ),DFT 将返回 103 个频率值。然后做一些过滤高频的事情,包括将 DFT 中的高频值设置为零,并进行逆 DFT 以获取 103 个表示没有高频的原始信号的数据点。N=103

考虑到所有 103 个数据点,这对我来说很有意义。但是如何流式传输相当大的音频 WAV 文件(例如)。如果想要过滤高频,那么我刚刚描述的点的整个数据的方法在逻辑上是有意义的。但这在流式播放 WAV 文件时是不合理的。如何对音频文件的流式播放进行高频过滤?N=105105

2个回答

FFT -> 归零系数 -> IFFT 不是正确的滤波方式 - 这样做实现的实际滤波器特性很差。

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

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

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

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

需要零填充和重叠的整个业务,因为频域中的乘法实现循环卷积,并且在大多数应用程序中您确实需要线性卷积。

这些方法有不同的变体,使用不同的窗口函数和重叠,但它们的原理都是一样的:把它切成小块,一次处理一个块。