You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFT归一化与numpy norm选项对比及相关技术疑问

关于FFT归一化与卷积的几个问题

我常需要对循环卷积结果做归一化,参考并修改了如下代码:

def fft_normalize(x):# Normalize a vector x in complex domain.
    c = np.fft.rfft(x)
    # Look at real and image as if they were real
    ri = np.vstack([c.real, c.imag])
    # Normalize magnitude of each complex/real pair
    norm = np.linalg.norm(ri, axis=0)
    if np.any(norm==0): norm[norm == 0] = np.float64(1e-308) #!fixme
    ri= np.divide(ri,norm)
    c_proj = ri[0,:] + 1j * ri[1,:]
    rv = np.fft.irfft(c_proj, n=x.shape[-1])
    return rv

def fft_convolution(a, b):
    return np.fft.irfft(np.fft.rfft(a) * np.fft.rfft(b))

我通过fft_normalize(fft_convolution(a,b))实现需求。

1. 自定义归一化与numpy FFT的norm='ortho'是否等价?

注意到numpy文档里有norm选项,想知道它和我实现的归一化是否等价?如果等价,该用哪个选项?
我写了对比代码:

def fft_convolution2(a, b):
    return np.fft.irfft(np.fft.rfft(a) * np.fft.rfft(b), norm='ortho')

测试发现自己写的fft_normalize效果更好。

2. 零范数处理的优化方案

我加了处理零范数的代码,但感觉不合理,求优化方案:

if np.any(norm==0): norm[norm == 0] = np.float64(1e-308) #!fixme

3. scipy FFT的性能与版本问题

numpy文档提到会把float32提升为float64,但scipy.fftpack不会。想问scipy.fftpack是否更快?另外scipy说fftpack已过时,但新的scipy FFT相关信息缺失,求相关说明。

4. 修改后的fft_normalize函数是否正确?

修改后的函数如下,想确认正确性:

def fft_normalize(x):# Normalize a vector x in complex domain.
    c = np.fft.rfft(x)
    ri = np.vstack([c.real, c.imag])
    norm = np.abs(c)
    if np.any(norm==0): norm[norm == 0] = MIN #!fixme
    ri= np.divide(ri,norm)
    c_proj = ri[0,:] + 1j * ri[1,:]
    rv = np.fft.irfft(c_proj, n=x.shape[-1])
    return rv

内容的提问来源于stack exchange,提问作者sten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:25:48