硬汉嵌入式论坛

 找回密码
 立即注册
楼主: eric2013
收起左侧

事隔五年之后,开启第2版DSP数字信号处理和CMSIS-NN神经网络教程,同步开启三代示波器,更至50章(2021-11-01)

  [复制链接]

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-2-14 11:17:16 | 显示全部楼层
感谢,大力支持。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2022-3-2 16:30:27 | 显示全部楼层
版主你好,我想请教下fir滤波器实时处理的问题。教程里例子用matlab生成系数的时候,里面采样率fs 1000Hz。例程里c语言实时滤波,例程设置1次处理一个点,然后通过for循环调用1024次处理了1024个点。我想问下,计算滤波器系数的时候 fs和实际程序中采样频率是什么关系?这个matlab中的fs应该怎么选取合适。。
比如我通过AD实时读取传感器数据。对采集的数据实时滤波。假设我AD采样数据频率5Khz,那我算滤波器系数的时候fs需要设置成5khz嘛?还是1000hz也可以?我发现fs数值越大滤波器阶数就需要越大才能满足滤波器设计要求。。
像我这样实时滤波的时候,调用这个处理函数arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize); 读完一次AD后马上调用处理数据就可以了?
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-3-4 15:07:46 | 显示全部楼层
谢谢楼主分享!
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2022-3-6 00:43:26 来自手机 | 显示全部楼层
希望硬汉哥能做一期关于卡尔曼滤波器在信号处理上实际运用的例子。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-3-11 15:09:55 | 显示全部楼层
lsx007 发表于 2022-3-2 16:30
版主你好,我想请教下fir滤波器实时处理的问题。教程里例子用matlab生成系数的时候,里面采样率fs 1000Hz。 ...

不好意思,回复晚了。

1、AD的速度要和matlab设置的采样速度一致。
2、你可以选择整体全部处理,也可以一个一个实时处理。每次处理的点数可以根据你的需要设置,保证连续就行。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-3-11 15:10:13 | 显示全部楼层
阿猫物语 发表于 2022-3-6 00:43
希望硬汉哥能做一期关于卡尔曼滤波器在信号处理上实际运用的例子。

好的,后面安排。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2022-3-18 17:07:25 | 显示全部楼层
硬汉哥,最近在KEIL (v5.36)上使用DSP 源码编译工程,出现如下错误:
Error: L6218E: Undefined symbol __aeabi_f2h (referred from basicmathfunctionsf16.o).
Error: L6218E: Undefined symbol __aeabi_h2f (referred from basicmathfunctionsf16.o).
关键 "f2h"和“h2f”我都没有找到。
然后是由于KEIL 编译器好像是V5.30开始,不再release lib 库,只是dsp 源码,我就是升级了KEIL 的编译工具出现上述的Error。

然后我尝试在编译选项中,将“Use MicroLIB” 不勾选,则不会出现错误;但工程使用到的uart 出现问题;所以想请教一下硬汉哥,想使用MicroLib的情况下,怎么解决上面的错误,
您遇到过吗?谢谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-3-22 17:08:33 | 显示全部楼层
Gavin_Suzhou 发表于 2022-3-18 17:07
硬汉哥,最近在KEIL (v5.36)上使用DSP 源码编译工程,出现如下错误:
Error: L6218E: Undefined symbol  ...

不用添加f16,那个是给M55内核芯片使用的。

然后添加方法推荐使用MDK RTE一键添加即可,直接添加的就是源码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-3-22 17:08:39 | 显示全部楼层
K@DQ9S17@[LFHZ_7DL)GSEN.png
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2022-3-24 09:19:54 | 显示全部楼层
硬汉哥,关于#207楼的帖子感谢回复。
我就是用MDK RTE一键添加源码的,然后我发现F16的源码会被自动添进来,
image.png
然后就出现报错:
Error: L6218E: Undefined symbol __aeabi_f2h (referred from basicmathfunctionsf16.o).
Error: L6218E: Undefined symbol __aeabi_h2f (referred from basicmathfunctionsf16.o).
我想将F16的文件禁止编译,但没有找到相关选项,所以还是无法解决报错现象
您知道怎么做吗?
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2022-3-30 07:38:25 | 显示全部楼层
已经解决了,需要添加宏 DISABLEFLOAT16在工程中
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-4-14 09:05:43 | 显示全部楼层
版主你好,我想请教下fir滤波器实时处理的问题。
教程中每次处理1个点,然后通过for循环调用1024次处理了1024个点。因为我要实时滤波,所以我想的是ADC每次采集一个数,我就用DMA转到内存里,然后在DMA中断中对这个数进行滤波,那这样就会导致我每次只处理一个点,总共处理1个点,就不是以前的1024个了,只不过我是每次DMA中断都调用低通滤波的函数,一个周期调用1024次,大体是这个意思,我想问下,这样会导致滤波失败吗?还是说滤波效果和教程中的一样,感谢回答!!
回复

