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
相关产品推荐
相关产品推荐

