首页 > 其他分享 >FFT数据简单校正频率,相位,幅度

FFT数据简单校正频率,相位,幅度

时间:2024-01-19 20:44:37浏览次数:24  
标签:校正 pFreqAm 相位 pOut FFT nPow x2 y2 nIndex

BOOL	CWaveBox::DataFftInfo(short *pData,int nCount, FFT_INFO &fft)
{
	Value2D		*pIn, *pOut;
	int			i, nPow, nIndex, nAllCount, nRealCount, nHi, nTotal;
	int			TopIndex[FFT_FI_CountMax*2];
	Value2D		v, v1, v2;
	double		ang1, ang2, ang, dIvt, dBase, dSumAm, dAm, sAmStd, cn, ang_dlt, f_dlt;
	double		*pFreqAm;
	int			x1, x2;
	double		y1, y2, a;
	BOOL		bLeft;

	pIn = (Value2D *)m_FftIn.GetPtr();
	pOut = (Value2D *)m_FftOut.GetPtr();
	pFreqAm = (double *)m_FftAm.GetPtr();

	nPow = (int)(log((double)nCount)/log(2.0));
	nPow = FORCE_RANGE(nPow, 10, 16);
	nAllCount = 1 << nPow;
	nRealCount = min(nCount, nAllCount);

	nHi = 0;
	nTotal = 0;
	memset(pIn, 0, sizeof(Value2D)*nAllCount);
	for(i=0; i<nRealCount; i++)
	{
		if(pData[i] > 0)
			nHi ++;
		pIn[i].Real = pData[i];
		if(pData[i])
			nTotal ++;
	}
	fft.dDutyR = 1.0*nHi / nTotal;
	NFourier::Fft_Double2(pIn, pOut, nPow);

	dIvt = 1.0/m_nFreq;
	dBase = NFourier::CalcuFreqAm(pOut, pFreqAm, nPow, dIvt);
	GetTopValuesBig(pFreqAm, nAllCount/2, TopIndex, FFT_FI_CountMax);

	for(i=0; i<FFT_FI_CountMax; i++)
	{
		nIndex = TopIndex[i];
		fft.Top[i].nIndex = nIndex;
		fft.Top[i].dFreq = dBase * nIndex;

		dAm = pFreqAm[nIndex];
		Level2Std((int)dAm, sAmStd);
		sAmStd = sAmStd * nAllCount / nRealCount;
		fft.Top[i].dAm = sAmStd;

		v1 = pOut[nIndex];
		ang1 = atan2(v1.Imgy, v1.Real);
		ang1 = ang1*360/2/PI;
		if(ang1<0) ang1+=360;
		fft.Top[i].dAng = ang1;
	}

	nIndex = TopIndex[0];
	if(nIndex == 0)
		nIndex = TopIndex[1];

	if(nIndex > 1)
	{
		x1 = nIndex;
		y1 = pFreqAm[x1];
		v1 = pOut[nIndex];

		if(pFreqAm[nIndex+1] >= pFreqAm[nIndex-1])
		{
			bLeft = FALSE;
			x2 = nIndex+1;
			v2 = pOut[x2];
			y2 = pFreqAm[x2];
			a = y2/(y1+y2);
			cn = x1+a;
		}
		else
		{
			bLeft = TRUE;
			x2 = nIndex-1;
			v2 = pOut[x2];
			y2 = pFreqAm[x2];
			a = y2/(y1+y2);
			cn = x1-a;
		}

		fft.dFreq = dBase * cn;
		f_dlt = dBase * a;
		dAm = y1 * a * PI / (sin(a*PI));
		fft.dAm = dAm;

		ang1 = atan2(v1.Imgy, v1.Real);
		ang2 = atan2(v2.Imgy, v2.Real);

		ang_dlt = f_dlt*PI*dIvt*(1<<nPow);
		ang_dlt = PI * a;
		ang_dlt = fabs(ang2-ang1) * a;
		if(bLeft)
			ang = PI/2 -ang1 + ang_dlt;
		else
			ang = PI/2 -ang1 - ang_dlt;

		ang = ang*360/2/PI;
		if(ang<0.0) ang+=360.0;
		fft.dAng = ang;

		NSys::Trace("ang1: %.1f ang2:%.1f ang_dlt:%.1f\n", ang1*180/PI, ang2*180/PI, ang_dlt*180/PI);
	}
	else
	{
		fft.dFreq = dBase * nIndex;
		fft.dAm = pFreqAm[nIndex];

		v1 = pOut[nIndex];
		ang1 = atan2(v1.Imgy, v1.Real);
		ang1 = ang1*360/2/PI;
		if(ang1<0.0) ang1+=360.0;
		fft.dAng = ang1;
	}

	dSumAm = 0.0;
	for(i=0; i<nAllCount/2; i++)
	{
		dSumAm += pFreqAm[i]*pFreqAm[i];
	}
	fft.dMainPst = fft.dAm*fft.dAm/dSumAm;
	NData::DbgArry10K(pFreqAm);

	Level2Std((int)fft.dAm, sAmStd);
	fft.dAm = sAmStd * nAllCount / nRealCount;

	CalcuDutyRatio(pData, nCount, fft);
	return TRUE;
}

