搜索
bottom↓
回复: 196

STM32上的256点FFT傅里叶变换---效果还不错!

  [复制链接]

出0入0汤圆

发表于 2010-6-21 16:23:26 | 显示全部楼层 |阅读模式
在STM32F10XX系列IC进行256点的FFT,发现效果还不错,波形正如预期所想,基本没发现什么大异常。

输入信号: X="1"+sin(2*pi*fo*t)

信号频率: 10KHZ

抽样点数: 48KHZ

抽样点数: 256

从上面输入的信号,可知, 正弦信号时叠加在一个直流分量为1V的信号之上,那么在进行FFT变换之后,所得频谱幅度应该在2V左右,并且频率为0,说明为直流分量。

在频谱10KHZ出将出现幅值幅度为1V左右的信号频率。

为了验证程序代码,先在MATLAB上实现仿真。

从MATLAB上仿真得到的结果,基本如上所述。

MATLAB仿真结果 (原文件名:MATLAB.jpg)

STM32的运算结果对比:

(原文件名:reslut.jpg)

VC模拟运算也基本符合(^_^)

(原文件名:pc.jpg)

对比MATLAB,感觉波形还不错,基本一致!(大家可以从我的博客上下载到相关程序,进行对比)
http://www.ednchina.com/blog/itspy

出0入0汤圆

发表于 2010-6-21 16:25:59 | 显示全部楼层
楼主用的是ST给的FFT库函数吗 ??

出0入0汤圆

发表于 2010-6-21 16:35:33 | 显示全部楼层
应该是,我看着,在matlab下,做完变换后的结果,和 cr4_fft_64_stm32(lBUFOUT, lBUFIN, NPT);函数的输出结果进行比较,我看应该是这样的
cr4_fft_64_stm32是定点,肯定是有偏差的

出0入0汤圆

 楼主| 发表于 2010-6-21 17:08:20 | 显示全部楼层
ST 的DSP库,为了速度,采用了DSP库
可能还需要一定优化,结果才更加一致
上位机采用的是基2算法。

出0入0汤圆

发表于 2010-6-21 17:19:26 | 显示全部楼层
我也想验证呢,看来我方法错了,我想直接用下位显示图形,回家我用楼主的,vc试试,对这个比较感兴趣

出0入0汤圆

 楼主| 发表于 2010-6-21 17:34:28 | 显示全部楼层
回复【4楼】szduan
我也想验证呢,看来我方法错了,我想直接用下位显示图形,回家我用楼主的,vc试试,对这个比较感兴趣
-----------------------------------------------------------------------

hehe,FFT还是比较有用的,可以做音频频谱分析啊, 用下位机验证,正是我下一步想做的, 只可惜,手头没有合适的显示屏,
呵呵,欢迎交流啊

出0入0汤圆

发表于 2010-6-21 18:25:14 | 显示全部楼层
这个库的源代码公开吗,我看效果不错,很想移植到你熬死软核上。

出0入0汤圆

发表于 2010-6-21 20:29:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-21 21:57:21 | 显示全部楼层
看不懂

出0入0汤圆

发表于 2010-6-21 22:09:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-21 22:53:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-22 00:37:06 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-6-22 19:24:07 | 显示全部楼层
呵呵,说句不中听的话。

楼主没用对fft,你这样算会发生频谱泄露,要加窗;或者改变采样频率。

当然,楼主本意是演示,做的非常好了。

出0入0汤圆

发表于 2010-6-22 20:41:50 | 显示全部楼层
非常感谢楼主,我最近正在做一个内容相关的项目

出0入0汤圆

发表于 2010-6-22 22:00:43 | 显示全部楼层
回复【12楼】fickle
-----------------------------------------------------------------------

高手

出0入0汤圆

发表于 2010-6-29 11:25:45 | 显示全部楼层
看看那

出0入0汤圆

发表于 2010-6-30 21:07:09 | 显示全部楼层
只是看看,没看懂

出0入0汤圆

发表于 2010-6-30 21:42:56 | 显示全部楼层
很早就关注STM32的DSP库,呵呵,谢谢楼主的无私奉献;
另外,想请教fickle(12楼)一个问题,这样算导致频谱泄露的根本原因在哪里?
希望fickle能指点一下

出0入0汤圆

发表于 2010-6-30 23:18:50 | 显示全部楼层
回复【18楼】feng200808
很早就关注stm32的dsp库,呵呵,谢谢楼主的无私奉献;
另外,想请教fickle(12楼)一个问题,这样算导致频谱泄露的根本原因在哪里?
希望fickle能指点一下
-----------------------------------------------------------------------

指点谈不上,只是交流。

频率分辨率:48kHz / 256 = 0.1875 kHz

