⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testfft.cpp

📁 数字图像处理讲义加代码 教程
💻 CPP
字号:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "temp.h"

COMPLEX *omega,*p,*f,*temp;

void add(COMPLEX *a,COMPLEX *b,COMPLEX *ret)
{
	ret->re = a->re + b->re;
	ret->im = a->im + b->im;
}

void sub(COMPLEX *a,COMPLEX *b,COMPLEX *ret)
{
	ret->re = a->re - b->re;
	ret->im = a->im - b->im;
}

void mul(COMPLEX *m,COMPLEX *n,COMPLEX *ret)
{
	float a,b,c;

	a = ( m->re - m->im ) * n->im;
	b = m->re * ( n->re - n->im );
	c = m->im * ( n->re + n->im );
	ret->re = a + b;
	ret->im = a + c;
}

int reverse(int t,int k)
{
	int i,j,m,s;

	m = t;
	s = 0;
	for ( i = 0 ; i < k ; i++ )
	{
		j = m / 2;
		s = s * 2 + ( m - j * 2 );
		m = j;
	}

	return s;
}

void root(int n)
{
	int j;

	omega->re = 1;
	omega->im = 0;
	omega[1].re = (float)cos(2 * PI / n);
	omega[1].im = -(float)sin(2 * PI / n);

	for ( j = 2 ; j < n/2 ; j++ )
		mul(&omega[1],&omega[j-1],&omega[j]);

	for ( j = n/2 ; j < n ; j++ )
	{
		omega[j].re = -omega[j-n/2].re;
		omega[j].im = -omega[j-n/2].im;
	}
}

void fft(int n)
{
	int s,k,m,l,nv,t,j;
	COMPLEX podd,ret;

	k = (int)(log(n) / log(2) + 0.5);
	nv = n;
	m = 1;
	for ( l = k-1 ; l >= 0 ; l-- )
	{
		for ( t = 0 ; t < m * nv ; t+=nv )
			for ( j = 0 ; j < nv/2 ; j++ )
			{
				s = (t+j) / (int)pow(2,l);
				s = reverse(s,k);

				ret = omega[s];
				mul(&ret,&p[t+j+nv/2],&podd);
				sub(&p[t+j],&podd,&p[t+j+nv/2]);
				add(&p[t+j],&podd,&p[t+j]);
			}
		m *= 2;
		nv /= 2;
	}

	for ( t = 0 ; t < n ; t++ )
	{
		s = reverse(t,k);
		f[t] = p[s];
	}
}

void nfft(int n)
{
	int i;

	for ( i = 0 ; i < n ; i++ )
		p[i] = f[i];

	fft(n);

	p[0] = f[0];
	for ( i = 1 ; i < n ; i++ )
		p[i] = f[n-i];
	for ( i = 0 ; i < n ; i++ )
	{
		p[i].re /= n;
		p[i].im /= n;
	}
}

int main()
{
	omega = new COMPLEX[8];
	p = new COMPLEX[8];
	f = new COMPLEX[8];
	temp = new COMPLEX[8];

	root(8);

	p[0].re = 1;
	p[1].re = 1;
	p[2].re = 2;
	p[3].re = 3;
	p[4].re = 0;
	p[5].re = 0;
	p[6].re = 0;
	p[7].re = 0;
	for ( int i = 0 ; i < 8 ; i++ )
		p[i].im = 0;

	fft(8);
	for ( i = 0 ; i < 8 ; i++ )
	{
		printf("%f  ,  %f\n",f[i].re,f[i].im);
		temp[i].re = f[i].re;
		temp[i].im = f[i].im;
	}
	printf("\n");

	p[0].re = 2;
	p[1].re = 3;
	p[2].re = 2;
	p[3].re = 4;
	p[4].re = 0;
	p[5].re = 0;
	p[6].re = 0;
	p[7].re = 0;
	for ( i = 0 ; i < 8 ; i++ )
		p[i].im = 0;

	fft(8);
	for ( i = 0 ; i < 8 ; i++ )
	{
		printf("%f  ,  %f\n",f[i].re,f[i].im);
		mul(&f[i],&temp[i],&f[i]);
	}
	printf("\n");

	for ( i = 0 ; i < 8 ; i++ )
	{
		printf("%f  ,  %f\n",f[i].re,f[i].im);
	}
	printf("\n");

	nfft(8);
	for ( i = 0 ; i < 8 ; i++ )
	{
		printf("%f  ,  %f\n",p[i].re,p[i].im);
	}
	printf("\n");

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -