1、基本原理

        DCT(离散余弦变换)和FFT(快速傅里叶变换)都是常见的信号处理技术,它们可以帮助我们对信号进行处理,比如压缩、去噪等。

        在DCT中,信号被转换成一种类似于音乐中的音调的表示方式,然后我们可以通过裁剪等方式来进行信号压缩,这就是我们通常看到的缩小的图像。不过,DCT有一个缺点,它不能很好地处理某些噪声,特别是当噪声的强度很大时。

        在FFT中,信号被转换成频率域上的特定波形表示。这个波形代表了信号的正弦和余弦分量,这样我们可以使用FFT来处理多种周期性噪声,例如具有周期性的声音和音乐信号。然而,FFT对某些非周期性噪声的信号,如自然图像和视频信号的处理性能并不理想。

        通常情况下,我们使用不同方法来处理噪声和其他干扰,因此我们可以把DCT和FFT一起使用。具体地,我们可以通过DCT缩小图像,然后再通过FFT去除细小的噪声,从而获得一种更好的处理效果。但需要注意的是,不同的数据类型、处理方法和数据本身的特性,都会对压缩效果产生影响。

        它们的R(D)曲线指的是信号的信噪比(Signal-to-Noise Ratio,简称SNR)与译码半径(R)之间的关系。在信号处理中,SNR表示信号中有用信息和噪声之间的比例,R表示在符合给定SNR条件下,可以处理的最大噪声比特数。

        通常情况下,对于一个给定的D值,我们可以计算出对应的译码半径R(D),然后根据具体的信号特征和处理方法来计算这个D值下的SNR值。最后,将计算出来的SNR值和对应的R(D)值画在图上,就可以得到了DCT和FFT的R(D)曲线。

        需要注意的是,不同类型的信号处理在SNR条件下所能处理的最大噪声位数是不同的,因此对于不同类型的信号,其R(D)曲线也会有所不同。同时,由于SNR和R(D)之间的关系比较复杂,因此对于同一种信号处理技术,其R(D)曲线也可能会受到不同的实验条件和研究方案的影响,因此需要进行多次实验来获得更加准确和可靠的图像。

2、仿真结果

图 1 DCT压缩(左)和FFT压缩(右)对比
图 2 DCT压缩和FFT压缩的D(R)曲线对比

 3、结果分析

        DCT和FFT是两种常见的信号压缩方法。它们都可以通过在频域中减小信号中高频分量的数量来压缩信号。然而,DCT和FFT的压缩效果有所不同,如图1,用DCT和FFT两种压缩方式对图片进行压缩,最终得到的图片清晰度差不多,但DCT的压缩率却比FFT高出许多,可知在相同条件下,DCT的压缩效果比FFT要好。另外两种压缩方法的R(D)曲线也有所不同,如图2,DCT的R(D)曲线比FFT的曲线更陡峭。这意味着,在相对较小的压缩比下,DCT可以获得更好的压缩效果。但是,在较高的压缩比下,FFT可能会表现得更好。这种行为差异主要是因为DCT和FFT使用不同的基函数来表示信号。DCT使用余弦函数,而FFT使用正弦和余弦函数。由于余弦函数的性质比正弦和余弦函数更平坦,因此DCT在低频区域可以更好地近似信号。然而,在高频区域,FFT使用的正弦和余弦函数更适合近似信号。

        因此,在较低的压缩比下,通常建议采用DCT(离散余弦变换),因为DCT更适合用于稠密信号和较短的信号(例如音频信号),并且DCT具有比FFT更快的计算速度。 在较高的压缩比下,由于压缩率增加,信号的稠密度下降,此时采用FFT可以更好地保留信号的能量信息,因此建议采用FFT来对较长、稀疏的信号进行压缩。但是,由于FFT的计算复杂度较高,因此在实际应用中需要根据压缩比和计算复杂度等因素进行权衡和选择。

 4、MATLAB代码

