学习DIP第6天
网上关于FFT的实例有很多,具体也可以参照上一篇,其实Matlab,OpenCV都可以很轻松的实现相关操作,但是对于学习其原理,还是自己操作下比较好。
二维FFT的是实现方法是先对行做FFT将结果放回该行,然后再对列做FFT结果放在该列,计算完所有的列以后,结果就是响应的二维FFT。
本次所有操作都是对基2的数据进行的操作。
二维IFFT网上很少见到,操作过程是:上述的傅里叶变换结果,先对每列做一维IFFT,结果放在该列,取复数矩阵其共轭,然后再按照每行做一维IFFT,其结果放在该行,即为最终结果。上代码:
1D.c:
//
// 1D.c
// Fourer
//
// Created by 谭升 on 14/11/25.
// Copyright (c) 2014年 谭升. All rights reserved.
//
#include "Fourer.h"
int isBase2(int size_n){
int k=size_n;
int z=0;
while (k/=2) {
z++;
}
k=z;
if(size_n!=(1<
return -1;
else
return k;
}
//复数基本运算
///
void Add_Complex(Complex * src1,Complex *src2,Complex *dst){
dst->imagin=src1->imagin+src2->imagin;
dst->real=src1->real+src2->real;
}
void Sub_Complex(Complex * src1,Complex *src2,Complex *dst){
dst->imagin=src1->imagin-src2->imagin;
dst->real=src1->real-src2->real;
}
void Multy_Complex(Complex * src1,Complex *src2,Complex *dst){
double r1=0.0,r2=0.0;
double i1=0.0,i2=0.0;
r1=src1->real;
r2=src2->real;
i1=src1->imagin;
i2=src2->imagin;
dst->imagin=r1*i2+r2*i1;
dst->real=r1*r2-i1*i2;
}
void Copy_Complex(Complex * src,Complex *dst){
dst->real=src->real;
dst->imagin=src->imagin;
}
void Show_Complex(Complex * src,int size_n){
if(size_n==1){
if(src->imagin>=0.0)
printf("%lf+%lfj ",src->real,src->imagin);
else
printf("%lf%lfj ",src->real,src->imagin);
}
else if(size_n>1){
for(int i=0;i
if(src[i].imagin>=0.0){
printf("%lf+%lfj ",src[i].real,src[i].imagin);
}
else
printf("%lf%lfj ",src[i].real,src[i].imagin);
}
}
//计算WN
///
void getWN(double n,double si