FFT结果;幅相关系

时间:2013-11-16 15:43:10

标签: python numpy

我想放大特定频率的音频输入,我使用numpy.fft

所以我的问题是:当改变信号的幅度时,相位会发生什么?

例如,如果我在某个频率范围内乘以某个因子的幅度,假设为2,我是否需要更改相位,如果是,我该怎么办呢?

我在不改变相位的情况下完成了放大,结果不是我想要的。它几乎是相同的信号,有一些不必要的噪音。

1 个答案:

答案 0 :(得分:7)

你不应该为这样的事情改变阶段。更有可能的问题是你需要更加温和地应用提升。听起来你正在采用一些频率窗口并乘以一个常数,同时保持其他一切不变。这将导致时域中的振铃具有非常长的尾部。您需要平滑从gain = 1区域到gain = 2区域的转换,例如使用高斯波形,代码看起来像这样:

x, t = get_waveform()
f0, df = get_parameters()     # Center frequency and bandwidth of gain region
f = np.fft.rfft(x)
freqs = np.fft.fftfreq(len(x), t[1]-t[0])
freqs = freqs[0:len(f)]       # rfft has only non-negative frequency components
gain_window = 1 + np.exp(-(freqs-f0)**2/(df)**2)
f = f * gain_window
x = np.fft.irfft(f)
return x

如果可行,您可以尝试更具侵略性的功能,这些功能具有更清晰的开启和更平坦的顶部。

FFT可能实际上并不是您想要的。 FFT通常不用于实时/流应用。这是因为在天真的方法中,您必须在开始处理之前收集整个样本缓冲区。对于简单的过滤应用程序,通常更容易在时域中直接进行过滤。这就是FIR和IIR滤波器所做的事情。

为了实时过滤傅立叶变换,您需要做的是将数据流分解为固定长度的重叠块,FFT,滤波器,反向FFT,并将它们重新组合在一起,而不会引入毛刺。这是可能的,但要做到这一点很棘手。对于一个完整的多通道均衡器,它可能仍然是最好的选择,但你至少应该考虑时域滤波。

如果这不是实时应用程序,那么FFT就是最佳选择。对于中等大小的数据集(高达几百兆字节),您可以只对整个数据集进行FFT。对于更大的数据集,您仍然需要将数据分成块,但它们可以是更大的块,您不必担心引入的延迟。

另外,请记住FFT将信号视为周期性信号,因此如果您的信号在开始和结束时没有变为零,则需要进行某种窗口化。