|
发表于 2008-6-14 17:22:23
|
显示全部楼层
对信号进行时频转换,得到频域信号之后强度最大的就是主频,就是频域中的最大值,你需要得到这个最大值对应的频率,下面一段程序是我以前写的,有点乱,我也没有时间写说明了,呵呵,自己试试看吧,用点功夫,你会收获很多的。
tbl = CreateFFTTable(numberOfElementsForFFT); //Create N-point table
input = (double *)malloc(sizeof(double)*numberOfElementsForFFT);
response = (double *)malloc(sizeof(double)*numberOfElementsForFFT);
temparray1 = (double *)malloc(sizeof(double)*numberOfElementsForFFT);
temparray2 = (double *)malloc(sizeof(double)*numberOfElementsForFFT);
fitarray = (double *)malloc(sizeof(double)*numberOfElementsForFFT);
frequents = (double *)malloc(sizeof(double)*numberOfElementsForFFT);
fftresult1 = (NIComplexNumber*)malloc(sizeof(NIComplexNumber) * numberOfElementsForFFT);
fftresult2 = (NIComplexNumber*)malloc(sizeof(NIComplexNumber) * numberOfElementsForFFT);
for(i = 0;i< numberOfElementsForFFT;i++)
{
input = loadBuf[i+startpoint].TorqueCommand;
response = loadBuf[i+startpoint].TorqueSample;
temparray1 = 0;
temparray2 = 0;
frequents = i * samplerate / numberOfElementsForFFT;
}
//HamWin(input, numberOfElementsForFFT);
//HamWin(response,numberOfElementsForFFT);
FFTEx(input,numberOfElementsForFFT,numberOfElementsForFFT,tbl,0, fftresult1);
FFTEx(response,numberOfElementsForFFT,numberOfElementsForFFT,tbl,0, fftresult2);
for( i =0 ;i< numberOfElementsForFFT;i++)
{
//借用前面已经申请内存的连个数组
temparray1 = sqrt(pow(fftresult1.real,2)+pow(fftresult1.imaginary,2));
temparray2 = sqrt(pow(fftresult2.real,2)+pow(fftresult2.imaginary,2));
input = 20 * log10(temparray2 / temparray1) ;
//if(i == 1)offset = input[1];
//input = input -offset;
if(fabs(input+3)< 0.1 && first == 0 ){point1 = i; first =1;}
}
if(point1 == 0)point1 = numberOfElementsForFFT; |
|