使用道具 举报

0

主题

68

回帖

68

积分

初级会员

积分
68
发表于 2022-4-27 11:09:56 | 显示全部楼层
dsp 处理  顶
回复

使用道具 举报

9

主题

38

回帖

65

积分

初级会员

积分
65
发表于 2022-6-12 22:59:19 | 显示全部楼层
例程:V7-223_不限制点数FFT
函数:cfft,的如下代码片段,会出现k和j都是0的情况,我形参FFT_N值为200,不知道是不是BUG
[C] 纯文本查看 复制代码
		while(k<=j)               				  /* 如果k<=j,表示j的最高位为1 */  
		{           
			j=j-k;                 				  /* 把最高位变成0 */
			k=k/2;                 				  /* k/2,比较次高位,依次类推,逐个比较,直到某个位为0,通过下面那句j=j+k使其变为1 */
		}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-6-13 14:55:51 | 显示全部楼层
ice845930 发表于 2022-6-12 22:59
例程:V7-223_不限制点数FFT
函数:cfft,的如下代码片段,会出现k和j都是0的情况,我形参FFT_N值为200, ...

这个不是bug,我这个不是任意点数,是不限制点数,要是2的幂才可以。

比如你是200个吧,你得整个256, 后面56个自己补零测试

不像matlab那么牛,可以任意点数。

回复

使用道具 举报

0

主题

16

回帖

16

积分

新手上路

积分
16
发表于 2022-6-30 10:34:30 | 显示全部楼层
学习一下,请问大佬直接看第二版,还是需要从第一版开始看呢
回复

使用道具 举报

6

主题

42

回帖

60

积分

初级会员

积分
60
发表于 2022-7-11 23:17:41 | 显示全部楼层
硬汉大佬,什么时候上mqtt + 阿里云  腾讯云 教程啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-7-12 10:19:16 | 显示全部楼层
中尴人 发表于 2022-7-11 23:17
硬汉大佬,什么时候上mqtt + 阿里云  腾讯云 教程啊

等BSP视频教程和DSP视频教程整差不多了
回复

使用道具 举报

6

主题

42

回帖

60

积分

初级会员

积分
60
发表于 2022-7-12 19:45:18 | 显示全部楼层
eric2013 发表于 2022-7-12 10:19
等BSP视频教程和DSP视频教程整差不多了

坐等大佬的 mqtt
回复

使用道具 举报

1

主题

35

回帖

38

积分

新手上路

积分
38
发表于 2022-7-15 23:42:50 | 显示全部楼层
神经网络的教程什么时候开始,硬汉
回复

使用道具 举报

2

主题

63

回帖

69

积分

初级会员

积分
69
发表于 2022-7-23 16:37:41 | 显示全部楼层
写的不错!不知道做这方面待遇怎么样?
回复

使用道具 举报

19

主题

93

回帖

150

积分

初级会员

积分
150
发表于 2022-7-29 18:15:11 | 显示全部楼层
硬汉哥问一个问题,ad采样得到的结果如何转变为dsp库需要的数据类型。比如用float,直接转换为float类型就可以了吗
回复

使用道具 举报

1

主题

35

回帖

38

积分

新手上路

积分
38
发表于 2022-8-18 13:42:19 | 显示全部楼层
ifree 发表于 2022-7-29 18:15
硬汉哥问一个问题,ad采样得到的结果如何转变为dsp库需要的数据类型。比如用float,直接转换为float类型就可 ...

