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

📄 fft.cpp

📁 数字图像处理讲义加代码 教程
💻 CPP
字号:
#include "dip.h"

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

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

void TDipWindow::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 TDipWindow::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 TDipWindow::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 TDipWindow::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 TDipWindow::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;
	}
}

void TDipWindow::tfft(int m,int n)
{
	int i,j;

	root(n);
	p = (COMPLEX *) new COMPLEX[n];
	f = (COMPLEX *) new COMPLEX[n];

	for ( i = 0 ; i < m ; i++ )
	{
		for ( j = 0 ; j < n ; j++ )
			p[j] = SpaceField[i][j];

		fft(n);

		for ( j = 0 ; j < n ; j++ )
			FreqField[i][j] = f[j];
	}

	delete p;
	delete f;

	for ( i = 0 ; i < m ; i++ )
		for ( j = 0 ; j < n ; j++ )
			SpaceField[i][j] = FreqField[i][j];

	root(m);
	p = (COMPLEX *) new COMPLEX[m];
	f = (COMPLEX *) new COMPLEX[m];

	for ( j = 0 ; j < n ; j++ )
	{
		for ( i = 0 ; i < m ; i++ )
			p[i] = SpaceField[i][j];

		fft(m);

		for ( i = 0 ; i < m ; i++ )
			FreqField[i][j] = f[i];
	}

	delete p;
	delete f;
}

void TDipWindow::ntfft(int m,int n)
{
	int i,j;

	root(n);
	p = (COMPLEX *) new COMPLEX[n];
	f = (COMPLEX *) new COMPLEX[n];

	for ( i = 0 ; i < m ; i++ )
	{
		for ( j = 0 ; j < n ; j++ )
			f[j] = FreqField[i][j];

		nfft(n);

		for ( j = 0 ; j < n ; j++ )
			SpaceField[i][j] = p[j];
	}

	delete p;
	delete f;

	for ( i = 0 ; i < m ; i++ )
		for ( j = 0 ; j < n ; j++ )
			FreqField[i][j] = SpaceField[i][j];

	root(m);
	p = (COMPLEX *) new COMPLEX[m];
	f = (COMPLEX *) new COMPLEX[m];

	for ( j = 0 ; j < n ; j++ )
	{
		for ( i = 0 ; i < m ; i++ )
			f[i] = FreqField[i][j];

		nfft(m);

		for ( i = 0 ; i < m ; i++ )
			SpaceField[i][j] = p[i];
	}

	delete p;
	delete f;
}

⌨️ 快捷键说明

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