|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——对ADC采样数据进行FFT处理
3 V+ K( c7 n# W% T0 L4 i8 o: c+ f& R+ q* ^" X
前面看了柱斑的3篇有关ADC采样的帖子,我的板子没有ADC,所以我也只能从同事的DAQ采集得到的数据进行FFT处理,当然只是进行仿真。学校学习的FFT的原理老早就丢给了老师,最近一段时间花了点时间复习了FFT的物理意义,这些信息大家都可以通过度娘得到7 f* f% p; S- B, \
, B. K' B$ v3 [, G7 [3 a7 \+ K
1 c, y" j/ l! C! [0 R( {/ q
( ~7 N$ i7 \" j7 P1 i0 F' F1 MFFT的作用有很多种,那么我们做FFT的意义非常简单,就是分析信号源中的频率分量,并精确得到每个频率分量的幅度,相位信息我们不关注。对了,fft我们没有能力自行设计代码,所以啦,只能使用Altera的IP核。
% F0 o- N* m( C/ h, N+ j) `+ e& j( a K: L9 `5 B
7 {0 K; \% V2 f- I# Z0 M) G; l6 ]. b; j @& G( o
在例化FFT使用之前,先简单描述下我们的系统。信号源来自光电探测器,为了提取出微弱的信号,信号在光域进行了声光调制,所以最终电信号在频率分析可以获得最大的动态范围。信号调制的频率应该KHz级别,所以我们的ADC采样速率不是很高,20MHz左右即可。只是信号调制时间长度一般是1ms,要求采样时间长度达到秒级,所以虽然采样率不高,但是每次处理的数据量还是比较大,比如一帧(1ms)数据采样后得到20000个样本。: w2 w5 Y; `4 Y4 D5 G
0 F$ G4 G3 g" e" m8 |7 E/ N1 r# S
! b1 Q3 b7 W& j: o* a
% Q8 R2 B7 Y6 `( g- c# Q5 v, y& R根据上述分析,那么在例化FFT的时候初步确定选用Streaming模式(个人感觉应该可以使用缓冲突发模式),fft转换长度选为2048.这样最小分辨出的频率是20000KHz/2048大致等于9KHz。
- P8 K! J( l% j& p1 G; d
4 d4 M9 `1 b( V
. n: P' l+ m3 J5 y8 l3 z& b7 U/ |
由于事先不知道信号调制的频率,所以选择了上述FFT的参数,结果悲剧发生了,FFT转换的结果始终是只有DC分量,询问同事得知信号调制在10KHz左右undefined
% v8 l$ ^6 Z1 k
+ a6 \* d# o& ^" z / n( z6 b" u: a s' m) |: @9 a
8 z' D/ Y. i% S. G( k
) ~, p: Q& J( Q! ~) h
# A y4 V" [0 R4 R0 j9 B4 b9 I& q
上图没有放大,我仔细放大查看过,确实没有其他频率分量(我查的是输出实部,虚部是底噪的响应);后来发现问题所在之后,重新例化了FFT,使用了32768点转换,这样最小可以分辨到610Hz。仿真结果如下图所示:) M- N6 @, j$ @ w. v0 O/ L
' _; r% M6 U7 h. N5 R" q+ G
+ x4 I1 |1 K. T* _% [9 C0 e& K' d
" w- D5 q1 N9 G+ f; P. [2 n9 z8 a3 t3 ~& W: O0 Q' R
6 L! R9 Q; t; \/ V2 |) U5 {
从上图我们可以看到信号频谱出现在了第18个点上,该点大致频率等于610*18=10.98KHz。
: c3 q4 t# t2 E6 R6 Q
8 h! Y* f6 ~& r3 m9 w! l+ V
0 O6 N% |( Q8 q
* L8 V4 f* F* X! b/ L; ]大致仿真过程就是这样了,最后也学柱斑来几个总结:
# k, c) j6 k5 r6 m% X
- v' t0 @2 X7 e" A1、是FFT给ADC采样数据进行转换的时候,ADC的数据从FFT的实部输入,虚部输入端口接0。这个为何这么做我也是不太清楚,看到有人这么做就这么做,给Altera提了SR,人家回复说可以这么做,至于具体虚部要不要接数据,人家说要根据自己的算法来决定 。
4 N- y5 s* R: K, Z; X9 j- p4 H# {" b/ X" T7 v$ e9 r
2、FFT的结果从上面仿真的结果来看,是不是我采用实部输出就可以呢?这个问题我也在SR里咨询了,答复也是可以的。但是FFT的用户手册说了,由于FFT核采用但是块浮点实现的,所以为了不丢失精度,最终结果是需要与EXP(指数)输出进行缩放处理,上图的src_value就是我缩放处理后实部的平方加上虚部的平方再开发得到的,这样得到的结果应该是FFT转换后的幅度吧。由于项目需要获取信号的精确幅度,所以我的疑问是直接从实部得到幅度值还是需要进行上述转换得到?
# K5 Z k: i0 b4 S) R, J
: Z. z% M s" N$ ^- _8 H( t" U& t+ F$ B# e( h, e* V
3、最后一个问题是图中明显看到出现了频率分量的镜像,那么32768点fft是不是只能分辨出一半的频率分量呢?比如20MHz的话只能分辨出610Hz到10MHz而不是610Hz到20MHz呢?因为后半部分都是前半部分的镜像啊。. j1 k3 g, R* ?9 h: z. _
|
|