硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2267|回复: 9
收起左侧

求教F429 AD采样后利用DSP库计算的问题

[复制链接]

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2020-8-2 15:56:07 | 显示全部楼层 |阅读模式
我利用AD采样1024个点,采样率用200khz,如果要用循环把1024个ad值都转化为电压值很慢,所以我用l了arm_mat_scale_f32(&pSrcA, Cov, &pDst);这个矩阵放缩函数将采样后的1024个值统一(*3.3/4096)转化为电压值。可是这个函数只支持浮点数输入,而DMA搬运的数据都是uint16,所以我就要先用一个1024的循环(adcValue[i]=(float)adcBuffer[i];)将AD采样的uint16数组adcBuffer转换成float数组adcValue,再将adcValue传入矩阵放缩函数。请问下有没有更好地方法,感谢了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2020-8-2 16:46:06 | 显示全部楼层
不需要转换成电压值,ADC采集后,直接送入fft即可。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2020-8-2 18:53:03 | 显示全部楼层
eric2013 发表于 2020-8-2 16:46
不需要转换成电压值,ADC采集后,直接送入fft即可。

感谢,但如果要直接送进fft的话,还是要变成float形式。采集出来的uint16数组是必须要经过我上面说的循环后才能变成float数组吗?还是有更好的方法
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2020-8-3 03:17:52 | 显示全部楼层
mem2mem 发表于 2020-8-2 18:53
感谢,但如果要直接送进fft的话,还是要变成float形式。采集出来的uint16数组是必须要经过我上面说的循环 ...

不用转啊,整数也可以看做是浮点数,这个完全不影响。
比如你定义三个浮点数:
float a,b,c

设置a和b都赋值为整数 :
a = 99,  b = 999。

求解:
c = a*b

肯定也可以正确求解啊。
而你往DSP浮点API里面代入,同样的道理
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2020-8-3 13:46:11 | 显示全部楼层
eric2013 发表于 2020-8-3 03:17
不用转啊,整数也可以看做是浮点数,这个完全不影响。
比如你定义三个浮点数:
float a,b,c

但是我像这样,把dma搬运过来的uint16数组adcbuffer直接放到arm_rfft_fast_f32(&S, adcBuffer, FFTOutput, 0);计算出来的结果一团糟啊
批注 2020-08-03 134507.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2020-8-3 13:57:47 | 显示全部楼层
mem2mem 发表于 2020-8-3 13:46
但是我像这样,把dma搬运过来的uint16数组adcbuffer直接放到arm_rfft_fast_f32(&S, adcBuffer, FFTOutput ...

直接参考我的二代示波器吧,还省事点,就不用跟你解释那么多了

【二代示波器】事隔三年后开启二代示波器的设计工作,性能将更强劲,向专业示波器设计靠拢,已经发布
http://www.armbbs.cn/forum.php?m ... 5785&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2020-8-3 14:31:54 | 显示全部楼层
eric2013 发表于 2020-8-3 13:57
直接参考我的二代示波器吧,还省事点,就不用跟你解释那么多了

【二代示波器】事隔三年后开启二代示波 ...

二代示波器里也是用循环把 uint16 usWaveBufTemp转换成了float32 testInput_fft_2048,也就说只有这个办法吗?
批注 2020-08-03 142818.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2020-8-3 15:11:01 | 显示全部楼层
mem2mem 发表于 2020-8-3 14:31
二代示波器里也是用循环把 uint16 usWaveBufTemp转换成了float32 testInput_fft_2048,也就说只有这个办 ...

这个与整数转浮点没关系了,这个是因为此函数内部的实现是直接单精度浮点,即4字节为单位做计算的。

而你送入个16bit,即2字节的缓冲区数据,肯定是不行的。

回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2020-8-3 15:19:32 | 显示全部楼层
eric2013 发表于 2020-8-3 15:11
这个与整数转浮点没关系了,这个是因为此函数内部的实现是直接单精度浮点,即4字节为单位做计算的。

...

那我就必须转这一道了啊,如果我送uint32进函数行吗?又或者我把uint16当q15定点数,用定点数fft计算行吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2020-8-3 15:38:08 | 显示全部楼层
mem2mem 发表于 2020-8-3 15:19
那我就必须转这一道了啊,如果我送uint32进函数行吗?又或者我把uint16当q15定点数,用定点数fft计算行吗 ...

1、可以送uint32_t。
2、可以Q15计数,定点数要注意定标,输出结果不是Q1.15,而Qx.y,比Q10.6

这个问题就帮你这么多吧,不再交流了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-11 01:12 , Processed in 0.278046 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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