急切求助:怎么得到信号的基频
如题,怎样计算出信号的主频,只知道好像是先做自功率变换,再求基频,但具体方法不清楚,那位知道的高手指点一下,版主出来救命啊,急死人了哦,呵呵,先谢谢了啊[ 本帖最后由 netcreature 于 2008-11-11 08:44 编辑 ] 频域分析除了进行功率谱分析外,最主要的还是快速傅立叶变换——即FFT。
AnalysisLibErrType FFT (double arrayXReal[], double arrayXImg[], int numberOfElements); 对了!你是要提取信号的基频信号,还是要求取基频信号的频率值?两者的具体算法会有差别的! 要求基频信号的频率值,具体怎么求啊,谢谢版主 double* wave; //输入信号、输出信号(FFT变换后)波形的实部数组;
double samples; //样本数;
double* mag; //信号的极坐标幅值数组;
double* img; //输入信号、输出信号(FFT变换后)波形的虚部数组;
double* phase; //信号的极坐标相位数组;
wave=malloc(samples*sizeof(double));
//为wave数组赋值(自己添加相应代码)
mag=malloc(samples*sizeof(double));
img=malloc(samples*sizeof(double));
phase=malloc(samples*sizeof(double));
FFT(wave,img,samples); //进行FFT变换;
ToPolar1D(wave,img,samples,mag,phase); //转换为极坐标方式;
PlotY(panelhandle,graphcontrolID,mag,samples,VAL_DOUBLE,.....); //绘制FFT变换波形;
free(phase);
free(img);
free(mag);
free(wave);
如果需要求取信号的精确频率值,可以使用PeakDetector()函数求解:
函数原型:
AnalysisLibErrType PeakDetector (double inputArray[], int size, double threshold, int width, int polarity, int initialize, int endOfData, int *count, double **locations, double **amplitudes, double **secondDerivatives); 环境激励下模态参数识别最常用的方法为功率谱峰值法PP( Peak Picking)。功率谱密度是用离散的傅里叶变换将实测的加速度数据转换到频域后直接求得。拾取功率谱密度图(PSD)上的峰值,频率即可简单确定。由弦理论公式可知,当索力一定时,高阶频率是基频的整数倍,表现在功率谱上则是谱上会出现一系列等间距的峰值,峰值的间距就是基频。拾取这一系列峰值,求相邻峰值的间距并做平均,作为所求基频。
是这样的,版主再帮我看看吧,非常感谢 功率谱的计算我记得上次已经和你说过了。在信号中混有太多噪声时,功率谱的波形不连续(或讲不光滑),一般用来做定性分析。
用FFT变换一样能达到目的,PeakDetector()就是用于波形的峰值(当然,你也可以将它用于功率谱上)。 另外,作信号分析时,你也可以利用MATLAB的信号处理工具箱,它的分析手段比CVI的更强,除了一般的功率谱分析外,MATLAB中还可以进行倒谱分析、最大熵谱分析等。
页:
[1]