测量频率是 10kHz,那么经过fft后,第 53-1 项就是10kHz。 (10kHz / 0.1875kHz = 53.3,这里不是整数倍数关系,即发生频率谱泄

露,这是算法本身决定的。)

好多教科书都这么写,可是总是没有量的概念,因为这个概念太抽象了。假如测量一个实际东东,要求精度很高,比如电阻,就会发现有测量误差。

解决的办法,除了提到2种办法外,还有一种更好单频办法(ad5933 资料里有)。

出0入0汤圆

发表于 2010-7-1 07:42:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-30 11:20:33 | 显示全部楼层
回复【19楼】fickle  
回复【18楼】feng200808
很早就关注stm32的dsp库,呵呵,谢谢楼主的无私奉献;
另外,想请教fickle(12楼)一个问题,这样算导致频谱泄露的根本原因在哪里?
希望fickle能指点一下
-----------------------------------------------------------------------
指点谈不上,只是交流。
频率分辨率:48khz / 256 = 0.1875 khz
测量频率是 10khz,那么经过fft后,第 53-1 项就是10khz。 (10khz / 0.1875khz = 53.3,这里不是整数倍数关系,即发生频率谱泄
露,这是算法本身决定的。)
好多教科书都这么写,可是总是没有量的概念,因为这个概念太抽象了。假如测量一个实际东东,要求精度很高,比如电阻,就会发现有测量误差。
解决的办法,除了提到2种办法外,......
-----------------------------------------------------------------------
这个是FFT的栅栏效应,不是什么频谱泄露
这个问题所有的教材都讲的很清楚
要解决也很简单,减小频率分辨率就是了
或者增加采样点数或者提高采样频率

出0入0汤圆

发表于 2010-9-30 12:58:03 | 显示全部楼层
回复【21楼】antonine
-----------------------------------------------------------------------

在时域内看,是栅栏效应;在频域看,是频谱泄漏。而fft作用就是为了转换为频域信号。因此,频谱泄漏更准确,是个能量概念。

减小频域分辨率并不能根本解决问题,而是接近而已。最好的办法严格依照测定频率的2^N采样。

出0入0汤圆

发表于 2010-9-30 13:31:48 | 显示全部楼层
22楼讲的很有道理,我用VC试过,在2^N采样精度很高,且采样频不一定要很高。fickle确实要高一筹。哪位高手能不能讲一下得到结果后的处理方法或思路。

出0入0汤圆

发表于 2010-9-30 13:42:12 | 显示全部楼层
都用MATLAB了还需要STM32的DSP库么?

出0入0汤圆

发表于 2010-9-30 13:45:17 | 显示全部楼层
回复【23楼】shdjdq  
-----------------------------------------------------------------------

我觉得处理方法得根据你的需求而定。比如你到底是要全部频谱还是要某个特定频率的频谱。
提高采样频率增加点数是最直接有效的办法。
相同情况下一般加窗可以缓解频谱泄露,不同的窗效果不同,看你的需要了。
如果只要得到一个大概的频谱加不加窗都无所谓了。

出0入0汤圆

发表于 2010-9-30 13:46:32 | 显示全部楼层
回复【24楼】real_sugar  
-----------------------------------------------------------------------

一个在上位机上,一个在下位机上......

出0入0汤圆

发表于 2010-9-30 13:47:14 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-9-30 22:00:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-1 07:47:38 | 显示全部楼层
mark!都是高手!

出0入0汤圆

发表于 2010-10-1 22:59:41 | 显示全部楼层
回复【22楼】fickle  
回复【21楼】antonine
-----------------------------------------------------------------------
在时域内看,是栅栏效应;在频域看,是频谱泄漏。而fft作用就是为了转换为频域信号。因此,频谱泄漏更准确,是个能量概念。
减小频域分辨率并不能根本解决问题,而是接近而已。最好的办法严格依照测定频率的2^n采样。

-----------------------------------------------------------------------
!!!!!!
不知道48K采样多少个点合适啊????!!!!

建议回去复习一下《数字信号处理》,仔细看下“栅栏效应”和“频谱泄漏”的原因,现象,影响,消减方法

出0入0汤圆

发表于 2010-10-2 02:02:31 | 显示全部楼层
回复【30楼】antonine
-----------------------------------------------------------------------

楼主的实例,信号频率10kHz,请问你觉得多少采样频率合适?

出0入0汤圆

发表于 2010-10-3 12:54:53 | 显示全部楼层
栅栏效应说白了就是用离散量来量化连续量所带来的问题,跟量化误差一样,是只能减小不能消除的,没有能够从根本上解决的办法

对于要求特别高的精确测量,可以参考这篇论文中的方法

