我想放大特定频率的音频输入,我使用numpy.fft.
所以我的问题是:当改变信号的幅度时,相位会发生什么?
例如,如果我在某个频率范围内乘以某个因子的幅度,假设为2,我是否需要更改相位,如果是,我该怎么办呢?
我已经完成了放大而没有改变相位,结果不是我想要的.它几乎是相同的信号,有一些不必要的噪音.
你不应该为这样的事情改变阶段.更有可能的问题是你需要更加温和地应用提升.听起来你正在采用一些频率窗口并乘以一个常数,同时保持其他一切不变.这将导致时域中的振铃具有非常长的尾部.您需要平滑从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
Run Code Online (Sandbox Code Playgroud)
如果可行,您可以尝试更具侵略性的功能,这些功能具有更清晰的开启和更平坦的顶部.
FFT可能实际上并不是你想要的.FFT通常不用于实时/流应用.这是因为在天真的方法中,您必须在开始处理之前收集整个样本缓冲区.对于简单的过滤应用程序,通常更容易在时域中直接进行过滤.这就是FIR和IIR滤波器的功能.
为了实时过滤傅立叶变换,您需要做的是将数据流分解为固定长度的重叠块,FFT,滤波器,反向FFT,并将它们重新组合在一起,而不会引入毛刺.这是可能的,但要做到这一点很棘手.对于完整的多通道均衡器,它可能仍然是最佳选择,但您至少应该考虑时域滤波.
如果这不是实时应用程序,那么FFT就是最佳选择.对于中等大小的数据集(高达几百兆字节),您可以只对整个数据集进行FFT.对于更大的数据集,您仍然必须将数据分解为块,但它们可以是更大的块,您不必担心引入的延迟.
此外,请记住FFT将信号视为周期性信号,因此如果您的信号在开始和结束时没有变为零,则需要进行某种窗口化.
| 归档时间: |
|
| 查看次数: |
799 次 |
| 最近记录: |