我试图了解压缩上下文中 DCT 和 FFT 之间的区别。这里给出了一个很好的实际例子。(接近页面末尾)
当我在 matlab 中尝试它时,我被困在绘制 ifft 值(这很复杂)。plot 命令无法绘制复信号。我想到一个自然的问题,ifft 值什么时候是复杂的,什么时候是真实的?如果它很复杂,是否可以丢弃虚部而只保留实部?
从 ifft 复数值重建真实信号 x 的正确方法是什么?
我试图了解压缩上下文中 DCT 和 FFT 之间的区别。这里给出了一个很好的实际例子。(接近页面末尾)
当我在 matlab 中尝试它时,我被困在绘制 ifft 值(这很复杂)。plot 命令无法绘制复信号。我想到一个自然的问题,ifft 值什么时候是复杂的,什么时候是真实的?如果它很复杂,是否可以丢弃虚部而只保留实部?
从 ifft 复数值重建真实信号 x 的正确方法是什么?
您可以分别绘制 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 的数字数据(信号或图像)都是离散的,无论是在索引(时间、空间)和幅度(以整数表示的位深度,对于灰度图像)。出于压缩目的,很少有用的线性变换映射-位数据稀疏/可压缩位系数。对于 DCT 和 FFT,涉及正弦/余弦超越数,因此是非二进有理数,很难得到严格的可逆或无损变换。余数通常很小。很多时候,对整数数据进行 DCT,然后 IDCT 会产生应该四舍五入的非整数数据。
复杂的变换也会发生同样的情况。从真实数据来看,变换和逆可能看起来很复杂,但通常虚部足够小。如果不是,则表明代码中有错误。
足够小是复杂的。我的选择是选择,因为-位数据,阈值的顺序实部与虚部之比。如果相遇,认为虚部可以忽略不计,只从实部反转。