得知DIP文章4日

傅立叶变换数学原理将可能完全被引入,下仅仅实现代码。观察下结果,公式在上一篇博客中已经描写叙述

上代码:

//
// main.c
// Fourer2D
//
// Created by 谭升 on 14/11/17.
// Copyright (c) 2014年 谭升. All rights reserved.
// #include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#define VALUE_MAX 255
#define WIDTH 5
#define HEIGHT 5 struct Complex_{
double real;
double imagin;
};
typedef struct Complex_ Complex; int Initdata(double (*src)[WIDTH],int size_w,int size_h){
srand((int)time(0));
for(int i=0;i<size_w;i++){
for(int j=0;j<size_h;j++){
src[i][j]=rand()%VALUE_MAX;
printf("%lf ",src[i][j]);
}
printf(";\n");
}
return 0;
}
int DFT2D(double (*src)[WIDTH],Complex (*dst)[WIDTH],int size_w,int size_h){
for(int u=0;u<size_w;u++){
for(int v=0;v<size_h;v++){
double real=0.0;
double imagin=0.0;
for(int i=0;i<size_w;i++){
for(int j=0;j<size_h;j++){
double I=src[i][j];
double x=M_PI*2*((double)i*u/(double)size_w+(double)j*v/(double)size_h);
real+=cos(x)*I;
imagin+=-sin(x)*I; }
}
dst[u][v].real=real;
dst[u][v].imagin=imagin;
if(imagin>=0)
printf("%lf+%lfj ",real,imagin);
else
printf("%lf%lfj ",real,imagin);
}
printf(";\n");
}
return 0;
}
int IDFT2D(Complex (*src)[WIDTH],Complex (*dst)[WIDTH],int size_w,int size_h){
for(int i=0;i<size_w;i++){
for(int j=0;j<size_h;j++){
double real=0.0;
double imagin=0.0;
for(int u=0;u<size_w;u++){
for(int v=0;v<size_h;v++){
double R=src[u][v].real;
double I=src[u][v].imagin;
double x=M_PI*2*((double)i*u/(double)size_w+(double)j*v/(double)size_h);
real+=R*cos(x)-I*sin(x);
imagin+=I*cos(x)+R*sin(x); }
}
dst[i][j].real=(1./(size_w*size_h))*real;
dst[i][j].imagin=(1./(size_w*size_h))*imagin;
if(imagin>=0)
printf("%lf+%lfj ",dst[i][j].real,dst[i][j].imagin);
else
printf("%lf%lfj ",dst[i][j].real,dst[i][j].imagin);
}
printf(";\n");
}
return 0;
} int main() {
double src[WIDTH][HEIGHT];
Complex dst[WIDTH][HEIGHT];
Complex dst_[WIDTH][HEIGHT];
Initdata(src, WIDTH, HEIGHT);
printf("\n\n");
DFT2D(src,dst,WIDTH,HEIGHT);
printf("\n\n");
IDFT2D(dst,dst_,WIDTH,HEIGHT);
}

因为仅仅是为了观察结果。所以使用了固定大小的二维数组,若实际工作中应该依据须要动态分配内存。例如以下结果:上面为原始数据,中间为DFT后的数据。最以下为IDFT后的结果。

版权声明:本文博主原创文章,博客,未经同意,不得转载。

DDFT的更多相关文章

  1. 空间谱专题02:波束形成(Beamforming)

    作者:桂. 时间:2017-08-22  10:56:45 链接:http://www.cnblogs.com/xingshansi/p/7410846.html 前言 本文主要记录常见的波束形成问题 ...

  2. js插件---->ueditor编辑器的使用

    UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量.可定制.用户体验优秀等特点.今天我们就开始学习一下.大致的效果图如下

  3. day 35初识数据库

    一.数据库概述 1.什么是数据库?先来看看百度怎么说的. 数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增.截取.更新.删除等操作.     所谓“数据库”系 ...

  4. 《Python入门》Windows 7下Python Web开发环境搭建笔记

    最近想尝试一下在IBM Bluemix上使用Python语言创建Web应用程序,所以需要在本地搭建Python Web的开发测试环境. 关于Python的版本 进入Python的网站,鼠标移到导航条上 ...

随机推荐

  1. 五子棋Web版的开发(二)--整合Spring4.3+hibernate4+Struts2.3

    拖了这么久才把ssh框架给整合完毕,期间发现自己对SSH的知识真的是知之甚少.在整合期间遇到了无数的坑,我还是先把项目地址发一下吧 首先我遇到的第一个问题是 CreateQuery is not va ...

  2. 详解H3C交换机“端口安全”功能

    以下内容摘自正在全面热销的最新网络设备图书“豪华四件套”之一——<H3C交换机配置与管理完全手册>(第二版)(其余三本分别是:<Cisco交换机配置与管理完全手册>(第二版). ...

  3. git版本控制的笔记

    一.配置你的身份,提交代码时git就可以知道是谁提交的了 git config --global user.name "Tony" git config --global user ...

  4. [转] IOS中AppDelegate中的生命周期事件的调用条件

    IOS中AppDelegate中的生命周期事件的调用条件 //当应用程序将要进入非活动状态执行,在此期间,应用程序不接受消息或事件,比如来电 - (void)applicationWillResign ...

  5. Access2007中如何运行SQL执行SQl语句

    1. 在“创建”选项卡中,单击“其他”组中的“查询设计”. 2. 单击“显示表”对话框中的“关闭”,而不添加任何表或查询. 3. 在“设计”选项卡中,单击“查询类型”工作组中的“联合”. 4. 单击“ ...

  6. 脑波设备mindwave介绍

    脑波,又称之为脑电波,是人大脑发出的电波,非常的微弱,只能通过设备来检测. 人的脑波在不同状态下,会不同,因此可以通过脑波来量化分析人的精神状态. 科学家讲脑电波分为四种,以下为详细解释(摘自百度百科 ...

  7. Ghost.py 0.1b3 : Python Package Index

    Ghost.py 0.1b3 : Python Package Index Ghost.py 0.1b3 Download Ghost.py-0.1b3.tar.gz Webkit based web ...

  8. 调用AnimateWindow API来实现弹出效果

    下面是实例的cs代码 public partial class frm_Main : Form { //使用Windows Api AnimateWindow [DllImport("use ...

  9. javaweb学习路之四--cxf发布Webservice

    背景:maven构建的springMvc+mybatis框架 源码--->https://github.com/Zering/MyWeb 步骤:(本步骤是自己在实际探索过程中的步骤,我的思路是先 ...

  10. nodejs partials 分布视图

    在学习<node.js开发指南>nodejs partials view时,怎么都不能运行成功.经过艰苦探索,终于成功了,分享一下. Cause: nodejs 的express 版本之间 ...