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

📄 fft.cpp

📁 数字信号处理中卷积运算中的重叠保留法,可以很好地进行信号的卷积运算
💻 CPP
字号:
#include<iostream.h>
#include<math.h>
#include"fft.h"
#define P  3.1416

Sigproc::Sigproc(float *signal1 = NULL,float *signal2 = NULL,int N = 0)
{
	signalX = new float[N];
	signalX = signal1;
	signalY = new float[N];
	signalY = signal2;
	signalN = N;
}
Sigproc::~Sigproc()
{
	delete []signalX;
	delete []signalY;
}
// bit reverse:
void Sigproc::bitrev()
{
    int i,j,s,M;
	float a;
    
	M = signalN/2;
	i = 0;
	for(j = 1;j < signalN;j++)
	{
		s = M;
		while(i >= s)
		{
			i = i-s;
			s /= 2;
		}
		i = i + s;
		if(j < i)
		{
			a = signalX[j];
			signalX[j] = signalX[i];
			signalX[i] = a;
		}
	}
   // return 0;
}

// fft:
void Sigproc::fft(int l = 0)
{
	int i,j,r,m1,m2,m3,m4,N,k1,k2;
	float u,v;
    N = int(pow(2,l));
	for(i = 1;i < l+1;i++)
	{
		m1 = int(pow(2,i-1));
		m2 = 2*m1;
        m3 = N/m2;
		for(j = 0;j< m3;j++)
		{
			m4 = j*m2;
			for(r = 0;r < m1;r++)
			{
				k1 = m4 + r;
				k2 = k1 + m1;
				u = float(signalX[k2] * cos(2*P*r/m2) + signalY[k2] * sin(2*P*r/m2));
				v = float(signalY[k2] * cos(2*P*r/m2) - signalX[k2] * sin(2*P*r/m2));
				signalX[k2] = signalX[k1] - u;
				signalY[k2] = signalY[k1] - v;
				signalX[k1] = signalX[k1] + u;
				signalY[k1] = signalY[k1] + v;
			}
		}
	}

	
}
// am:
void Sigproc::signalM()
{
	am = new float[signalN];
	for(int i = 0;i < signalN;i++)
	{
		am[i] = float(sqrt(signalX[i] * signalX[i] + signalY[i] * signalY[i]));
	}

}
/*void Sigproc::show()
{
	int k = 0;
	for(int i = 0;i < signalN;i++)
	{
		cout<<"("<<signalX[i]<<","<<signalY[i]<<")";
		k++;
		if(k % 4 == 0)
		cout<<endl;
	}
    cout<<"it is over!"<<endl;
	k = 0;
	for(i = 0;i < signalN;i++)
	{
		cout<<am[i]<<",";
		k++;
        if(k % 6 == 0)
		cout<<endl;
	}
	cout<<"the am is over!"<<endl;
}*/
complex::complex(double r,double i)
{
	real=r;
	imag=i;
}
complex operator*(complex a,complex b)
{
	complex temp;
	temp.real=a.real*b.real-a.imag*b.imag;
	temp.imag=a.real*b.imag+a.imag*b.real;
	return temp;
}
/*int main()
{
	int s;
	cout<<"input the serial:";
	cin>>s;
	int N = int(pow(2,s));
	float *x = new float[N];
	float *y = new float[N];
	for(int i = 0;i < N;i++)
	{
		x[i] = float(cos(P*i*i/N));
        y[i] = float(sin(P*i*i/N));
	}
	Sigproc sig(x,y,N);
	sig.bitrev();
	sig.fft(s);
	sig.signalM();
	sig.show();
	delete []x;
	delete []y;
	return 0;
}*/

⌨️ 快捷键说明

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