点击此处下载 ourdev_587279WSWTGB.pdf(文件大小:931K) (原文件名:频谱分析的校正方法.pdf)

出0入0汤圆

发表于 2010-10-3 15:15:16 | 显示全部楼层
回复【32楼】antonine
-----------------------------------------------------------------------

看了你的30楼回复,许多叹号和问号,因此猜想,你有更好方法。

据楼主的10kHz,以为48kHz采样频率带来测量误差,改为32kHz,64kHz,128kHz等等之类2^N比较适合。

你看过很多书的人,能提出更好的方法么?

出0入0汤圆

发表于 2010-11-22 11:00:11 | 显示全部楼层
其实  antonine
说的是对的,不信可以看任何一本信号与系统的书

出0入0汤圆

发表于 2010-11-22 11:47:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-22 16:10:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-22 19:35:53 | 显示全部楼层
回复【34楼】E318AAA
其实  antonine  
说的是对的,不信可以看任何一本信号与系统的书
-----------------------------------------------------------------------

呵呵,信号10kHz,我倒是愿意听听你的建议?

出675入8汤圆

发表于 2010-11-22 19:49:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-22 20:38:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-22 20:40:41 | 显示全部楼层
回复【22楼】fickle   
回复【21楼】antonine  
-----------------------------------------------------------------------
在时域内看,是栅栏效应;在频域看,是频谱泄漏。而fft作用就是为了转换为频域信号。因此,频谱泄漏更准确,是个能量概念。、、、



我只说想告诉你  ,你这么理解是错的

出0入0汤圆

发表于 2010-11-22 20:50:50 | 显示全部楼层
减小频域分辨率并不能根本解决问题,而是接近而已。最好的办法严格依照测定频率的2^n采样。


最好的办法严格依照测定频率的2^n采样   这句话 严格依照测定频率的2^n采样 是对的 ,可是与你上述的栅栏效应和频谱泄漏的联系确实理解有问题 ,还有你可以看那个同学发的论文 频谱分析的校正方法.pdf

至于书建议你看《线性系统与信号》B.P.LATHI的第二版   第570页 可以了解一下什么是频谱泄露  第614页可以看看什么栅栏效应

出0入0汤圆

发表于 2010-11-22 21:58:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-22 23:01:34 | 显示全部楼层
mark FFT

出0入0汤圆

发表于 2010-11-22 23:23:00 | 显示全部楼层
mark FFT

出0入0汤圆

发表于 2010-11-22 23:36:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-23 05:36:03 | 显示全部楼层
回复【40楼】E318AAA
回复【22楼】fickle   
回复【21楼】antonine   
-----------------------------------------------------------------------  
在时域内看,是栅栏效应;在频域看,是频谱泄漏。而fft作用就是为了转换为频域信号。因此,频谱泄漏更准确,是个能量概念。、、、
我只说想告诉你  ,你这么理解是错的
-----------------------------------------------------------------------

回复【41楼】E318AAA
减小频域分辨率并不能根本解决问题,而是接近而已。最好的办法严格依照测定频率的2^n采样。
最好的办法严格依照测定频率的2^n采样   这句话 严格依照测定频率的2^n采样 是对的 ,可是与你上述的栅栏效应和频谱泄漏的联系确实理解有问题 ,还有你可以看那个同学发的论文 频谱分析的校正方法.pdf
至于书建议你看《线性系统与信号》b.p.lathi的第二版   第570页 可以了解一下什么是频谱泄露  第614页可以看看什么栅栏效应

-----------------------------------------------------------------------

呵呵,就是一个问题:信号10kHz,采样频率是多少?就是这么一个简单问题。

出0入0汤圆

发表于 2010-11-23 09:05:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-23 10:13:34 | 显示全部楼层
刚想提ti的iqmath,但发现里头没有fft函数,,,,

出0入0汤圆

发表于 2010-11-23 10:25:27 | 显示全部楼层
回复【46楼】fickle
-----------------------------------------------------------------------

采样频率满足采样定理就OK了(还有你那问题,如何回答?采样频率不是某一确定值的)  但是为了满足相关的精度或者其他用途,《最好的办法严格依照测定频率的2^n采样》这句话是对的(是不是就是你的问题了?当然你如果要说涉及到什么新方法,比如那个论文里提到的,我也没研究过,还有我回帖只是说你在频谱泄露和栅栏效应的理解可能和我理解的有所出入),因为这样的采样率,到时候对应的频谱线在你的整数倍数上,而楼主1楼的问题因为对应的整数倍得到的频谱值(不是整数值),是频谱泄露(但是这和栅栏效应依然是两个不同的概念,不是什么时域《=》频域)的值,有误差,不是完全准确值,还有如果不加某一设定的窗的话,就是矩形窗(想想采样时间0-T),因为窗函数的旁瓣,然后才有的频谱泄露,但还是和栅栏效应不同,虽然理解上可能觉得差不多

