📄 freqpro.cpp
字号:
double old_nargin=nargin_val; nargin_val=2.0; nargin_set=1;
dMm(ncols);
dMm(ret1a);
ret1a=dct2(arg1, mrows, ncols);
nargin_val=old_nargin;
return ret1a;
end_scope
}
////////////////////////////////////////////////////////////////////////
//Mm bIs2Power()
//----------------------------------------------------------------------
//基本功能:本函数为判断一个数是否为2的整次幂。
//----------------------------------------------------------------------
//参数说明:int nNum 输入的整数
//----------------------------------------------------------------------
//返 回:BOOL
// 是返回真,否返回假。
//----------------------------------------------------------------------
//注 意:此函数声明为保护型,只能在CFreqPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CFreqPro::bIs2Power(int nNum)
{
LONG a;
a = 1;
while(a * 2 <= nNum)
{
a *= 2;
}
if(a == nNum) return TRUE;
else
return FALSE;
}
////////////////////////////////////////////////////////////////////////
//Mm idct()
//----------------------------------------------------------------------
//基本功能:本函数完成一个向量X的一维离散余弦变换。
//----------------------------------------------------------------------
//参数说明:Mm b 待变换向量(若为矩阵,按列进行运算)
// Mm n 变换长度,若指定该参数,则自动将向量a补0或自动裁剪到
// 指定长度。
//----------------------------------------------------------------------
//返 回:Mm
// 变换结果矩阵。
//----------------------------------------------------------------------
//注 意:此函数声明为保护型,只能在CFreqPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
Mm CFreqPro::idct(Mm b, Mm n)
{
//定义相关矩阵变量
b.setname("b"); n.setname("n");
dMm(a); dMm(do_trans); dMm(m); dMm(bb); dMm(ww); dMm(W); dMm(yy); dMm(y);
//判断输入参数是否正确
double old_nargin=nargin_val;
if (!nargin_set) nargin_val=2.0;
nargin_set=0;
double old_nargout=nargout_val;
if (!nargout_set) nargout_val=1.0;
nargout_set=0;
if (istrue(nargin()==0.0))
{
error(TM("输入参数为空,无法完成操作!."));
}
if (istrue(isempty(b)))
{
error(TM("输入矩阵为空,无法完成操作!"));
a = nop_M;
nargin_val=old_nargin; nargout_val=old_nargout;
b.setname(NULL); n.setname(NULL);
return a;
}
//如果输入为一行向量,将其转换为列向量。
do_trans = (size(b,1.0)==1.0);
if (istrue(do_trans))
{
//是行向量,转换为列向量。
//相当于Matlab的b=b(:)。
b = b(c_p);
}
//只有一个输入参数,未指定变换点数n。
if (istrue(nargin()==1.0))
{
//得到第一维长度(矩阵列长度)
n = size(b,1.0);
}
//得到第二维长度(矩阵行长度)
m = size(b,2.0);
//根据需要为矩阵补零或截去多余元素
if (istrue(size(b,1.0)<n))
{
//矩阵列长度小于指定的变换点数
//生成n×m的零矩阵
bb = zeros(n,m);
//从输入矩阵b中取得所需元素
//相当于Matlab的bb(1:size(b,1),:) = b。
bb(colon(1.0,1.0,size(b,1.0)),c_p) = b;
}
else
{
//矩阵列长度大于或等于指定的变换点数
//从输入矩阵b中取得所需元素
//相当于Matlab的b = b(1:n,:)。
bb = b(colon(1.0,1.0,n),c_p);
}
//计算用于IDFT计算的系数
ww = msqrt(2.0*n)*transpose(exp(j*(colon(0.0,1.0,n-1.0))*pi/(2.0*n)));
//进行变换
if (istrue(rem(n,2.0)==1.0)||istrue(!isreal(b)))
{
//n为偶数
//生成中间变换矩阵
ww(1.0) = ww(1.0)*msqrt(2.0);
W = ww(c_p,ones(1.0,m));
//生成2.0*n×m的零矩阵
yy = zeros(2.0*n,m);
//相当于Matlab的yy(1:n,:) = W.*bb
yy(colon(1.0,1.0,n),c_p) = times(W,bb);
//相当于Matlab的yy(n+2:2*n,:) 。
yy(colon(n+2.0,1.0,2.0*n),c_p) = -times(j*W(colon(2.0,1.0,n),c_p),flipud(bb(colon(2.0,1.0,n),c_p)));
//调用Matrix<Lib>C++库函数IFFT()进行快速离散傅立叶逆变换,
y = ifft(yy);
//保留需要的变换结果数据
//相当于Matlab的a = y(1:n,:)。
a = y(colon(1.0,1.0,n),c_p);
}
else
{
//n为奇数
//计算校正系数
ww(1.0) = ww(1.0)/msqrt(2.0);
W = ww(c_p,ones(1.0,m));
yy = times(W,bb);
//调用Matrix<Lib>C++库函数IFFT()进行快速离散傅立叶逆变换,
y = ifft(yy);
//对矩阵的各列元素重新进行排序
//生成n×m的零矩阵
a = zeros(n,m);
//相当于Matlab的a(1:2:n,:) = y(1:n/2,:)
a(colon(1.0,2.0,n),c_p) = y(colon(1.0,1.0,n/2.0),c_p);
//相当于Matlab的a(2:2:n,:) = y(n:-1:n/2+1,:)
a(colon(2.0,2.0,n),c_p) = y(colon(n,-1.0,n/2.0+1.0),c_p);
}
//如果输入矩阵是实数矩阵,输出取变换结果的实部。
if (istrue(isreal(b)))
{
a = real(a);
}
//如果输入的是行向量,对结果进行转置操作。
if (istrue(do_trans))
{
a = transpose(a);
}
nargin_val=old_nargin; nargout_val=old_nargout;
b.setname(NULL); n.setname(NULL);
return a;
}
////////////////////////////////////////////////////////////////////////
//Mm idct()
//----------------------------------------------------------------------
//基本功能:本函数为离散余弦变换的无参重载版本。
//----------------------------------------------------------------------
//参数说明:无
//----------------------------------------------------------------------
//返 回:Mm
// 变换结果矩阵。
//----------------------------------------------------------------------
//注 意:此函数声明为保护型,只能在CFreqPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
Mm CFreqPro::idct()
{
begin_scope
double old_nargin=nargin_val; nargin_val=0.0; nargin_set=1;
dMm(b); dMm(n);
dMm(ret1a);
ret1a=idct(b, n);
nargin_val=old_nargin;
return ret1a;
end_scope
}
////////////////////////////////////////////////////////////////////////
//Mm idct()
//----------------------------------------------------------------------
//基本功能:本函数为离散余弦变换的无指定变换长度重载版本。
//----------------------------------------------------------------------
//参数说明:Mm b 待变换向量(若为矩阵,按列进行运算)
//----------------------------------------------------------------------
//返 回:Mm
// 变换结果矩阵。
//----------------------------------------------------------------------
//注 意:此函数声明为保护型,只能在CFreqPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
Mm CFreqPro::idct(Mm b)
{
begin_scope
double old_nargin=nargin_val; nargin_val=1.0; nargin_set=1;
dMm(n);
dMm(ret1a);
ret1a=idct(b, n);
nargin_val=old_nargin;
return ret1a;
end_scope
}
////////////////////////////////////////////////////////////////////////
//Mm idct2()
//----------------------------------------------------------------------
//基本功能:本函数完成矩阵的一维离散余弦逆变换。
//----------------------------------------------------------------------
//参数说明:Mm arg1 待变换矩阵
// Mm mrows 行变换长度,若指定该参数,则自动将向量a补0或自动
// 裁剪到指定长度。
// Mm ncols 列变换长度,若指定该参数,则自动将向量a补0或自动
// 裁剪到指定长度。
//----------------------------------------------------------------------
//返 回:Mm
// 变换结果矩阵。
//----------------------------------------------------------------------
//注 意:此函数声明为保护型,只能在CFreqPro类中使用。该函数是先对矩阵
// 按列进行一维离散余弦逆变换,再对其按列进行一维离散余弦逆变换,
// 最终得到其二维离散余弦逆变换结果。对程序在此不加详细注释,请
// 参考一维离散余弦逆变换程序注释。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
Mm CFreqPro::idct2(Mm arg1, Mm mrows, Mm ncols)
{
arg1.setname("arg1"); mrows.setname("mrows"); ncols.setname("ncols");
dMm(a); dMm(m); dMm(n); dMm(b); dMm(mpad); dMm(npad);
double old_nargin=nargin_val;
if (!nargin_set) nargin_val=3.0;
nargin_set=0;
double old_nargout=nargout_val;
if (!nargout_set) nargout_val=1.0;
nargout_set=0;
size(arg1,i_o,m,n);
if (istrue(nargin()==1.0))
{
if (istrue((m>1.0))&&istrue((n>1.0)))
{
a = transpose(idct(transpose(idct(arg1))));
nargin_val=old_nargin; nargout_val=old_nargout;
arg1.setname(NULL); mrows.setname(NULL); ncols.setname(NULL);
return a;
}
else
{
mrows = m;
ncols = n;
}
}
b = arg1;
if (istrue(nargin()==2.0))
{
ncols = mrows(2.0);
mrows = mrows(1.0);
}
mpad = mrows;
npad = ncols;
if (istrue(m==1.0)&&istrue(mpad>m))
{
b(2.0,1.0) = 0.0;
m = 2.0;
}
if (istrue(n==1.0)&&istrue(npad>n))
{
b(1.0,2.0) = 0.0;
n = 2.0;
}
if (istrue(m==1.0))
{
mpad = npad;
npad = 1.0;
}
a = idct(b,mpad);
if (istrue(m>1.0)&&istrue(n>1.0))
{
a = transpose(idct(transpose(a),npad));
}
nargin_val=old_nargin; nargout_val=old_nargout;
arg1.setname(NULL); mrows.setname(NULL); ncols.setname(NULL);
return a;
}
////////////////////////////////////////////////////////////////////////
//Mm idct2()
//----------------------------------------------------------------------
//基本功能:本函数为二维离散余弦逆变换的无指定变换长度重载版本。
//----------------------------------------------------------------------
//参数说明:Mm arg1 待变换矩阵
//----------------------------------------------------------------------
//返 回:Mm
// 变换结果矩阵。
//----------------------------------------------------------------------
//注 意:此函数声明为保护型,只能在CFreqPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
Mm CFreqPro::idct2(Mm arg1)
{
begin_scope
double old_nargin=nargin_val; nargin_val=1.0; nargin_set=1;
dMm(mrows); dMm(ncols);
dMm(ret1a);
ret1a=idct2(arg1, mrows, ncols);
nargin_val=old_nargin;
return ret1a;
end_scope
}
////////////////////////////////////////////////////////////////////////
//Mm idct2()
//----------------------------------------------------------------------
//基本功能:本函数为二维离散余弦逆变换的无指定列变换长度重载版本。
//----------------------------------------------------------------------
//参数说明:Mm arg1 待变换矩阵
// Mm mrows 行变换长度,若指定该参数,则自动将向量a补0或自动
// 裁剪到指定长度。
//----------------------------------------------------------------------
//返 回:Mm
// 变换结果矩阵。
//----------------------------------------------------------------------
//注 意:此函数声明为保护型,只能在CFreqPro类中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
Mm CFreqPro::idct2(Mm arg1, Mm mrows)
{
begin_scope
double old_nargin=nargin_val; nargin_val=2.0; nargin_set=1;
dMm(ncols);
dMm(ret1a);
ret1a=idct2(arg1, mrows, ncols);
nargin_val=old_nargin;
return ret1a;
end_scope
}
////////////////////////////////////////////////////////////////////////
//BOOL NDCT2()
//----------------------------------------------------------------------
//基本功能:本函数完成图像的快速余弦逆变换。
//----------------------------------------------------------------------
//参数说明:Mm matTransed 被变换的矩阵
//----------------------------------------------------------------------
//返 回:BOOL
// 成功时返回TRUE,失败时返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CFreqPro::NDCT2(Mm matTransed)
{
//若未指定 CDibObject 对象指针返回FALSE
if( m_pDibObject == NULL ) return( FALSE );
//调用函数idct2()完成二维离散余弦变换
m_matBits = idct2(matTransed);
//将矩阵数据赋给图像数据区
SetBits();
return(TRUE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -