离散余弦变换

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Drawing;
  4 using System.Linq;
  5 using System.Text;
  6 using System.Threading.Tasks;
  7
  8 namespace DFT
  9 {
 10     class FFT
 11     {
 12         int row;
 13         int col;
 14         double[,] FM;
 15         double[,] FN;
 16         double[,] X;
 17         double[,] Original;
 18         public FFT(String name)
 19         {
 20             Bitmap bitmap = new Bitmap(name);
 21             this.col = bitmap.Width;
 22             this.row = bitmap.Height;
 23             Original=new double[row,col];
 24             FM=new double[row,row];
 25             FN=new double[col,col];
 26             X=new double[row,col];
 27             for (int i = 0; i < row; i++)
 28             {
 29                 for (int j = 0; j < col; j++)
 30                 {
 31                     Original[i, j] = (bitmap.GetPixel(j,i).R + bitmap.GetPixel(j,i).G + bitmap.GetPixel(j,i).B)/3;
 32                 }
 33             }
 34             initFMN();
 35
 36         }
 37         public double[,] getFFT()
 38         {
 39             X = martiply(martiply(FM, Original), T(FN));
 40             return X;
 41         }
 42
 43         public double[,] getIFFT()
 44         {
 45             return martiply(martiply(T(FM), X), FN);
 46         }
 47         private double[,] T(double[,] a)
 48         {
 49             int awidth = a.GetLength(0);
 50             int aheight = a.GetLength(1);
 51             double[,] reutrnT = new double[aheight, awidth];
 52             for (int i = 0; i < awidth; i++)
 53             {
 54                 for (int j = 0; j < aheight; j++)
 55                 {
 56                     reutrnT[j, i] = a[i, j];
 57                 }
 58             }
 59             return reutrnT;
 60         }
 61         private double[,] martiply(double[,]a,double[,]b)
 62         {
 63             int awidth = a.GetLength(0);
 64             int aheight = a.GetLength(1);
 65             int bheight = b.GetLength(1);
 66             double[,] returnMaxtrix = new double[awidth, bheight];
 67             for (int i = 0; i < awidth; i++)
 68             {
 69                 for (int j = 0; j < bheight; j++)
 70                 {
 71                     for (int k = 0; k < aheight; k++)
 72                     {
 73                         returnMaxtrix[i, j] += a[i, k] * b[k, j];
 74                     }
 75                 }
 76             }
 77             return returnMaxtrix;
 78         }
 79         private void initFMN()
 80         {
 81             double firstm = 1/Math.Sqrt(row);
 82             double firstn = 1 / Math.Sqrt(col);
 83             for (int i = 0; i < row; i++)
 84             {
 85                 for (int j = 0; j < row; j++)
 86                 {
 87                     if (i == 0)
 88                     {
 89                         FM[i, j] = firstm;
 90                     }
 91                     else
 92                     {
 93                         FM[i, j] = Math.Sqrt(2.0 / row) * Math.Cos(i * j * Math.PI / row);
 94                     }
 95                 }
 96             }
 97             for (int i = 0; i < col; i++)
 98             {
 99                 for (int j = 0; j < col; j++)
100                 {
101                     if (i == 0)
102                     {
103                         FN[i, j] = firstn;
104                     }
105                     else
106                     {
107                         FN[i, j] = Math.Sqrt(2.0 / col) * Math.Cos(i * j * Math.PI / col);
108                     }
109                 }
110             }
111         }
112     }
113 }
时间: 2024-10-11 06:10:17

离散余弦变换的相关文章

C++实现离散余弦变换

写在前面 到目前为止已经阅读了相当一部分的网格水印等方面的论文了,但是论文的实现进度还没有更上,这个月准备挑选一些较为经典的论文,将其中的算法实现.在实现论文的过程中,发现论文中有用到一些空域转频率域的算法.因此也就想到了实现一下离散余弦变换.虽然本文的代码和网上很多已有的代码很类似,思路都没有太多的差别,但是本文有一个比较重要的改进.具体的说,网上现有DCT算法输入的是一个固定的二维数组.当二维数组作为函数参数进行传递时,至少需要给出第二个维度的大小,否则编译器会报错.但是在图形图像处理中,当

AVS-P2中的8x8二维整数余弦变换(Integer Cosine Transform, ICT)

为何采用ICT? 基于块的DCT能很大程度上去除图像元素在变换域中的相关性,在图像和视频编码领域得到广泛的应用.但由于DCT存在计算量大以及存在反变换失配,因此AVS Part 2采用的是ICT,其性能接近8x8 DCT,但精确定义到每一位的运算避免了不同反变换之间的失配.ICT具有复杂度低.完全匹配等优点.ICT可用加法和移位直接实现. 何为ICT? 整数余弦变换(Integer Cosine Transform, ICT)源自离散余弦变换,是定点余弦变换的扩展.设一个二维数据块X大小为nxm

