我对离散fft有一个奇怪的问题。我知道高斯函数exp(-x ^ 2/2)的傅立叶变换同样是高斯函数exp(-k ^ 2/2)。我尝试用MatLab和FFTW中的一些简单代码测试它,但我得到了奇怪的结果。
首先,结果的虚部不应该是零(在MatLab中)。
其次,实部的绝对值是高斯曲线,但没有绝对值,一半模式具有负系数。更确切地说,每个第二模式的系数都应该是它的负值。
第三,得到的高斯曲线的峰值(在取实部的绝对值之后)不是一个而是高得多。其高度与x轴上的点数成比例。但是,比例因子不是1但接近1/20。
有人能解释我的错误吗?
以下是我使用的MatLab代码:
function [nooutput,M] = fourier_test
Nx = 512; % number of points in x direction
Lx = 50; % width of the window containing the Gauss curve
x = linspace(-Lx/2,Lx/2,Nx); % creating an equidistant grid on the x-axis
input_1d = exp(-x.^2/2); % Gauss function as an input
input_1d_hat = fft(input_1d); % computing the discrete FFT
input_1d_hat = fftshift(input_1d_hat); % ordering the modes such that the peak is centred
plot(real(input_1d_hat), '-')
hold on
plot(imag(input_1d_hat), 'r-')
答案 0 :(得分:4)
答案基本上就是Paul R在他的第二篇评论中所建议的,你引入一个相移(线性依赖于频率),因为input_1d_hat
描述的高斯中心实际上是k>0
,其中k+1
是input_1d_hat
的索引。相反,如果您将数据居中(使input_1d_hat(1)
对应于中心),则会在频域中获得相位校正高斯:
Nx = 512; % number of points in x direction
Lx = 50; % width of the window containing the Gauss curve
x = linspace(-Lx/2,Lx/2,Nx); % creating an equidistant grid on the x-axis
%%%%%%%%%%%%%%%%
x=fftshift(x); % <-- center
%%%%%%%%%%%%%%%%
input_1d = exp(-x.^2/2); % Gauss function as an input
input_1d_hat = fft(input_1d); % computing the discrete FFT
input_1d_hat = fftshift(input_1d_hat); % ordering the modes such that the peak is centered
plot(real(input_1d_hat), '-')
hold on
plot(imag(input_1d_hat), 'r-')
根据DFT的定义,如果高斯不居中使得最大值出现在k=0
,您将看到相位扭曲。关闭fftshift
的效果是执行循环移位或交换数据集的左侧和右侧,这相当于将峰的中心移动到k=0
。
关于幅度缩放,这是在Matlab中实现的DFT定义的问题。来自FFT的文档:
For length N input vector x, the DFT is a length N vector X, with elements N X(k) = sum x(n)*exp(-j*2*pi*(k-1)*(n-1)/N), 1 <= k <= N. n=1 The inverse DFT (computed by IFFT) is given by N x(n) = (1/N) sum X(k)*exp( j*2*pi*(k-1)*(n-1)/N), 1 <= n <= N. k=1
请注意,在前进步骤中,求和不由N归一化。因此,如果在总和中增加点Nx
的数量,同时保持宽度Lx
高斯函数常数将按比例增加X(k)
。
对于信号泄漏到假想的频率维度,这是由于DFT的离散形式,导致截断和其他影响,如Paul R.再次提到的那样。如果你在保持Lx
时减少Nx
{1}}常数,您应该看到虚拟维度相对中的信号量减少到实际维度(比较光谱,同时保持真实维度中的峰值强度相等)。