PS:大家都是学习交流,氛围不用这么紧张吧,每个人都有自己理解不足的地方,大家一起交流才能进步,当然我也很菜,很多东西理解的可能都有问题,望指正

出0入0汤圆

发表于 2010-11-23 11:13:17 | 显示全部楼层
还有如果某场合 采样频率固定为48KHZ,  信号依然是10KHZ,还是采样256个点,这个时候,你怎么办?

出0入0汤圆

发表于 2010-11-23 11:38:22 | 显示全部楼层
mark,fft

出0入0汤圆

发表于 2010-11-23 11:57:27 | 显示全部楼层
回复【52楼】E318AAA
还有如果某场合 采样频率固定为48khz,  信号依然是10khz,还是采样256个点,这个时候,你怎么办?
-----------------------------------------------------------------------

呵呵,这个问题12楼我已经回答。

出0入0汤圆

发表于 2010-11-23 12:16:06 | 显示全部楼层
回复【51楼】E318AAA
回复【46楼】fickle  
-----------------------------------------------------------------------
采样频率满足采样定理就ok了(还有你那问题,如何回答?采样频率不是某一确定值的)  但是为了满足相关的精度或者其他用途,《最好的办法严格依照测定频率的2^n采样》这句话是对的(是不是就是你的问题了?当然你如果要说涉及到什么新方法,比如那个论文里提到的,我也没研究过,还有我回帖只是说你在频谱泄露和栅栏效应的理解可能和我理解的有所出入),因为这样的采样率,到时候对应的频谱线在你的整数倍数上,而楼主1楼的问题因为对应的整数倍得到的频谱值(不是整数值),是频谱泄露(但是这和栅栏效应依然是两个不同的概念,不是什么时域《=》频域)的值,有误差,不是完全准确值,还有如果不加某一设定的窗的话,就是矩形窗(想想采样时间0-t),因为......
-----------------------------------------------------------------------

手算一下或者matlab算算,10kHz信号,使用32,64,128kHz,要比48kHz,准确性要好。分析原因,无非就是频谱泄漏或者栅栏效应。

至于对于10kHz信号,非要使用48kHz采样,由于频谱泄漏会出现计算误差,精度要求高要采用加窗,工程较多使用汉宁窗。

其实,有更简单的方法,使用单频傅立叶,比如goertzel算法。实际应用中,效果很不错。

出0入0汤圆

发表于 2010-11-23 12:19:16 | 显示全部楼层
mark

出0入31汤圆

发表于 2010-11-23 12:33:46 | 显示全部楼层
栏栅效应和频谱泄漏不是一回事,栏栅效应是数字处理后的频点是离散的,处于离散频点之间的频率不能直接得出,就像栅栏一样。频谱泄露是对周期信号进行非整周期采样造成的,它让能量向邻近频率泄露,说白了就是信号在两个周期衔接之间产生的跳跃引起的。

出0入0汤圆

发表于 2010-11-23 12:39:29 | 显示全部楼层
1、几百年前提出傅立叶变换,上个世纪五六十年代,提出fft算法。我倒真不认为你会提出新的算法。

2、至于你提到的书,看不看的,大量罗列数学公式,离工程差的太远。比如发生泄露下,怎么+窗,+什么窗等等非常重要算法细节。

3、在实际应用中,dsp/arm往往提供算法代码,但是没有窗的代码。因此,改改采用频率,可以直接套用现成算法代码。不要劳神还要

写窗代码,反正我从来没写过。(这也是我在12楼提出更改采样频率初衷。)

出0入0汤圆

发表于 2010-11-23 12:54:37 | 显示全部楼层
回复【58楼】zchong
栏栅效应和频谱泄漏不是一回事,栏栅效应是数字处理后的频点是离散的,处于离散频点之间的频率不能直接得出,就像栅栏一样。频谱泄露是对周期信号进行非整周期采样造成的,它让能量向邻近频率泄露,说白了就是信号在两个周期衔接之间产生的跳跃引起的。
-----------------------------------------------------------------------

你所说的栏栅效应,和我理解不一样。

1、栏栅效应是个时域概念。

2、举个例子吧。就拿10kHz信号,48kHz采样,256点为例。

    栏栅长度:48kHz/256 = 0.1875kHz,而10kHz/0.1875 = 53.3333333。那么,53 x 0.1875 = 9.9375kHz。而9.9375kHz+/-0.1875

就是左右2个栏栅,很形象的名词。

