如果我的问题没有意义,请提前道歉。我不是信号处理方面最流利的人。
我有一个时域值数组,我想通过计算 fft 来应用时间延迟,然后应用傅里叶变换 然后计算逆 fft 以获得我的延迟信号。
我的问题是延迟非常大(比我的原始信号范围大三倍),所以为了获得延迟信号,我一直在零填充我的原始信号,这大大增加了计算时间。
有没有更好的方法来使用傅立叶变换计算延迟而不需要零填充?
如果我的问题没有意义,请提前道歉。我不是信号处理方面最流利的人。
我有一个时域值数组,我想通过计算 fft 来应用时间延迟,然后应用傅里叶变换 然后计算逆 fft 以获得我的延迟信号。
我的问题是延迟非常大(比我的原始信号范围大三倍),所以为了获得延迟信号,我一直在零填充我的原始信号,这大大增加了计算时间。
有没有更好的方法来使用傅立叶变换计算延迟而不需要零填充?
无论是在时域还是频域中实现延迟,您都必须进行零填充。(考虑一下:通过延迟,您可以使信号更长。)
使用 FFT 实现延迟实现了循环移位。如果您不填充并使用 FFT,则数据将简单地环绕自身。(想象一下,如果您没有零填充并使用 FFT,记录长度的持续时间。然后你会简单地回到你开始的东西,没有延迟,因为循环包装。)如果你只想要整数个样本延迟,在时域中做。
如果您想要分数样本延迟,您可以按照您的描述使用 FFT。如果您首先在时间上实现 20.7 个样本延迟 20 个样本,然后在频率上实现 0.7 个样本,或者您是否在频率上全部执行 20.7 个样本,那么在数学上没有区别。记住——你先垫了。正如您所说,从计算上讲,这会增加计算时间。但是您只是将长度增加了四倍,因此 FFT 的计算时间应该只增加两倍。这太多了吗?或者,您可以进行“批量”时间延迟和频率部分延迟。在频率部分,您有几个选择。首先,在做批量延时之前,您可以对原始未填充数据进行分数延迟,并在序列开始时接受分数样本延迟环绕错误。其次,您可以仅用一个样本填充数据,并使用 FFT 进行分数移位。如果您的 FFT 软件仅接受 2 的幂的记录长度并且您的原始记录长度是 2 的幂,这可能会使您的计算速度减慢两倍以上,因为没有采用快速算法。然而,大多数现代 FFT 包都为序列长度提供了快速算法,可以将其分解为小素数的乘积,因此添加一个数据点可能不会显着增加计算时间。如果您的 FFT 软件仅接受 2 的幂的记录长度并且您的原始记录长度是 2 的幂,这可能会使您的计算速度减慢两倍以上,因为没有采用快速算法。然而,大多数现代 FFT 包都为序列长度提供了快速算法,可以将其分解为小素数的乘积,因此添加一个数据点可能不会显着增加计算时间。如果您的 FFT 软件仅接受 2 的幂的记录长度并且您的原始记录长度是 2 的幂,这可能会使您的计算速度减慢两倍以上,因为没有采用快速算法。然而,大多数现代 FFT 包都为序列长度提供了快速算法,可以将其分解为小素数的乘积,因此添加一个数据点可能不会显着增加计算时间。
有些人建议使用插值器进行分数移位。FFT 是理想的插值器——当零填充不添加延迟指数或添加延迟指数时,它会精确地插值带限数据。但是,三次样条曲线是出色的插值器,应该在您的工具箱中。
正如您所尝试的那样,频域中的延迟只能是圆形的,因此除非您希望信号及时回绕,否则您必须调零。
我猜有一个很好的理由为什么你不能只在时域中添加适当数量的零?