Matlab 时域/频谱/DSP

Matlab 时域/频谱/DSP,matlab,numpy,fft,ifft,Matlab,Numpy,Fft,Ifft,我在复值频谱上执行iFFT,并通过使第一个样本为零来改变相应的时域信号。最后通过FFT将其转换回频域 我想知道在这里使用双边(对称)频谱或仅使用单边频谱(仅正频率)之间的(物理)区别在哪里,因为两种结果不同(在比较正频率时) 第1版(双面光谱): fft( 零位( ifft([0,1+1j,2+j,2-2j,1-1j]) ) ) 输出: [-1.2,-0.2+1j,0.8+2j,0.8-2j,-0.2-1j] 版本2(单侧光谱): fft( 零位( ifft([0,1+1j,2+j]) ) )

我在复值频谱上执行iFFT,并通过使第一个样本为零来改变相应的时域信号。最后通过FFT将其转换回频域

我想知道在这里使用双边(对称)频谱或仅使用单边频谱(仅正频率)之间的(物理)区别在哪里,因为两种结果不同(在比较正频率时)

第1版(双面光谱):
fft(
零位(
ifft([0,1+1j,2+j,2-2j,1-1j])
)
)

输出: [-1.2,-0.2+1j,0.8+2j,0.8-2j,-0.2-1j]

版本2(单侧光谱):
fft(
零位(
ifft([0,1+1j,2+j])
)
)

输出:
[-1-1j,0+0j,1+1j]

由于您的IFFT例程不知道您提供的是单边频谱(即存在隐式复共轭对称负频率单元),因此它只能(错误地)将其解释为具有正和负频率单元的正常N点复频域输入


一些FFT库(例如FFTW、vDSP)确实支持实到复FFT和复到实IFFT,其中复频域单元的数量为N/2,并且省略了冗余的复共轭对称项,但是,它们通常有一个单独的API,这与具有N个输入和N个输出的更一般的复杂到复杂的情况不同。

这意味着在iFFT之前,为了执行时域操作,应始终将单边频谱扩展到双边频谱?是-如果您只有更常见的复杂到复杂的IFFT可用,那么您需要自己处理负频率箱。作为旁注,在numpy中,返回/操作单侧频谱的相关函数是
np.fft.rfft
np.fft.irfft
@Joe:good catch-对于复杂到真实的IFFT来说似乎是一个更方便的解决方案Julia也具有此功能
irfft