而信号能量以9.9375为中心,分别向左右2个栏栅,成正态分布。在这个意思上,栏栅和频谱是相同的。

出0入0汤圆

发表于 2010-11-23 13:46:04 | 显示全部楼层
回复【54楼】fickle
-----------------------------------------------------------------------
回复【52楼】E318AAA  
还有如果某场合 采样频率固定为48khz,  信号依然是10khz,还是采样256个点,这个时候,你怎么办?
-----------------------------------------------------------------------

呵呵,这个问题12楼我已经回答。



第12楼  ()原话

呵呵,说句不中听的话。

楼主没用对fft,你这样算会发生频谱泄露,要加窗;或者改变采样频率。

当然,楼主本意是演示,做的非常好了。


那我想请教一下,为什么会发生频谱泄露(如果理想信号,单一频率,过程中无噪声影响)?

出0入0汤圆

发表于 2010-11-23 13:52:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-23 13:57:40 | 显示全部楼层
回复【54楼】fickle
-----------------------------------------------------------------------

那如果采样频率和窗函数都固定了,也就是让你的谱线不在你所需要的信号频率的整数倍,然后你会???

出0入0汤圆

发表于 2010-11-23 19:20:17 | 显示全部楼层
回复【63楼】E318AAA
-----------------------------------------------------------------------

19楼已作说明。

你要是真的想弄明白这事,亲手计算一下,比较一下各种采样频率下的计算结果,结论是显而易见的。

如果你愿玩的更明白,用正弦波激励0.1毫欧的电阻,然后侧量这个微伏级信号。

出0入0汤圆

发表于 2010-11-23 20:18:35 | 显示全部楼层
这个帖子要收藏,好多概念都还没接触过···

出0入0汤圆

发表于 2010-11-23 20:59:03 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-11-23 21:11:59 | 显示全部楼层
mark  刚要用到fft

出0入0汤圆

发表于 2010-11-23 21:50:24 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-11-24 09:34:20 | 显示全部楼层
回复【22楼】fickle
-----------------------------------------------------------------------

信号f0=133HZ(134HZ,或者任何在采样定理范围的整数频率), 采样频率fs=1024HZ ,采样点数1024,这个时候结论(频率分辨率是1HZ,那么是不是只要信号频率是正数,是不是都不会出现逆理解的频谱泄露),  那按照你22楼说的 ,最好的办法严格依照测定频率的2^n采样, 那fs=1024,难道是f0的2^n???

出0入0汤圆

发表于 2010-11-24 09:54:02 | 显示全部楼层
回复【19楼】fickle
-----------------------------------------------------------------------

既然你喜欢大部分回帖说在19楼已做说明

好的,我们看你都做了什么说明,是不是提到2个办法(不算上你说的那个单频办法):1.加窗;2.改变采样率(而且最好是严格依照测定频率的2^n采样)

那首先,用楼主位来分析  f0 = 10HZ   fs = 48HZ   就是频谱上 第53 对应的是9.9375kHZ那么第54对应的是9.9375+0.1875kHZ
也就是说,实际上10KHZ对应的频谱线应该在53-54之间,因为FFT在频域是离散的,我们只能看到53和54,而不法看到这之间的,所以谓之栅栏效应 ,而一般这个时候,我们会选择53,或者54谱线对应的值,认为是和实际频率10kHZ的,当然你会发现这样的话,误差很大,所以你会认为这个采样率问题,或者加窗的话,会让你近似认为的那个线对应的值更接近实际值,所以这就是你认为的2种方法

其实如果按你的办法,1,加窗,首先你应该去了解为什么加窗会改变那个谱线的值?这样你就知道加窗是来干什么的(附带说明,    最好还看看为什么会有频谱泄露,是怎么产生的)
                    2,采样频率,也可以不必一定严格的按照你说的
                    
因为不用加窗,也不用改变采样频率,还是楼主位那个f0,fs,我们可以根据第53, 9.9375khz对应的值,和第54,  9.9375+0.1875kHZ对应的值,我们只要简单的再算一步,也就是频谱校正,那么可以很正确的算出在f0,10kHZ的幅度,相位,不凡用MATLAB试试 ,然后用32楼的资料PDF里面的校正方法算出来

出0入0汤圆

发表于 2010-11-24 10:39:30 | 显示全部楼层
回复【70楼】E318AAA
-----------------------------------------------------------------------

因为不用加窗,也不用改变采样频率,还是楼主位那个f0,fs,我们可以根据第53, 9.9375khz对应的值,和第54,  9.9375+0.1875kHZ对应的值,我们只要简单的再算一步,也就是频谱校正,那么可以很正确的算出在f0,10kHZ的幅度,相位,不凡用MATLAB试试 ,然后用32楼的资料PDF里面的校正方法算出来

