||
一般FFT分析,都是求一个时间历程的频率成分,
用FFTW中的
fftw_plan_dft_r2c_1d
输入是一个实数列向量in[N],
输出是一个复数空间二维矩阵out[N][2],第1列是实数、第2列是复数。
求幅值时,要对复数向量的每个,取向量模,乘以2,再除以点数N。
$\textup{Amp}=2\sqrt{(x^2_{R}+x^2_{I})}/N$
频率计算
$f=i\cdot \frac{1}{t}$
其中,
$i$ 是采样点编号,从1到N;
$1/t$ 是频率分辨率(参 陈鹏 博文 link1),也是采样时间倒数,这个很关键,它是FFT变换的最小频率值。
如果t =0.01 s,那么FFT变换后最小频率只能分辨到 100 Hz!
注意:
1. 如果采样时间不到 1 s, 就设法补成 1 s。
一种方法是补零,(参考 彭真明 老师博文 link2 )
还有一种方法,如果已知频率大概范围,折算出周期后,用正周期的时间历程估计。
2. 如果有直流项(平均值大于零),需要把直流项滤掉。
fftw_complex *out = NULL; |
fftw_plan p; |
in = (double *)fftw_malloc(sizeof(double) * len); |
out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * len); |
p = fftw_plan_dft_r2c_1d(len, in, out, FFTW_ESTIMATE); |
fftw_execute(p); |
for (int i = 0; i < len; i++) |
{ |
amp = sqrt(out[i][0]*out[i][0] + out[i][1]*out[i][1]); |
amp = 2.0* amp/len; |
freq = i*1.0/t1; |
} |
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-24 10:21
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社