标签:校正,pFreqAm,相位,pOut,FFT,nPow,x2,y2,nIndex
From: https://www.cnblogs.com/zzz3265/p/17975540

相关文章

  • 相位调制的BB84协议
    可以通过图1.4中的光学实验装置来理解几率幅的干涉。装置中的分束器(Splitter)为半透半反镜,其特点是对反射光会增加${\frac{\pi}{2} }$相位、对透射光不改变其相位。路径2和路径3完全相等,不会产生相对相位。按照传统意义上对几率的理解,光子从路径1入射,到达第一个分束器(Splitter),......
  • 校正多期土地利用数据栅格范围不一致导致栅格偏差问题
    1所用软件:ArcGISPro3.0.22示例数据:中科院CNLUCC土地利用数据3问题描述:中科院的多年CNLUCC土地利用,有几期的土地利用数据范围不一致,有栅格偏移的问题1990年的范围为:                     2020年的范围为: 两幅影像的边缘......
  • 工程监测中振弦采集仪的精度校正与误差分析
    工程监测中振弦采集仪的精度校正与误差分析工程监测中,振弦采集仪是一种常用的测量设备,用于测量结构物的振动情况。为确保测量结果的准确性,需要对振弦采集仪进行精度校正和误差分析。精度校正是指通过对采集仪进行实验或与已知准确值进行对比,来确定采集仪的测量误差,并对其进行修正。......
  • 工程监测中振弦采集仪的精度校正与误差分析
    工程监测中振弦采集仪的精度校正与误差分析工程监测中,振弦采集仪是一种常用的测量设备,用于测量结构物的振动情况。为确保测量结果的准确性,需要对振弦采集仪进行精度校正和误差分析。精度校正是指通过对采集仪进行实验或与已知准确值进行对比,来确定采集仪的测量误差,并对其进行修......
  • Landsat 7大气校正法的地表温度反演:ENVI实现
    本文介绍基于ENVI软件,实现对Landsat7遥感影像加以大气校正方法的地表温度反演操作。(基于ENVI的Landsat7地表温度(LST)大气校正方法反演与地物温度分析)1图像前期处理与本文理论部分更新:基于GEE的地表温度Landsat反演可以看谷歌地球引擎GEE批量计算Landsat地表温度,自动批量操作......
  • 基于二维小波变换的散斑相位奇异构造算法matlab仿真
    1.算法运行效果图预览         图(1)表示散斑原图像,(2)表示对(1)图像进行x轴方向的极化分析的小波相位图,呈周期的水平条纹,(3)表示对(1)图像进行y轴方向的极化分析的小波相位图,呈周期的竖直条纹。          表示相位奇异点图的构造过程,其中(1)表示......
  • Landsat7_C2_SR数据集(大气校正地表发射率数据集)
    Landsat7_C2_SR数据集是经大气校正后的地表反射率数据,属于Collection2的二级数据产品,空间分辨率为30米,基于Landsat生态系统扰动自适应处理系统(LEDAPS)(版本3.4.0)生成。水汽、臭氧、大气高度、气溶胶光学厚度、数字高程与Landsat数据一起输入到太阳光谱(6S)辐射传输模型中对卫星信号进......
  • 快速傅里叶变换 | FFT 初学
    FFT前置多项式:形如\(A(x)=\sum\limits_{i=0}^{n-1}a_ix^i\)的式子,其中\(n\)表示项数。多项式乘法:\[\begin{aligned}C(x)&=A(x)\cdotB(x)\\&=\sum\limits_{i=0}^{2n-2}c_ix^i\end{aligned}\]其中,\(c_i=\sum\limits_{j=0}^ia_jb_{i-j}\)。多项式表示法:系数表示......
  • m基于FPGA的OFDM系统verilog实现,包括IFFT,FFT,成型滤波以及加CP去CP,包含testbench
    1.算法仿真效果vivado2019.2仿真结果如下:CP加入,删除效果:系统RTL结构图:2.算法涉及理论知识概要正交频分复用(OrthogonalFrequencyDivisionMultiplexing,OFDM)是一种高效的无线通信技术,已经被广泛应用于无线通信领域。OFDM技术的主要优势在于其可以有效地抵抗多径效应和频率......
  • m基于FPGA的OFDM系统verilog实现,包括IFFT,FFT,成型滤波以及加CP去CP,包含testbench
    1.算法仿真效果vivado2019.2仿真结果如下:   CP加入,删除效果:   系统RTL结构图:   2.算法涉及理论知识概要          正交频分复用(OrthogonalFrequencyDivisionMultiplexing,OFDM)是一种高效的无线通信技术,已经被广泛应用于无线通信领域。OFDM......