-------你说的这段话,实质就是加窗。


fft计算的结果其实是,以频谱线为中心的,成正态分布的。而加窗的实质就是为了偏移这个中心线。

出0入0汤圆

发表于 2010-11-24 10:54:43 | 显示全部楼层
回复【71楼】fickle
-----------------------------------------------------------------------

1.你还是不知道何为加窗(如果你觉得你知道的话,可以讲清楚点,洗耳恭听)
2.(fft计算的结果其实是,以频谱线为中心的,成正态分布的)谁告诉你的?正态分布?这个很有想法,不过有点天马行空,还有至于加窗的实质???我的个神,你可以多查点资料再来讨论吗?

出0入0汤圆

发表于 2010-11-24 10:55:29 | 显示全部楼层
加窗其实为了弥补fft算法的缺陷的。

常用的加窗方法就有七、八种,而且不断有新的方法出现。反过来思考,意味着每种方法都有缺点的,没有形成统一算法。

因此,应用在工程中还是小心为妙。

呵呵,改变频率是个简单解决办法,或者使用单频算法。

如果你非要48kHz采样10k信号,小波分析也许更合适。不过,一般的dsp/arm不提供c例程。

出0入0汤圆

发表于 2010-11-24 10:56:46 | 显示全部楼层
还有那个校正计算  ,不是说明 偏移这个中心线,太扯淡了

出0入0汤圆

发表于 2010-11-24 10:58:09 | 显示全部楼层
回复【72楼】E318AAA
回复【71楼】fickle  
-----------------------------------------------------------------------
1.你还是不知道何为加窗(如果你觉得你知道的话,可以讲清楚点,洗耳恭听)
2.(fft计算的结果其实是,以频谱线为中心的,成正态分布的)谁告诉你的?正态分布?这个很有想法,不过有点天马行空,还有至于加窗的实质???我的个神,你可以多查点资料再来讨论吗?
-----------------------------------------------------------------------

呵呵,理解不了?一笑而过吧。

出0入0汤圆

发表于 2010-11-24 11:06:15 | 显示全部楼层
那还是我说点我的理解吧
首先为什么会有频谱泄露,就是因为加了窗函数(先考虑矩形窗(0-T,幅值固定为1),也就是默认对原信号不做处理),想想你FFT是一定时域的吧(0-T),是不是相当于在时域上,原信号与矩形窗相乘,那么在频域上呢?首先原信号,不管你采取的是多少个周期(整数个周期和非整数个周期),原信号频谱是不是不会变?(这里先想清楚,单信号频率,在谱线上就一个线吧,其他点都没有频谱线),那你用默认的矩形窗,它的频域上是什么?(想想,如果忘记了去看看书),时域相乘,频域是不是就是两者频谱卷积了,因为窗函数的旁瓣(所以你在楼主位那种情况下,居然能在第53跟,换成频率就是9.9375kHZ上居然有谱线幅值的原因了),这就是窗函数带来的效果,再想想这和你理解的窗函数

出0入0汤圆

发表于 2010-11-24 11:15:23 | 显示全部楼层
我要你看那个书的第570页,是让你看看,频谱泄露的原因,因为有窗函数的旁瓣,所以在非信号频率的时候你还能得到其他点频谱的谱线值,而FFT的缺陷就在于它必须是在一定时间类(0-T),这就是他天生自带窗函数(不做处理,就是矩形窗),这也就是他频谱泄露的原因,当然大不人理解都是这样(甚至很多非常有资格,资历的老教授,博导级人物),他们认为你不是整数个周期采样(比如a个周期),所以你就会频谱泄露,然后要加窗或者别的,其实前半句理解是对的,整数个采样,那么在谱线上,原信号谱线肯定是那第a跟线上,这是你看的就是频谱的正峰值,但是频谱泄露永远存在,只是你整数个周期采样的时候,你得到的数据,不是频谱泄露出的值而已,这个时候与加窗关系没那么必须;还有加不同窗的目的是为了改变主瓣和旁瓣(与你理解的什么偏移没丁点关系)

出0入0汤圆

发表于 2010-11-24 11:24:53 | 显示全部楼层
回复【75楼】fickle
-----------------------------------------------------------------------

去看看何谓正态分布,和窗函数的表达式,再来吧

出0入0汤圆

发表于 2010-11-24 11:26:35 | 显示全部楼层
回复【75楼】fickle
-----------------------------------------------------------------------

还有加窗能什么偏移中心线,你连频域卷积都不理解

出0入0汤圆

