fft(x) 与 fft(ifft(fft(x)) 不同?

信息处理 fft 频谱 IFFT
2022-02-09 21:49:26

我对时间序列的频谱进行了归一化并将频谱加窗,然后发生了一些奇怪的事情。下面的代码可以在 MATLAB 或 Octave 中运行。

figure;
n = 2e3;
t = 1:n;
m = n/2+1;
f = linspace(0,1,m);
x = rand(1,n) - 0.5;
y = fft(x);
subplot(2,2,1); plot(t,x,'k'); 
axis tight; xlabel('t/s'); title('original signal x');
subplot(2,2,2); plot(f,abs(y(1:m)),'k'); 
axis tight; xlabel('f/hz'); title('original spectrum');
y1 = y ./ abs(y);  
k = n/10;
w = sin(linspace(0,pi/2,k));
y1(1:k) = y1(1:k) .* w;
y1(m:-1:m-k+1) = y1(m:-1:m-k+1) .* w;
y1(n-m+3:n) = y1(m-1:-1:2);  
x1 = real(ifft(y1));
y2 = fft(x1);
x2 = real(ifft(y2));
subplot(2,2,3); plot(t,x1,'k',t,x2-x1,'r'); 
axis tight; xlabel('t/s'); title('whitened signal x1(black) and x2-x1(red)');
subplot(2,2,4); plot(f,abs(y1(1:m)),'k',f,abs(y2(1:m)),'r');
axis tight; xlabel('f/hz'); title('whitened spectrum y1(black) and y2(red)');

如子图 3 所示,红线是 和 之间的差异x1x2表示它们完全相同,但如子图 4 所示,它们的光谱(分别为黑色和红色)不同。因此,奇怪的是,频谱的 IFFT 的 FFT 与频谱本身不同。

图1

2个回答

问题似乎是您的窗口函数不保留复杂的共轭对称性。所以 ifft(y1) 有一个重要的虚部。通过 real() 操作丢弃它,您会引发一个导致差异的重大错误。验证尝试

z = ifft(y1); plot(imag(z));

Hilmar 是对的,这是 FFT 索引的问题。实际上,您处理了未出现在 FFT 右侧副本中的 DC。同样,您必须照顾 Fs/2 组件。

这是修改后的工作代码。

figure;
n = 2e3;
t = 1:n;
m = n/2+1;
f = linspace(0,1,m);
x = rand(1,n) - 0.5;
y = fft(x);
subplot(2,2,1); plot(t,x,'k'); 
axis tight; xlabel('t/s'); title('original signal x');
subplot(2,2,2); plot(f,abs(y(1:m)),'k'); 
axis tight; xlabel('f/hz'); title('original spectrum');
y1 = y ./ abs(y);  
k = n/10;
w = sin(linspace(0,pi/2,k));
y1(1:k) = y1(1:k) .* w;
y1(m-k:m-2) = y1(m-k:m-2).*fliplr(w(2:end));
y1(m-1:m+k-2) = y1(m-1:m+k-2).*w;
y1(n-k+2:n) = y1(n-k+2:n).*fliplr(w(2:end));

x1 = real(ifft(y1));
y2 = fft(x1);
x2 = real(ifft(y2));
subplot(2,2,3); plot(t,x1,'k',t,x2-x1,'r'); 
axis tight; xlabel('t/s'); title('whitened signal x1(black) and x2-x1(red)');
subplot(2,2,4); plot(f,abs(y1(1:m)),'k',f,abs(y2(1:m)),'r');
axis tight; xlabel('f/hz'); title('whitened spectrum y1(black) and y2(red)');

结果数字是: 在此处输入图像描述