为什么矩形脉冲的 FFT 具有虚部而 sinc 函数是实部?

信息处理 fft
2022-02-21 21:16:19

我有一个矩形脉冲:

w = 20; pln = 10;
v =[zeros(1, pln), ones(1, w),zeros(1, pln)];
figure(); plot(v,'-o');

通过执行fft并将fftshift脉冲中心归零得到其频域表示:

yf = fftshift(fft(v));
xf = [-0.5000   -0.4750   -0.4500   -0.4250   -0.4000   -0.3750   -0.3500   -0.3250...
-0.3000   -0.2750   -0.2500   -0.2250   -0.2000   -0.1750   -0.1500   -0.1250...
-0.1000   -0.0750   -0.0500   -0.0250         0    0.0250    0.0500    0.0750...
0.1000    0.1250    0.1500    0.1750    0.2000    0.2250    0.2500    0.2750...
0.3000    0.3250    0.3500    0.3750    0.4000    0.4250    0.4500    0.4750];
yf = yf.*exp(-2j*pi*xf*(pln+w/2)); % this shifts the time domain signal to zero

yf接近 sinc 函数 - 矩形函数的傅立叶变换 - 但不完全相同,它有虚部,而 sinc 是纯实数:

yf_sinc = w*sinc(w*xf);

为什么差异以及为什么ifft从 sinc 函数中提取的样本不会产生精确的矩形脉冲,但会在边缘附近产生波纹,而ifft(fft(v))会精确地再现原始矩形脉冲:

% has ripples around the edges
figure(); plot(fftshift(ifft(fftshift(yf_sinc)))); 
% reproduces the exact rectangular pulse  
figure(); plot(fftshift(ifft(fftshift(yf)))); 

这里yf,如果我们假设它是直接从底层函数采样的,也就是说它是由fft矩形脉冲产生的(无论如何它只是一些数字),它会是什么函数?是否可以通过在频域中采样一个函数(不需要是 sinc 函数)并获取ifft将产生一个精确的矩形脉冲?

矩形脉冲和 fft 与 sinc 函数的比较

3个回答

实数信号的偶数部分转换为 DFT 的实数部分。实信号的奇数部分转换为 DFT 的虚数部分。例如,余弦(偶函数)的 DFT 是严格实数的,而正弦(奇函数)的 DFT 是严格虚数的。

要获得纯真实的输出,您的信号需要是“DFT 均匀”对称的,这基本上意味着它在开始时有一个额外的样本。例如:

  • [0, 1, 2, 2, 1, 0]是“正常的”甚至是对称的
  • [0, 1, 2, 3, 2, 1]是 DFT 偶对称的

所以这个矩形脉冲 FFT 有一个虚部:

fft([0, 1, 1, 1, 1, 0])
Out[7]: 
array([ 4.0+0.j   , -1.5-0.866j, -0.5-0.866j,  0.0-0.j   , -0.5+0.866j,
       -1.5+0.866j])

但是这个矩形脉冲 FFT 不会:

fft([0, 0, 1, 1, 1, 0])
Out[8]: array([ 3.+0.j, -2.+0.j,  0.+0.j,  1.-0.j,  0.+0.j, -2.+0.j])

如您所见,DFT 输出也是 DFT 甚至对称的

[3, -2, 0, 1, 0, -2]
     │  └─────┘   │
     └────────────┘

频率箱本身也是如此:

[DC, fs/6, fs/3, -fs/2, -fs/3, -fs/6]
      │     └─────────────┘      │
      └──────────────────────────┘

这不是围绕索引 0(假设是第一个索引)对称的。您可能需要fftshift在转换之前和之后应用,以便在时域和频域中获得您期望的表示。