% 绘画并比较DCT和FFT两种压缩方法的R(D)曲线
close all;clc;clear;
timeP=.95;
threshold=0e0: 100:1e3;
mse_dct=zeros(size(threshold)); rate_dct=zeros(size(threshold)); 
mse_fft=zeros(size(threshold)); rate_fft=zeros(size(threshold));
%% Read Image
f=imread('coolLearn.PNG');
fdouble=double(f);
[wid ,len,dep]=size(fdouble); compressI3_dct=zeros(size(f));compressI3_fft= zeros(size(f));
for th=1:length(threshold)
for j=1:dep
    %% dct压缩
    dctgrayImage_dct = dct2(fdouble(:,:,j));
    dctgrayImage2_dct = dctgrayImage_dct;
    % 低通滤波
    dctgrayImage2_dct(abs(dctgrayImage2_dct)<threshold(th)) = 0;
    %求压缩率
    compressionRate_dct = numel(dctgrayImage_dct)/numel(find(dctgrayImage2_dct));
    % 通过索引对DCT系数进行压缩
    index_dct = find(dctgrayImage2_dct);
    compressedDCT = dctgrayImage2_dct(index_dct);
    % 将压缩后的 DCT 系数转换为二进制数据
    bin_dct = dec2bin(abs(compressedDCT));
    % 对过滤之后的结果在三个颜色上分别做进行二维反DFT变换
    compressI_dct = idct2(dctgrayImage2_dct);
    compressI_dct = compressI_dct/255;%为什么要除255?
    compressionRate_dct,
    compressI3_dct(:,:,j)=compressI_dct;

    %% fft压缩
    dctgrayImage_fft = fft2(fdouble(:,:,j));
    dctgrayImage2_fft = dctgrayImage_fft;
    % 低通滤波
    dctgrayImage2_fft(abs(dctgrayImage2_fft)<threshold(th)*255) = 0;
    %求压缩率
    compressionRate_fft = numel(dctgrayImage_fft)/numel(find(dctgrayImage2_fft));
    % 通过索引对FFT系数进行压缩
    index_fft = find(dctgrayImage2_fft);
    compressedFFT = dctgrayImage2_fft(index_fft);
    % 将压缩后的 FFT 系数转换为二进制数据
    bin_fft = dec2bin(abs(compressedFFT));
    % 对过滤之后的结果在三个颜色上分别做进行二维反离散傅里叶变换
    compressI_fft = ifft2(dctgrayImage2_fft);
    compressI_fft = compressI_fft/255;%为什么要除255?
    compressI3_fft(:,:,j)=compressI_fft;
end
mse_dct(th)=norm(compressI3_dct*255-fdouble,'fro')^2;
rate_dct(th)=3*numel(bin_dct);
mse_fft(th)=norm(compressI3_fft*255-fdouble,'fro')^2;
rate_fft(th)=3*numel(bin_fft);
%% plot
subplot(2,4,1);
imshow(f )
title('The original  image')
subplot(2,4,2);
imshow(im2uint8(compressI3_dct))
title(['Compressed PIC, Compress Rate=',num2str(compressionRate_dct)]) 

subplot(2,4,5);
imshow( log(abs(dctgrayImage_dct)),[]);
title('DCT of origenal PIC') 
subplot(2,4,6)
imshow( log(abs(dctgrayImage2_dct)+1e-10),[]);
title('DCT of transformed PIC')

subplot(2,4,3);
imshow(f )
title('The original  image')
subplot(2,4,4);
imshow(im2uint8(compressI3_fft))
title(['Compressed PIC, Compress Rate=',num2str(compressionRate_fft)]) 

subplot(2,4,7)
imshow( log(abs(dctgrayImage_fft)),[]);
title('FFT of origenal PIC') 
subplot(2,4,8)
imshow( log(abs(dctgrayImage2_fft)+1e-10),[]);
title('FFT of transformed PIC')

pause(timeP)
end
figure
semilogy(mse_dct,rate_dct,'r-*',mse_fft,rate_fft,'b-*','LineWidth',2)
legend('DCT','FFT')
set(gcf,'position',[100 400  500 500]);
FontSize=14;marksize=6; 
xlabel('Distortion: MSE','FontSize',FontSize);ylabel('Rate','FontSize',FontSize)%MSE

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