强制转换就行了
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-12-15 19:45:10 | 显示全部楼层
mark 感谢 楼主 分享
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-1-2 15:29:19 | 显示全部楼层
以28阶的低通滤波为例,文中说群延时是14,第15个才是实际滤波后的波形数据起始点。如果采样1024个点,每调用一次arm_fir_f32处理的采样点个数设置为1,则需要调用arm_fir_f32的次数numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE=1024次。这样输出数组testOutput[14]是滤波后的波形第1个数据,testOutput[15]是第2个.......testOutput[1023]是第1010个。然而FIR低通滤波那个例程输入输出数组都是1024个元素的素组,testOutput的最后一个元素[1023]才放到滤波后的第1010个数据,这样不就肯定会丢失了14个数据?我采样了1024个点,肯定是想他输出1024个数据啊,结果我每做完1024个点的滤波,就得重新启动一次啊,前面14个数是有问题的,后面又丢了14个数据,这跟硬汉你章节的标题“支持逐个数据的实时滤波”的目标相差很远啊,这怎么解决啊?
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-1-2 15:40:01 | 显示全部楼层
按照FIR低通滤波器的例程,采样1024个数,每调用一次arm_fir_f32处理的采样点个数为1,所以要调用1024次arm_fir_f32,然而输入输出数组的元素个数都是1024,这样的话,我每处理1024个数据,就得丢失群延时个数据啊,输入1024个数,输出却是(1024-群延时)个滤波后的数据,这怎么谈得上是“支持逐个数据的事实滤波"呢?我下一批新的1024个数据怎么跟上一批的1024个数据衔接?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2023-1-2 16:17:08 | 显示全部楼层
632069383 发表于 2023-1-2 15:40
按照FIR低通滤波器的例程,采样1024个数,每调用一次arm_fir_f32处理的采样点个数为1,所以要调用1024次arm ...

没有理解到点上。

这里的逐个数据是建立在你群延迟的基础上,比如你采集1024个,整体延迟14个点,之后你仅需保证数据连续,可以无限输出了,只是要比你采集的速度慢14个点。这个本质上硬件模拟滤波器来的,模拟滤波器的输入和输出就是有个延迟的。只是说我们数字量化后,延迟的这一段数据不能再用了。
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-1-3 22:39:04 | 显示全部楼层
eric2013 发表于 2023-1-2 16:17
没有理解到点上。

这里的逐个数据是建立在你群延迟的基础上,比如你采集1024个,整体延迟14个点,之后 ...

延迟14个点的现象不就是输出数组的out[14]开始才是in[0]的滤波结果吗?in和out这两个数组都是1024个元素的,那么out[1023]对应in[1009],in[1009]之前的数延时了我能理解,但是in[1010]之后的数据对应的滤波结果呢?难道要读取到out[1024]、out[1025]这样越界的空间?所以当我想获得in[1010]~in[1023]所对应的滤波结果应该如何做?是不是我要保留下这in[1010]~in[1023]的14个数据,然后再去获取新的1010个数据,把这14+1010=1024个数据再依次放到in[0]~in[1024]里,然后再执行一次fir_int,然后再调用1024次arm_fir_f32,然后提取out[14]开始的14个数据,这14个数据才是这段话前面我想得到的in[1010]~in[1023]所对应的滤波结果?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2023-1-3 23:02:04 | 显示全部楼层
632069383 发表于 2023-1-3 22:39
延迟14个点的现象不就是输出数组的out[14]开始才是in[0]的滤波结果吗?in和out这两个数组都是1024个元素 ...

确实是没有理解到点上,继续再读新的一组1024点(注意要是你前面1024后连续的1024点即可),带入继续算即可,永远就是错位14个。
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-1-3 23:05:51 | 显示全部楼层
eric2013 发表于 2023-1-3 23:02
确实是没有理解到点上,继续再读新的一组1024点(注意要是你前面1024后连续的1024点即可),带入继续算即 ...

