DCT蝶形运算java实现
来源:互联网 发布:淘宝怎么修改密码 编辑:程序博客网 时间:2024/05/21 14:44
DCT运算实现,其原理是离散余弦算法。将信号转到频域中。
以下代码经验证是正确的
代码如下,包括对一维数据和二维数据:
<pre name="code" class="java">/** * author:vivian * 时间:2015.5.28 * 版本:第一版 * 功能:8点快速傅里叶运算,用的是蝶形运算方法 * * 各方法的功能 * 1)IntDCT1D针对的是一维的数据,进行8点蝶形运算 * 2)I_IntDCT1D一维数据的8点蝶形逆运算 * 3)IntDCT2D针对的是二维的数据,进行8点蝶形运算 * 4)I_IntDCT1D二维数据的8点蝶形逆运算*/
public class DCT2D{public void IntDCT1D(int data[]){//// input x0 x1 ... x7//// output X0 X2 X4 X6 X1 X3 X5 X7//// int datatmp[] = new int [8];datatmp[0] = data[0] + data[7];datatmp[1] = data[1] + data[6];datatmp[2] = data[2] + data[5];datatmp[3] = data[3] + data[4];datatmp[4] = data[3] - data[4];datatmp[5] = data[2] - data[5];datatmp[6] = data[1] - data[6];datatmp[7] = data[0] - data[7];//蝶形运算结束data[0] = datatmp[0] + datatmp[3];data[1] = datatmp[1] + datatmp[2];data[2] = datatmp[1] - datatmp[2];data[3] = datatmp[0] - datatmp[3];data[0] += data[1]; //// data[0] = X0data[1] = - data[1] + ((data[0])>>1); /// data[1] = X4data[3] = data[3] - (data[2] >>1) - (data[2] >>3); data[2] += data[3];data[3] = data[3] - (data[2] >>1) - (data[2] >>3); // data[2] = X2 data[3] = X6datatmp[5] = datatmp[5] - (datatmp[6] >>1) + (datatmp[6] >>4);datatmp[6] = datatmp[6] + (datatmp[5] >>1) + (datatmp[5] >>2);datatmp[5] = - datatmp[5] + (datatmp[6] >>1) - (datatmp[6] >>4);data[4] = datatmp[4] + datatmp[5];data[5] = datatmp[4] - datatmp[5];data[6] = -datatmp[6] + datatmp[7];data[7] = datatmp[6] + datatmp[7];data[7] = data[7] - (data[4] >>1) -(data[4] >>2) -(data[4] >>4);data[4] = data[4] + data[7];data[7] = data[7] - (data[4] >>1) -(data[4] >>2) -(data[4] >>4);// data[4] = X1 data[7] = X7data[6] = data[6] - (data[5] >>2);data[5] = data[5] + (data[6] >>1);data[6] = data[6] - (data[5] >>2);// data[5] = X3 data[7] = X5/* datatmp[0] = data[0]; datatmp[1] = data[2];datatmp[2] = data[1]; datatmp[3] = data[3];datatmp[4] = data[4]; datatmp[5] = data[6];datatmp[6] = data[5]; datatmp[7] = data[7];*/datatmp[0] = data[0]; datatmp[1] = data[4];datatmp[2] = data[2]; datatmp[3] = data[6];datatmp[4] = data[1]; datatmp[5] = data[5];datatmp[6] = data[3]; datatmp[7] = data[7];int i;for (i=0; i<8; i++) data[i] = datatmp[i];}void I_IntDCT1D(int data[]){////////// input X0, X2, X4, X6, X1, X3, X5, X7 //// output x0, x1,x2, ..., x7int datatmp[] = new int [8];int i;for (i=0; i<8; i++) datatmp[i] = data[i];data[0] = datatmp[0]; data[1] = datatmp[2];data[2] = datatmp[4]; data[3] = datatmp[6] ;data[4] = datatmp[1]; data[5] = datatmp[3];data[6] = datatmp[5]; data[7] = datatmp[7];datatmp[1] = - data[2] + (data[0]>>1);datatmp[0] = data[0] - datatmp[1];datatmp[3] = data[3] + (data[1] >>1) +(data[1] >>3);datatmp[2] = data[1] - datatmp[3];datatmp[3] = datatmp[3] +(datatmp[2] >>1) +(datatmp[2] >>3);datatmp[6] = data[5] + (data[6] >>2);datatmp[5] = data[6] - (datatmp[6] >>1);datatmp[6] = datatmp[6] + (datatmp[5] >>2);datatmp[7] = data[7] + (data[4] >>1) + (data[4] >>2) + (data[4] >>4);datatmp[4] = data[4] - datatmp[7];datatmp[7] = datatmp[7] + (datatmp[4] >>1) + (datatmp[4] >>2) + (datatmp[4] >>4);// four inverse lifting stepdata[0] = (datatmp[0] + datatmp[3]) >>1;data[3] = (datatmp[0] - datatmp[3]) >>1;data[1] = (datatmp[1] + datatmp[2]) >>1;data[2] = (datatmp[1] - datatmp[2]) >>1;data[4] = (datatmp[4] + datatmp[5]) >>1;data[5] = (datatmp[4] - datatmp[5]) >>1;data[6] = (- datatmp[6] + datatmp[7]) >>1;data[7] = (datatmp[6] + datatmp[7]) >>1;// four inverse butterflydata[5] = - data[5] + (data[6] >>1) - (data[6] >>4);data[6] = data[6] - (data[5] >>1) - (data[5] >>2);data[5] = data[5] + (data[6] >>1) - (data[6] >>4);/////////////////datatmp[0] = (data[0] + data[7]) >>1;datatmp[1] = (data[1] + data[6]) >>1;datatmp[2] = (data[2] + data[5]) >>1;datatmp[3] = (data[3] + data[4]) >>1;datatmp[4] = (data[3] - data[4]) >>1;datatmp[5] = (data[2] - data[5]) >>1;datatmp[6] = (data[1] - data[6]) >>1;datatmp[7] = (data[0] - data[7]) >>1;//int i;for(i=0; i<8; i++) data[i] = datatmp[i];}public void IntDCT2D(int data[][], int height, int width){int nheight, nwidth;int i, j, k, l;int ni, nj; //纪录处理数据的位置int datatmp[] = new int [8];nheight = height >>3;nwidth = width >>3;ni = 0;for (i=0; i<nheight; i++){nj = 0;for (j=0; j<nwidth; j++){//对行做变换for (k=0; k<8; k++){for (l=0; l<8; l++)datatmp[l] = data[ni+k][nj+l];IntDCT1D(datatmp);for (l=0; l<8; l++)data[ni+k][nj+l] = datatmp[l];}////对列做变换for (k=0; k<8; k++){for (l=0; l<8; l++)datatmp[l] = data[ni+l][nj+k];IntDCT1D(datatmp);for (l=0; l<8; l++)data[ni+l][nj+k] = datatmp[l];}nj = nj + 8;}ni = ni + 8;}}publicvoid I_IntDCT2D(int data[][], int height, int width){int nheight, nwidth;int i, j, k, l;int ni, nj; //纪录处理数据的位置int datatmp[] = new int [8];nheight = height >>3;nwidth = width >>3;ni = 0;for (i=0; i<nheight; i++){nj = 0;for (j=0; j<nwidth; j++){////对列做反变换for (k=0; k<8; k++){for (l=0; l<8; l++)datatmp[l] = data[ni+l][nj+k];I_IntDCT1D(datatmp);for (l=0; l<8; l++)data[ni+l][nj+k] = datatmp[l];}//对行做反变换for (k=0; k<8; k++){for (l=0; l<8; l++)datatmp[l] = data[ni+k][nj+l];I_IntDCT1D(datatmp);for (l=0; l<8; l++)data[ni+k][nj+l] = datatmp[l];}nj = nj + 8;}ni = ni + 8;}}}
0 0
- DCT蝶形运算java实现
- DST,蝶形运算
- DST,蝶形运算
- H.264整数DCT公式推导及蝶形算法分析
- H.264整数DCT公式推导及蝶形算法分析
- 关于傅里叶变换的理解、快速傅里叶算法的推导以及蝶形运算的c语言实现
- 蝶形细分的实现笔记
- DCT JAVA
- DCT加密(Java((伪
- DCT变换(JAVA)
- DCT变换及量化的c++实现(基于opencv矩阵运算)
- H.264整数DCT公式推导和蝶形图分析-多视角视频编码(mvc)研究(转载)
- dct
- DCT变换及matlab实现
- matlab实现图像DCT变换
- JPEG标准DCT优化实现
- 二维DCT变换的实现
- 蝶形变换
- 计算机科学中最重要的32个算法
- 【生活】那个为你变美的女孩
- JSON vs ProtoBuf vs XML
- Lucene简单搜索引擎模拟
- IOS开发——获取本地音频文件(属性/信息)
- DCT蝶形运算java实现
- 如何查看dll附加依赖项(转载)
- 代码审查--高效代码审查的十个经验
- OpenMAX/IL: OMX IL 学习笔记【1】- 结构框架
- 9. Palindrome Number
- 二进制方法读写文件 参考自孙鑫视频13集
- Environment variable ORACLE_UNQNAME not defined错误解决
- test basics
- 线程终止 Thread.join()