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 ... x7output  X0 X2 X4 X6 X1 X3 X5 X7int 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;}}public   void 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;}}
}

DCT蝶形运算java实现相关推荐

  1. 【Java】快速傅里叶变换FFT的程序实现(时间抽取的基-2FFT、倒位计算、蝶形运算)

    Java--快速傅里叶变换(FFT)的程序实现 好久没来更新了,阿汪大三了. 这学期阿汪要学习两门课<数字信号处理>和<Java程序设计>,刚好前几天老师告诉我们不久后会有个实 ...

  2. java大整数的加减乘除_关于大整数的加减乘除求余运算 java

    自己用java 实现了大字符串整数的加减乘除和求余运算, 加减法的算法是模拟手工笔算的计算过程, 除法就是从最高位不停的减操作, 乘法的算法 :遍历一个数的各个位数以及他所在位置,另一个数根据这个数的 ...

  3. DCT变换(JAVA)

    对图像划分为8*8的像素块并进行DCT变换 经过上一篇博文(http://blog.csdn.net/qq_29859497/article/details/72860023)将一张图片进行转换颜色空 ...

  4. C语言实现FFT和IFFT,并与MATLAB编写显示的结果相对比,进行验证(蝶形运算)

    本次实验中在Microsoft Visual Studio 2010环境下编写,实现FFT和IFFT,并用MATLAB编写显示的结果,两者相对比,进行验证. #include "stdafx ...

  5. matlab中xtem,快速傅里叶变换_蝶形运算_按频率抽取基2-fft算法_MATLAB代码

    function y=MyFFT_FB(x,n) %MYFFT_TB:My Fast Fourier Transform Frequency Based %按频率抽取基2-fft算法 %input: ...

  6. 关于傅里叶变换的理解、快速傅里叶算法的推导以及蝶形运算的c语言实现

    为了使用C语言实现蝶形运算过程,重新学习了一下傅里叶变换蝶形运算的过程 1.傅里叶变换 傅里叶变换笼统的讲就是将一个信号序列分解为很多组频率不同的正弦和余弦信号的组合:对于理解傅里叶变换我是从线性变换 ...

  7. java编写计算类加减乘除_老师要求张浩使用面向对象的思想编写一个计算器类(Calculator),可以实现两个整数的加减乘除的运算.java...

    导航:网站首页 > 老师要求张浩使用面向对象的思想编写一个计算器类(Calculator),可以实现两个整数的加减乘除的运算.java 时间:2019-4-10 老师要求张浩使用面向对象的思想编 ...

  8. java中补码与位运算,Java:二进制(原码、反码、补码)与位运算

    一.二进制(原码.反码.补码) 二进制的最高位是符号位("0"代表正数,"1"代表负数): Java中没有无符号数: 计算机以整数的补码进行运算: 1.  原码 ...

  9. 已知序列求蝶形运算_数字信号处理习题集

    数字信号处理习题集 一.单项选择题1数字信号的特征是 A.时间离散.幅值连续 B.时间离散.幅值量化C.时间连续.幅值量化 D.时间连续.幅值连续2若一线性移不变系统当输入为 xnn 时,输出为 yn ...

最新文章

  1. mysql 判度数据库存在,问题出在什么地方啊?
  2. 三流面试聊技术,二流面试聊框架,一流面试…
  3. 04 - Object-C协议与代理设计
  4. ArduinoYun教程之OpenWrt-Yun与CLI配置Arduino Yun
  5. cJSON库源码分析
  6. php pcntl 进程池_PHP 进程池与轮询调度算法实现多任务的示例代码
  7. Go 中string和int类型相互转换
  8. Gram matrix 格拉姆矩阵
  9. win10安装misql8_Windows10安装MySQL 8.0.11
  10. 【Python】Python3编码规范
  11. 10.性能测试软技能
  12. vue-loader was used without the corresponding plugin. Make sure to include VueLoad……
  13. 如何编辑SDE数据(转自ESRI中国社区)
  14. HTML标记大全参考手册
  15. 静态HTML网页设计作品 HTML5+CSS大作业——个人网页设计(7页)
  16. 解决AD13不能复制原理图的问题
  17. 解决蓝牙耳机自动暂停播放音乐的问题
  18. 微信小程序 如何返回上一个页面并实现刷新
  19. 利用Proteus仿真STM32实现按键控制LED灯设计
  20. 希斯·莱杰获奥斯卡最佳男配角奖

热门文章

  1. SD 卡卡座封装尺寸以及接线图 (带自弹 )
  2. Kubernetes基础:可以用作示例演示的tornado镜像
  3. ios开发证书CSR文件、CER文件、P12文件,mobileprovition许可文件的用途
  4. windows系统磁盘自带修复工具
  5. 小米游戏本(7代)开箱
  6. 小李的电商日记 22.10.12
  7. Django REST Framework——4. 请求与响应
  8. python TimedRotatingFileHandler 配置参数 (转)
  9. 基于matlab的汽车牌照识别程序详细教程
  10. 欧尼酱讲JVM(14)——堆