压缩感知中DCT变换矩阵的构造

压缩感知 专栏收录该内容
1 篇文章 0 订阅

在视频压缩感知领域,信号的稀疏表示始终都是一个很核心的问题,在OMP算法和BCS-SPL算法等算法中,都会涉及到DCT变换矩阵的构造,但是其往往和我们所了解的DCT变换的定义(DCT变换的定义可以参考之前的博文离散傅立叶变换DFT和离散余弦变换DCT)有所不同。

考虑到这些算法代码中DCT矩阵的构造都显得晦涩难懂而且基于定义构造的DCT变换矩阵和它们的功能又完全一样(且更容易理解),因此我们从DCT的定义出发给出DCT变换矩阵的构造代码。

一维DCT变换矩阵

参考之前的博文离散傅立叶变换DFT和离散余弦变换DCT中一维DCT的定义可以得到如下实现代码(直接拷贝保存为.m文件即可在MATLAB环境中使用):

function [Phi] = DCT_1D_Matrix(m)

%
%
% 该函数产生1维DCT-II变换矩阵,左乘对信号进行DCT-II变换,转置后左乘对信号进行IDCT-II逆变换
% 输入参数:
%           m:信号的长度
% this function return 2D DCT-II transform matrix,
%       
%       left multiply: transform the signal into dct domain
%
%       transpose and left multiply: transform the coefficient into
%       pixel domian
%
% Input parameters:
%           m: the number of signal
% 
% Programmer: Li Wenhao
% School: Electronic and information school
% University: South China University of Technology
% Date: 4/7/2016
%

Phi = zeros(m,m);

 for k = 1:m
     for n = 1:m
         Phi(k,n) = cos((2*n-1)*(k-1)*pi/(2*m));
     end
     if k==1
         Phi(k,:) = sqrt(1/m).*Phi(k,:);
     else
        Phi(k,:) = sqrt(2./m).*Phi(k,:);
     end
 end

注意:该矩阵左乘信号进行DCT变换,转置后左乘进行反变换!

说明:输入处理向量的长度即可得到一维DCT变换矩阵。

二维DCT变换矩阵

参考之前的博文离散傅立叶变换DFT和离散余弦变换DCT中二维DCT的定义可以得到如下实现代码(直接拷贝保存为.m文件即可在MATLAB环境中使用):

function [Phi] = DCT_2D_Matrix(m,n)

%
%
% 该函数产生2维DCT-II变换矩阵,左乘对信号进行DCT-II变换,转置后左乘对信号进行IDCT-II逆变换
% 输入参数:
%           m:信号的行数
%           n:信号的列数
% this function return 2D DCT-II transform matrix,
%       
%       left multiply: transform the signal into dct domain
%
%       transpose and left multiply: transform the coefficient into
%       pixel domian
% 
% Input parameters:
%           m: the number of row
%           n: the number of col
%
% Programmer: Li Wenhao
% School: Electronic and information school
% University: South China University of Technology
% Date: 4/7/2016
%


Phi = zeros(m*n,m*n);

temp = zeros(m,n);

for i = 1:m
    for j = 1:n

        for p = 1:m
            for q = 1:n
                temp(p,q) = cos((2*p-1)*(i-1)*pi/(2*m))*cos((2*q-1)*(j-1)*pi/(2*n));
            end
        end

        if i==1
            temp = sqrt(1/m).*temp;
        else
            temp = sqrt(2/m).*temp;
        end
        if j==1
            temp = sqrt(1/n).*temp;
        else
            temp = sqrt(2/n).*temp;
        end
        Phi((j-1)*m+i,:) = temp(:)';
    end
end

注意:该矩阵左乘信号进行DCT变换,转置后左乘进行反变换!

说明:一般我们输入二维信号的长和宽,然后通过上述代码得到其二维DCT变换矩阵,然后通过该矩阵对信号的列化向量进行正反变换处理,二维变换系数矩阵可以通过reshape对一维的列化的系数进行处理得到。

为什么反变换是其转置

基于公式的理论分析

参考之前的博文离散傅立叶变换DFT和离散余弦变换DCT中一维和二维DCT的定义可以知道:

  1. 在一维DCT正变换中,我们构造的矩阵的每一行的u都是一个定值,但是在反变换中,对参数u进行累加因此是个变量,所以将其转置即是其反变换;

  2. 在二维 DCT正变换中,我们构造的矩阵的每Nv都是一个定值,然而C(u,v)列化之后每N个元素的v都是一个定值,因此根据矩阵相乘的关系可以知道其转置即是其反变换;

基于代码的验证

通过上述代码分别产生一维的矩阵P和二维的矩阵Q,然后在MATLAB中分别计算P'*PQ'*Q然后观察其结果是否为单位矩阵。为单位矩阵则说明反变换是其转置。

总结

OMP算法和BCS-SPL算法中分别使用了一维和二维的DCT变换矩阵,通过使用我们的矩阵进行替换然后仿真,其结果完全一致,这正好说明不同的DCT变换矩阵的功能是完全一样的,所以以后就可以使用我们自己构造的DCT变换矩阵。

  • 0
    点赞
  • 0
    评论
  • 11
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值