打印

fft变换的疑惑

[复制链接]
4637|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
graby|  楼主 | 2009-6-2 21:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做了1024点的fft,用C写的,用软件模拟一个单周期的正弦波的时候,变换的结果是正确的。
但是在实际做采样的时候,我采样交流电8个周波,每个周波采样128点,但是变换的结果就不对了,除了直流分量比较准确,别的数值都差不多,不知道为什么,是不是频谱泄漏了,请教,采集连续的周波的时候,fft变换的结果是怎么样的。

相关帖子

沙发
computer00| | 2009-6-2 21:19 | 只看该作者

你要连续采样1024点,中间不能停的。

使用特权

评论回复
板凳
graby|  楼主 | 2009-6-2 21:25 | 只看该作者

fft

是的中间没有停,采样一个周波是20ms,采样8个周波,每个周波是128个点,我是连续采样的。

使用特权

评论回复
地板
computer00| | 2009-6-2 21:30 | 只看该作者

那就有可能是你的FFT计算出错了...有可能是计算过程有溢出

或者根本就是程序写错了……

用我的FFT运算代码试试看:https://bbs.21ic.com/club/bbs/showEssence.asp?id=10676&page=1

使用特权

评论回复
5
graby|  楼主 | 2009-6-2 22:42 | 只看该作者

00我觉得程序应该没有错

我在做的时候,用软件仿真的时候都是很正确的,我明天把程序贴出来,大家一起讨论一下。

使用特权

评论回复
6
computer00| | 2009-6-2 23:16 | 只看该作者

如果程序没有错,那就只可能是你的信号错了...

使用特权

评论回复
7
graby|  楼主 | 2009-6-3 14:20 | 只看该作者

fft的疑惑


请教圈圈,我在用软件模拟fft变换的时候这样做,但是分析出来的数据放到Re中,结果是Re[0]=1299,Re[1]=0,
在Re[8]=199,基波分量怎么会跑到Re[8],硬件做出来的结果也往数组的高位跑。不是很懂,为什么单周期是号的
换到多周期的时候会位子会发生变化。在做硬件的时候连续8周期的采样应该是没有问题的,下面的核心代码用的
是圈圈写的,我自己写的那段做出的结果也是这样,昨天还以为是我的程序出错了。
 for(uint16 j=0;j<1024;j++){
   dataR[j]=200*cos(6.28/128*j)+1300;
  }
  FftInput(dataR);       //位倒序
  FftExe(dataR,Re,Im);   //做FFT运算
  Re[0]=(LEN_TYPE )Re[0]/1024;
  for (i=1;i<1024;i++){
    Re=(LEN_TYPE )(sqrt((Re>>9)*(Re>>9)+(Im>>9)*(Im>>9)));
  }

使用特权

评论回复
8
computer00| | 2009-6-3 21:20 | 只看该作者

有可能是你的采样频率不准,或者信号频率不准,

结果位置移动了?

使用特权

评论回复
9
graby|  楼主 | 2009-6-3 21:57 | 只看该作者

再次求助圈圈

是的,位子移动了,很奇怪,移到data[8]里去了,但是结果是对的,但是软件仿真应该是对的,但是软仿也移动了,帮我看看
for(uint16 j=0;j<1024;j++){
   dataR[j]=200*cos(6.28/128*j)+1300;
  }
软仿的采样应该是准的吧,可是软仿也移位了。 

使用特权

评论回复
10
computer00| | 2009-6-3 22:07 | 只看该作者

没错,就是应该在data[8]啊

data[0]是0Hz,data[1]就是频率为Fs/(1024/1)的幅度值,data[8]就是频率为Fs/(1024/8)的值,即Fs/128,你每个周期采样128点,所以实际信号的频率就是Fs/128。

使用特权

评论回复
11
graby|  楼主 | 2009-6-3 22:22 | 只看该作者

还要问一下00

我在时间采样的时候,连续采样8个周波,结果基波分量就出现在data[12]里面,我用示波器做出的结果,基波大概在62.25Hz的地方,我这样的采样对吗?
 一个周波是0.02s,连续采样8个周期,那么就是0.16S,每次采样的时间是156.25us,这样做出来的结果,应该是在data几的位子,真心请教,在学校的时候学的理论部够扎实。

使用特权

评论回复
12
computer00| | 2009-6-3 23:29 | 只看该作者

你仔细读读这个贴子吧:

使用特权

评论回复
13
graby|  楼主 | 2009-6-4 11:15 | 只看该作者

我知道了

还有疑问就是我实际采样的是后,工频率是50Hz,变换以后基波跑到65Hz的地方,我用示波器看了下采样间隔是正确的,怀疑是AD采样模糊,频谱泄漏造成的,是不是应该要加窗,或是增加采样间隔,多采几个周波,我现在连续采10个周波,fs=5k,远大于fc=500Hz,这样做的话分辨率做到5HZ,但是实际在×根号2,也就是分辨率在7Hz左右,实际采样还是出现移位,不知道加窗的效果会不会好一点。

使用特权

评论回复
14
graby|  楼主 | 2009-6-4 12:04 | 只看该作者

感谢圈圈的指导

发现问题是做滤波的是还出现了一点问题,现在准了,但是还是想请教圈圈,如果要加窗的话在算法上实现起来比较复杂,对系统的事实性要求比较高,这点我的单片机做不到。

使用特权

评论回复
15
computer00| | 2009-6-4 21:10 | 只看该作者

一般都不用加窗,泄露是很少量的,对频率判断基本上没有

只会在峰值旁边产生一些幅度很小的频率分量。

使用特权

评论回复
16
graby|  楼主 | 2009-6-4 21:22 | 只看该作者

回复圈圈

只是我想把它做的更加准确一点,现在我通过增加了采样的周期数,来提高分辨力,然后再加窗函数来减少他的频谱扩散。用汉明窗的加权算法,在做加权的时候,是不是吧采样好的数,成一窗函数在进行FFT就行了?

使用特权

评论回复
17
computer00| | 2009-6-4 21:46 | 只看该作者

你加个窗上去,或许会比以前扩散得更厉害。

你自己用matlab做些实验便知。

使用特权

评论回复
18
graby|  楼主 | 2009-6-4 21:51 | 只看该作者

比原来的扩散的还要厉害

为什么会这样呢?是因为不是整周期采样造成的嘛?

使用特权

评论回复
19
computer00| | 2009-6-4 22:06 | 只看该作者

你加了窗,实际上是混入了新的频率分量进去。

其实你可以软件将旁边多余的数据置0,这样那些突变的数据就不会有影响了。

实际上,1024个采样点,才一两个点产生突变,频率扩散是很微弱的,对你的结果基本上没啥影响。

使用特权

评论回复
20
graby|  楼主 | 2009-6-23 19:49 | 只看该作者

请教00

终于可以回来继续讨论了,圈圈我用matlab做了一遍,和我实际做出来的是一样的,在加窗以后出现扩散,加hanning窗后信号衰减了一半,在数组的
data[0],data[1](直流)50HZdata[49],data[50],data[51],(基波)处扩散了
那么根据分辨力=FS/1024的话,理论是1HZ的分辨力,实际上做不到1HZ的分辨力。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

59

帖子

0

粉丝