发表于 2010-11-24 11:30:45 | 显示全部楼层
回复【74楼】E318AAA
还有那个校正计算  ,不是说明 偏移这个中心线,太扯淡了
-----------------------------------------------------------------------

呵呵,看来你太想一论高下了,我倒是喜欢玩玩。说太多抽象名词概念,而且打很多字,太麻烦。

其实,这个问题很简单,就按楼主所说输入信号10kHz,那么

1、比较在48kHz 采样频率 和我提出的32、64kHz采样频率,分别计算10kHz信号幅值,看看那个计算结果更准确?

2、使用48kHz采样频率,然后+各种窗,看看他们计算结果是不是有出入?

呵呵,拜托你,别时不时的整出一本书来唬人。

出0入0汤圆

发表于 2010-11-24 11:32:00 | 显示全部楼层
回复【80楼】fickle
-----------------------------------------------------------------------

因为不用加窗,也不用改变采样频率,还是楼主位那个f0,fs,我们可以根据第53, 9.9375khz对应的值,和第54,  9.9375+0.1875kHZ对应的值,我们只要简单的再算一步,也就是频谱校正,那么可以很正确的算出在f0,10kHZ的幅度,相位,不凡用MATLAB试试 ,然后用32楼的资料PDF里面的校正方法算出来

出0入0汤圆

发表于 2010-11-24 11:36:24 | 显示全部楼层
回复【80楼】fickle
-----------------------------------------------------------------------

你可以自己算一算,没经过校正的结果???就是用9.9375kHZ能和你原10kHZ一样吗?但是我可以通过这两个从频谱泄露的值,算出48kHZ采样频率是  10kHZ的准确幅值

PS:还有我算过,记得用校正后的值,不是随便53或者54的值


还有什么书,那些都是基本的好吧 ,什么卷积(学过信号的没有不知道的吧),还有什么旁瓣,主瓣,我还没能力把它说成不是那么听起来故弄玄虚的理解概念,还有不说我说的书有故意什么其他用途 ,你可以看任何一本信号与系统的书,都有写到

出0入0汤圆

发表于 2010-11-24 11:43:17 | 显示全部楼层
还有我给你来个例子吧 ,我用MATLAB算的  虽然f0和fs不是楼主位的

例子,y=sin(2pi*133.3t)既  幅值=1, f0=133.3HZ,fs=1024HZ,采样点数N=1024;

用matlab 第134跟线幅值  0.8579
         第135跟线幅值  0.3684(这是幅值最高点)
如果你只看着这 时候幅值 0.8579肯定是原信号幅值差很多吧,所以你觉得精确度很低


但是第134,135对应的不是 我们133.3hz的真实幅值吧!那么用校正就可以得出133.3HZ的幅值,可以告诉你,至少是0.9999

出0入0汤圆

发表于 2010-11-24 11:45:34 | 显示全部楼层
回复【80楼】fickle
-----------------------------------------------------------------------

我可以告诉你,用校正,48KHZ的精度和你32、64kHz的精度一样的(记得是校正,只有为什么要校正,你自己也清楚)




还有如果你认为校正也是抽象名词,那我也没办法,我想不出啥名来叫

出0入0汤圆

发表于 2010-11-24 11:46:52 | 显示全部楼层
动手算一下吧 ,拜托你

出0入0汤圆

发表于 2010-11-24 11:47:59 | 显示全部楼层
回复【82楼】E318AAA
-----------------------------------------------------------------------

你的原话,

1、“用9.9375kHZ能和你原10kHZ一样吗?”---说明48kHz采样10kHz信号得到结果不准确。

2、“还有我算过,记得用校正后的值,不是随便53或者54的值”---说明+窗之后还有误差。

呵呵,看不出你还想争论什么?

又,你不会幼稚的以为拎本什么书,或者知道个名词概念就高人一等吧?

出0入0汤圆

发表于 2010-11-24 11:51:27 | 显示全部楼层
回复【83楼】E318AAA
还有我给你来个例子吧 ,我用matlab算的  虽然f0和fs不是楼主位的
例子,y=sin(2pi*133.3t)既  幅值=1, f0=133.3hz,fs=1024hz,采样点数n=1024;
用matlab 第134跟线幅值  0.8579
         第135跟线幅值  0.3684(这是幅值最高点)
如果你只看着这 时候幅值 0.8579肯定是原信号幅值差很多吧,所以你觉得精确度很低
但是第134,135对应的不是 我们133.3hz的真实幅值吧!那么用校正就可以得出133.3hz的幅值,可以告诉你,至少是0.9999
-----------------------------------------------------------------------

132=?

出0入0汤圆

发表于 2010-11-24 11:52:08 | 显示全部楼层
呵呵,你不会找那个信号都不会吧?