再读新的一组1024个点,还是只能得到1024-14=1010个滤波结果啊,到头来每组1024个数据,滤波后都只能得到1010个滤波结果,是这样吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2023-1-3 23:13:10 | 显示全部楼层
632069383 发表于 2023-1-3 23:05
再读新的一组1024个点,还是只能得到1024-14=1010个滤波结果啊,到头来每组1024个数据,滤波后都只能得到 ...

不是又有14个,而是2048点有14个,3096点也是14个,以此类推,不管多少点,输出都是比输入仅少14个。
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-1-3 23:21:58 | 显示全部楼层
eric2013 发表于 2023-1-3 23:13
不是又有14个,而是2048点有14个,3096点也是14个,以此类推,不管多少点,输出都是比输入仅少14个。

内存有限,每次我只能采样一定量的数据,比如1024个,我不可能采样1亿个数据再处理啊,现在就假定我每批数据3096个了,我明白依然是输出比输入少14个啊,但是下一批3096个如何衔接过来?前面的滤波结果明明少了14个啊,只有3082个输出了结果了,然后下一批3096又是只有3082个结果,这前后两批3082的结果因为前一批少了14个结果,所以这两个3082的结果不是连续的啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2023-1-3 23:27:27 | 显示全部楼层
632069383 发表于 2023-1-3 23:21
内存有限,每次我只能采样一定量的数据,比如1024个,我不可能采样1亿个数据再处理啊,现在就假定我每批 ...


内存不足问题:
所以我推出了逐点滤波功能。。。 就是为了解决大家内存不足问题,内存可以循环利用。

衔接问题:
一样啊,继续1024点衔接就行了,用户仅需一直送数据就行了,如果你内存不足就用逐点滤波,有效解决内存利用问题,这就是个“永动机”,输出永远比输入少14个点。


这个问题就聊这么多吧,建议你实际做个永久性滤波不停歇的功能试试,数据不用存到芯片里,打印到matlab输出效果查看就行。
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-1-3 23:32:55 | 显示全部楼层
第一批数据的1010~1023这14个原始数据的滤波结果去哪里了?如果不把这14个上一批末尾的原始数据引入到下批数据的最前面,批与批之间的滤波结果就不连续的啊,按你的说法,下一批是全新的一批原始数据,这样得出来的滤波结果怎么可能接得上上一批的滤波结果呢?
123.png
234.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2023-1-3 23:34:43 | 显示全部楼层
632069383 发表于 2023-1-3 23:32
第一批数据的1010~1023这14个原始数据的滤波结果去哪里了?如果不把这14个上一批末尾的原始数据引入到下批 ...

你自己已经完全无法理解这个问题了,不再讨论了。

内存不足问题:
所以我推出了逐点滤波功能。。。 就是为了解决大家内存不足问题,内存可以循环利用。

衔接问题:
一样啊,继续1024点衔接就行了,用户仅需一直送数据就行了,如果你内存不足就用逐点滤波,有效解决内存利用问题,这就是个“永动机”,输出永远比输入少14个点。


image.png

回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
发表于 2023-2-14 20:44:37 | 显示全部楼层
怎么不能下载了?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2023-2-15 10:05:22 | 显示全部楼层
tdatd 发表于 2023-2-14 20:44
怎么不能下载了?

测试了下,下载正常。

如果你论坛下载不正常的话,论坛置顶帖对应的开发板网盘里面也有的。
回复

使用道具 举报

3

主题

90

回帖

99

积分

初级会员

积分
99
发表于 2023-2-28 16:48:17 | 显示全部楼层
V5-202_Matlab的串口通信实现,怎么样打包成exe程序
回复

使用道具 举报

3

主题

90

回帖

99

积分

初级会员

积分
99
发表于 2023-2-28 19:33:57 | 显示全部楼层
lib钱 发表于 2023-2-28 16:48
V5-202_Matlab的串口通信实现,怎么样打包成exe程序

APP>Application Compiler.>Add main file
回复

使用道具 举报

3

主题

90

回帖

99

积分

初级会员

积分
99
发表于 2023-2-28 19:35:57 | 显示全部楼层
lib钱 发表于 2023-2-28 16:48
V5-202_Matlab的串口通信实现,怎么样打包成exe程序

问题是没有退出,线程。

matlabuart.m

4.34 KB, 下载次数: 0

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 21:46 , Processed in 0.540918 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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