如何从复杂的 ifft 值中获得真实信号?

信息处理 matlab fft 离散信号 dct
2022-02-15 04:32:55

我试图了解压缩上下文中 DCT 和 FFT 之间的区别。这里给出了一个很好的实际例子(接近页面末尾)

当我在 matlab 中尝试它时,我被困在绘制 ifft 值(这很复杂)。plot 命令无法绘制复信号。我想到一个自然的问题,ifft 值什么时候是复杂的,什么时候是真实的?如果它很复杂,是否可以丢弃虚部而只保留实部?

从 ifft 复数值重建真实信号 x 的正确方法是什么?

3个回答

您可以分别绘制 FFT 结果中的实部和虚部(或将幅度和相位结果分别绘制为两个图)。然后,您可以将两个绘图中的数据重新组合成进行重建 IFFT 所需的复杂光谱。这两个组件都是必需的,否则您已经丢弃了有关信号的一半信息,并且无法重建它(除非原始信号一开始是纯对称或纯反对称的)。

当您绘制两个绘图时,绘图数据并没有真正翻倍,因为这是共轭对称的严格实数输入的 FFT 的结果。因此,您可以仅从数据的前半部分为实图和虚图创建重建 IFFT 的输入(通过将其共轭镜像到另一半)。

您可以使用以下代码(在 MATLAB 上)通过取实部来绘制傅里叶逆变换:

image = imread('image.jpg');
image = rgb2gray(image);
figure; imshow(image); title('Original Image')

Fourier_Transform = fft2(double(image)); 
Fourier_Transform_shift = log(abs(fftshift(Fourier_Transform)+1)); 
Fourier_Transform_normalized = Fourier_Transform_shift/max(max(max(Fourier_Transform_shift)));
figure; imshow(Fourier_Transform_normalized); title('Fourier Transform of the Original Image')

Inverse_Fourier_Transform = ifft2(Fourier_Transform);
%figure; imshow(iff); title ('Inverse Fourier Transform')

Inverse_Fourier_Transform_Real = uint8(real(Inverse_Fourier_Transform));
figure; imshow(Inverse_Fourier_Transform_Real); title ('Restored Image (Real Part of IFFT)') 

对于大多数部分,恢复的信号或图像看起来与原始的完全一样。

我想重绘上下文。大多数使用 DCT 或 FFT 的数字数据(信号或图像)都是离散的,无论是在索引(时间、空间)和幅度(以整数表示的位深度,0255对于灰度图像)。出于压缩目的,很少有用的线性变换映射8-位数据稀疏/可压缩n位系数。对于 DCT 和 FFT,涉及正弦/余弦超越数,因此是非二进有理数,很难得到严格的可逆或无损变换。余数通常很小。很多时候,对整数数据进行 DCT,然后 IDCT 会产生应该四舍五入的非整数数据。

复杂的变换也会发生同样的情况。从真实数据来看,变换和逆可能看起来很复杂,但通常虚部足够小。如果不是,则表明代码中有错误。

足够小是复杂的。我的选择是选择,因为B-位数据,阈值的顺序1/2B实部与虚部之比。如果相遇,认为虚部可以忽略不计,只从实部反转。