出0入0汤圆

发表于 2010-11-24 11:55:54 | 显示全部楼层
看来你不仅要举着教科书,还要举着matlab文档(这个好重),好好念吧。

呵呵,开个玩笑。

出0入0汤圆

发表于 2010-11-24 12:20:42 | 显示全部楼层
回复【88楼】fickle
-----------------------------------------------------------------------

你用MATLAB看看 行吧 ,或者有围观的群众可以去看看

出0入0汤圆

发表于 2010-11-24 12:22:31 | 显示全部楼层
回复【90楼】E318AAA
-----------------------------------------------------------------------

第1跟谱线对应的是0,第二根谱线对应的是1KHZ




知道MATLAB是什么吗?
用过吗?
别说你还是MATLAB高手,要说就小声点说 ,别被大家听到了

出0入0汤圆

发表于 2010-11-24 12:24:45 | 显示全部楼层
还有现在对信号方面还有涉及的,难道连MATLAB都不用了???

出0入0汤圆

发表于 2010-11-24 12:27:29 | 显示全部楼层
matlab难道不是基本工具???居然说我   举着matlab文档(这个好重),好好念吧。

不法理解

出0入0汤圆

发表于 2010-11-24 12:30:09 | 显示全部楼层
回复【86楼】fickle
-----------------------------------------------------------------------

你就认为校正就是你所说的加窗!!!!

出0入0汤圆

发表于 2010-11-24 12:32:32 | 显示全部楼层
回复【86楼】fickle
-----------------------------------------------------------------------

你的原话,

1、“用9.9375kHZ能和你原10kHZ一样吗?”---说明48kHz采样10kHz信号得到结果不准确。---结果不准确,但是我可以通过9.9375kHZ和后一根谱线的值算出10Khz的幅值 (是校正计算,就简单算一下,不涉及你那理解的加窗)

2、“还有我算过,记得用校正后的值,不是随便53或者54的值”---说明+窗之后还有误差。(你能不能理解什么是加窗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)

呵呵,看不出你还想争论什么?

又,你不会幼稚的以为拎本什么书,或者知道个名词概念就高人一等吧?

出0入0汤圆

发表于 2010-11-24 12:34:21 | 显示全部楼层
回复【95楼】E318AAA
-----------------------------------------------------------------------

还有你的理解能力真差

出0入0汤圆

发表于 2010-11-24 12:37:10 | 显示全部楼层
回复【91楼】E318AAA
回复【90楼】e318aaa  
-----------------------------------------------------------------------
第1跟谱线对应的是0,第二根谱线对应的是1khz

知道matlab是什么吗?
用过吗?
别说你还是matlab高手,要说就小声点说 ,别被大家听到了
-----------------------------------------------------------------------
"第1跟谱线对应的是0,第二根谱线对应的是1khz "

呵呵,这种话你也敢说。拜托,好好把频率对应关系搞明白再来吧。

出0入0汤圆

发表于 2010-11-24 12:40:01 | 显示全部楼层
呵呵,遇到你这“牛人”,还是闪吧,我的婶呀!

出0入0汤圆

发表于 2010-11-24 12:42:26 | 显示全部楼层
回复【97楼】fickle
-----------------------------------------------------------------------

这是MATLAB里面显示的问题 !!!!!

出0入0汤圆

发表于 2010-11-24 12:43:05 | 显示全部楼层
回复【98楼】fickle
-----------------------------------------------------------------------

好吧 ,那我衷心的问你 你用过MATLAB吗?

出0入0汤圆

发表于 2010-11-24 12:55:43 | 显示全部楼层
MATLAB程序
fs = 1024;
N  = 1024;

n  = 0 :N - 1;
t  = n / fs;
f0 = 123;(这里先用123只是解释上面的谱线对应的关系,前面的应该是123.3,不是133.3,我是说结果,谱线对应的)
x  = sin(2 * pi * f0 * t);

figure(1);
subplot(211);
plot(t,x);
grid;

y   = fft(x , N);
mag = abs(y) / N *2
f   =(0 : length(y) - 1) * fs / length(y);
figure(1);
subplot(212);
plot(f,mag);
grid;


(原文件名:FFT值.jpg)

出0入0汤圆

发表于 2010-11-24 12:57:50 | 显示全部楼层
如果把f0设置为123.3


(原文件名:FFT值2.jpg)

出0入0汤圆

发表于 2010-11-24 13:02:07 | 显示全部楼层
频谱校正公式(见前面上传的PDF)
MATLAB程序

k=0.8579/(0.3684+0.8579)
A = (pi * 0.3684 * k) / sin(pi * k)

计算的幅值A

(原文件名:FFT值3.jpg)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 19:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表