理解离散傅立叶变换(一. 傅立叶变换的由来)

理解离散傅立叶变换(一) ------傅立叶变换的由来 关于傅立叶变换,不管是书本还是在网上可以非常easy找到关于傅立叶变换的描写叙述,可是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生畏的公式的罗列,让人非常难可以从感性上得到理解,近期,我偶尔从网上看到一个关于数字信号处理的电子书籍,是一个叫Steven W. Smith, Ph.D.外国人写的,写得非常浅显,里面有七章由浅入深地专门讲述关于离散信号的傅立叶变换,尽管是英文文档,我还是硬着头皮看完了有关傅立叶变换的有关内容,看了

理解离散傅立叶变换(一. 傅立叶的起源变换)

理解离散傅立叶变换(一) ------傅立叶变换的由来 关于傅立叶变换,不管是书本还是在网上可以非常easy找到关于傅立叶变换的描写叙述,可是大都是些故弄玄虚的文章,太过抽象.尽是一些让人看了就望而生畏的公式的罗列,让人非常难可以从感性上得到理解.近期.我偶尔从网上看到一个关于数字信号处理的电子书籍,是一个叫Steven W. Smith, Ph.D.外国人写的,写得非常浅显,里面有七章由浅入深地专门讲述关于离散信号的傅立叶变换.尽管是英文文档.我还是硬着头皮看完了有关傅立叶变换的有关内容,看了

算法系列之二十四:离散傅立叶变换之音频播放与均衡器

导语 在算法系列的第二十二篇,我们介绍了离散傅立叶变换算法的实现,将时域的音频信号转换到频域进行分析,获取拨号音频的频率特征.这一篇我们将介绍一种频域均衡器的实现方法,所谓的频域均衡器,就是在频域信号的基础上对音频数据进行调整,然后再将频域信号转换成时域信号在回放设备上播放,从而达到音色调节的目的.将频域信号转换成时域信号的算法,就是离散傅立叶逆变换算法. 1 离散傅立叶逆变换 有从时域转换到频域的方法,就必然有从频域转换到时域的方法,相对于离散傅里叶变换,这个反向转换就是离散傅里叶逆变换(ID

离散傅立叶变换,快速傅立叶变换和傅里叶级数

目的:要学习通讯或者从事通讯行业都免不了要接触傅立叶变换,傅立叶变换有很多形式包括积分形式和离散形式的,公式也是各种积分或者累加,我在学习的初始是直接背下来这些公式,并没有想过每个公式里变量和积分以及累加的含义.因此现在有了写一篇关于傅立叶变换的博客的想法.本篇主要以最简单的cos(t)为例,以Matlab为媒介,比较Discrete Fourier Transform(DFT)和Fast Fourier Transform (FFT).这是因为DFT是我在学习信号处理时老师直接给的公式,而FF

算法系列之二十三:离散傅立叶变换之音频播放与频谱显示

算法系列之二十三:离散傅立叶变换之音频播放与频谱显示 算法系列之二十三离散傅立叶变换之音频播放与频谱显示 导语 什么是频谱 1 频谱的原理 2 频谱的选择 3 频谱的计算 显示动态频谱 1 实现方法 2 杂项说明 结果展示 导语 频谱和均衡器,几乎是媒体播放程序的必备物件,没有这两个功能的媒体播放程序会被认为不够专业,现在主流的播放器都具备这两个功能,foobar 2000的十八段均衡器就曾经让很多人着迷.在上一篇对离散傅立叶变换介绍的基础上,本篇就进一步介绍一下频谱是怎么回事儿,下一篇继续介绍

python 图像的离散傅立叶变换

图像(MxN)的二维离散傅立叶变换可以将图像由空间域变换到频域中去,空间域中用x,y来表示空间坐标,频域由u,v来表示频率,二维离散傅立叶变换的公式如下: 在python中,numpy库的fft模块有实现好了的二维离散傅立叶变换函数,函数是fft2,输入一张灰度图,输出经过二维离散傅立叶变换后的结果,但是具体实现并不是直接用上述公式,而是用快速傅立叶变换.结果需要通过使用abs求绝对值才可以进行可视化,但是视觉效果并不理想,因为傅立叶频谱范围很大,所以要用log对数变换来改善视觉效果. 另外,图

图像的余弦变换

1 问题的提出 2 一维离散余弦变换 3 二维离散余弦变换 4 余弦变换的性质 5 余弦变换的应用 原文地址:https://www.cnblogs.com/Terrypython/p/10960879.html