cmsis库里的fft,有点理解上的问题,请大神指点下

alca_bigV 2017-08-31 09:10:04
目的是把cmsis的fft移植跑起来.代码移植,编译都没有问题.
1)用于测试的采样数组,我是在matlab中生成的,用以下命令
512个点.t=0:1/6656:511/6656;%生成采样时间序列
s1=sin(54*2*pi*t);%生成采样点.
在matlab下测试这些采样点,用
fftsa1=fft(s1,512);%fft变换,
再取模,输出图形,如下:可见是正确的.

2)输出模值1--10,如下图.

只有对应频率的模为1,其他都为0,正确的.

3)把这个数组放到代码里,用cmsis的库函数进行fft变换.()
得到一个1024的数组.如下:



我的理解,这一步 求出的只是一个包括实部与虚部的数组,于是,对这个数组进行求模.
结果,得到一个 512的数组,每一项都为 1.

问题:
1)求模以后,不是应该 与第2步 相对应,即,只有对应频率 的模才为1,其他频率 的模 应该为零吧,这里为什么会512项都为1?看样子又不像出错..。。
2)我用另一个fft算法(非cmsis库)进行处理,得到的数组进行求模,也得到了一个同样都是1的数组..猜测,cmsis库的fft运算应该没有问题,而是我的理解哪里有问题...感觉 像是 一个圆,等分了512份,实部与虚部对应于每份半径的sin与cos值,这样求模就是1.但,如果我想取对应的频率 的幅值,肯定不能这样取,否则,每个分频率 求的模值 都是1,没道理..应该只有一个对应频率 的值 才是1(如第2 步图中的值)
...全文
1532 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
alca_bigV 2017-09-05
  • 打赏
  • 举报
回复
引用 6 楼 byeyear 的回复:
程序中comp这个结构看不到其定义,是否类似如下形式:
typedef struct
{
float real;
float imag;
} comp;
如果是上面这种,那原始数据就应该没问题,下面我也不知道如何下手分析了,sorry。
\
是的,是这个定义 ...
早上把生成的数组导到matlab中,在里面手动取模,画出来,,.

偏移量很好,,第5个偏移量多了0.0002,其他都为0..画图是好东西..
只是好像所有的幅值都叠加了 1 这个幅值....而且5偏移量的地方只有0.0002..
按我的理解,应该是 0,0, 0,0, 0,0, 0,0 1,0,....
不过至少 偏移量是对了......

谢谢你的交流.
alca_bigV 2017-09-04
  • 打赏
  • 举报
回复
引用 4 楼 byeyear 的回复:
可否贴一下你的FFTbuf结构以及&FFTbuf.un.real[0]起始的内存内容?原始数据出问题的可能性比较大。
还有一种可能,就是你的ifftFlag和doBitReverse参数有问题。
ifftFlag取0,doBitReverse取1试试。


上面是结构和标志定义..
..另外:
你说"原始数据出问题的可能性比较大",我是不是可以这样理解 ,你认为,结果数据出了问题?也就是fft转化的结果不正确?
1)那正确的用了arm_cfft_f32后的数据,对于512个点,如果采样数据来自一个50hz的正弦波,是不是可以理解为,应该是 偏移量为0和偏移量为50hz处有数值,其他的数值都是0?(在cmsis的例程中,它的举例用的数据好像是个混和信号 ,只是去找出混和信号 中幅值最大的频率分量,所以不能当成我这个例子的参考).
2)如果fft转化的结果不正确,我对所有的频率分量进行求模计算(转化后的数据存放:real[0],imag[0],real[1],imag[1]........),得到的模值都是1,,很有规律性.......
////////////////////////////////////////////////////////////////////////////
这正是我理解 出现矛盾的地方.
a)说它不正确,因为每一个偏移量都有数据,,而不是我想像的,只是偏移量(假设为50)为某个定值的地方有值,其他为0.(因为我三的是标准的正弦波).
b)说它正确,因为它的值很有规律,都是1,我用另一个fft算法代码对这些采样数据进行处理,得到的另一个结构的real 和 imag数组,虽然和这个差别很大,但是当对每一项求模时,也是都是1...
byeyear 2017-09-04
  • 打赏
  • 举报
回复
程序中comp这个结构看不到其定义,是否类似如下形式: typedef struct { float real; float imag; } comp; 如果是上面这种,那原始数据就应该没问题,下面我也不知道如何下手分析了,sorry。
byeyear 2017-09-02
  • 打赏
  • 举报
回复
可否贴一下你的FFTbuf结构以及&FFTbuf.un.real[0]起始的内存内容?原始数据出问题的可能性比较大。 还有一种可能,就是你的ifftFlag和doBitReverse参数有问题。 ifftFlag取0,doBitReverse取1试试。
byeyear 2017-08-31
  • 打赏
  • 举报
回复
1. arm_cfft_f32要求输入序列为复数,按real[0] Imag[0] Real[1] Imag[1] ......排列。不知道你的FFTbuf.un结构是什么样子的。对于你的例子,实部用你构造的数据,虚部置零; 2. 既然是测试,那你可以直接在arm代码里面构造三角函数数组,没必要matlab里面算好再复制过来; 3. 你的测试数据是纯实数,cmsis库里有arm_rfft_f32,输入为纯实数序列,速度比arm_cfft_f32快,具体看cmsis帮助文档和这篇: http://www.cnblogs.com/byeyear/p/3533292.html 4. 帖子里用了“移植”这个词,也许你是用cmsis源代码编译的?建议先用cmsis提供的编译好的lib测试看看,在cmsis软件包里面就有编译好的lib,针对常见体系结构和常见编译器的都有。
alca_bigV 2017-08-31
  • 打赏
  • 举报
回复
用的arm-fft库如下:
alca_bigV 2017-08-31
  • 打赏
  • 举报
回复
引用 2 楼 byeyear 的回复:
1. arm_cfft_f32要求输入序列为复数,按real[0] Imag[0] Real[1] Imag[1] ......排列。不知道你的FFTbuf.un结构是什么样子的。对于你的例子,实部用你构造的数据,虚部置零; 2. 既然是测试,那你可以直接在arm代码里面构造三角函数数组,没必要matlab里面算好再复制过来; 3. 你的测试数据是纯实数,cmsis库里有arm_rfft_f32,输入为纯实数序列,速度比arm_cfft_f32快,具体看cmsis帮助文档和这篇: http://www.cnblogs.com/byeyear/p/3533292.html 4. 帖子里用了“移植”这个词,也许你是用cmsis源代码编译的?建议先用cmsis提供的编译好的lib测试看看,在cmsis软件包里面就有编译好的lib,针对常见体系结构和常见编译器的都有。
感谢.. 1)对,我重新处理过顺序,这点确认不会出错,所有虚部为0,实部用数据代替. 2)这一步, 因为代码里当时没有sin数组,matlab也有移其他的数据,为了省事,所以当时就直接 matlab直接复制过来, 3)当时没考虑速度 ,直接 抓 到第一个,看了下说明,就直接 用它,对于cpu来说,任务不是很多,所以没有考虑这点,如果理解能对得上号,,以后换成arm_rfft_f32。现在在测试, 4)对,我用的源代码编译,没有用它的库....你是担心编译过程出问题对吧?所以建议我用库...我也怀疑过,但后面自己推翻了这个怀疑。因为后面生成的数组,很有规律,全部取模,全部为1....感觉 应该是没错,这里对不上号...如果用库,也计算出同样的结果,那么一样存在这个问题...所以.....

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