搜索
bottom↓
回复: 52

请问一下各位大虾,这种波形通过什么算法可以获得直流信号

[复制链接]

出0入22汤圆

发表于 2023-12-13 22:57:17 | 显示全部楼层 |阅读模式
如图,客户方要求能够过滤掉噪声信号,最终取得直流信号。

因为有实时性要求,所以fft的方式感觉不是很妥帖。
尝试过用卡尔曼滤波,均值滤波(包括去极值,滑动等)。均无法得到理想的效果。

尝试使用128个点做平均滤波,才能勉强达到要求,如下图


但是实际使用过程中,不能有这么大的点数做平均,尝试使用8个点做平均,实时性已经不再满足要求。


请问大侠有没有什么建议?
谢谢。

附部分数据:


  1. 172.69114
  2. 172.69114
  3. 172.227854
  4. 171.708735
  5. 171.708688
  6. 172.25137
  7. 173.320109
  8. 173.748285
  9. 173.289934
  10. 172.858592
  11. 172.858592
  12. 173.861394
  13. 173.861347
  14. 172.707066
  15. 171.553483
  16. 171.553437
  17. 172.328623
  18. 173.208211
  19. 173.208211
  20. 173.208211
  21. 173.208211
  22. 173.208211
  23. 173.738459
  24. 174.216833
  25. 174.216786
  26. 173.047278
  27. 172.012299
  28. 172.012253
  29. 172.012253
  30. 172.012299
  31. 172.012299
  32. 172.012299
  33. 172.591582
  34. 172.96942
  35. 173.388142
  36. 173.388142
  37. 173.388142
  38. 172.891282
  39. 172.891235
  40. 172.891282
  41. 172.891282
  42. 172.489649
  43. 171.720563
  44. 171.720516
  45. 171.720563
  46. 173.132168
  47. 173.98796
  48. 173.987914
  49. 172.854634
  50. 172.854587
  51. 173.600391
  52. 173.600391
  53. 173.078012
  54. 171.939749
  55. 171.466405
  56. 171.466405
  57. 172.644621
  58. 173.454592
  59. 173.454592
  60. 173.454545
  61. 172.62511
  62. 172.999222
  63. 173.874758
  64. 173.874758
  65. 173.332356
  66. 172.375888
  67. 171.731645
  68. 171.731599
  69. 172.115862
  70. 172.600709
  71. 172.600662
  72. 172.199495
  73. 172.199495
  74. 172.997173
  75. 174.09157
  76. 174.542191
  77. 173.961837
  78. 172.994751
  79. 172.59079
  80. 172.59079
  81. 172.59079
  82. 172.59079
  83. 171.843311
  84. 171.843311
  85. 172.574492
  86. 173.473265
  87. 173.473265
  88. 173.473218
  89. 172.517356
  90. 172.517356
  91. 173.350796
  92. 173.350796
  93. 172.78553
  94. 171.636837
  95. 171.239581
  96. 171.883078
  97. 172.842108
  98. 173.230795
  99. 173.230749
  100. 173.230749
  101. 173.230749
  102. 173.230749
  103. 173.230795
  104. 173.230795
  105. 172.609789
  106. 172.17244
  107. 172.172394
  108. 172.17244
  109. 172.733702
  110. 172.733702
  111. 172.733702
  112. 172.733702
  113. 172.733702
  114. 173.592195
  115. 174.379861
  116. 174.379814
  117. 173.346885
  118. 172.544084
  119. 172.544038
  120. 172.544038
  121. 172.544038
  122. 172.544084
  123. 172.544084
  124. 172.544084
  125. 172.544084
  126. 172.544084
  127. 173.18842
  128. 173.805328
  129. 173.805328
  130. 173.805328
  131. 172.809465
  132. 171.848945
  133. 171.848899
  134. 171.848945
  135. 172.993261
  136. 172.993261
  137. 172.993261
  138. 172.993215
  139. 172.993215
  140. 172.993215
  141. 173.677737
  142. 174.200721
  143. 174.200721
  144. 173.385721
  145. 172.017701
  146. 170.969684
  147. 170.969684
  148. 172.25733
  149. 173.670985
  150. 174.083654
  151. 173.468422
  152. 172.864972
  153. 172.864925
  154. 172.864972
  155. 173.31643
  156. 173.830055
  157. 173.830055
  158. 173.428981
  159. 172.186317
  160. 171.21355
  161. 171.21355
  162. 172.331929
  163. 173.667306
  164. 174.206914
  165. 173.75187
  166. 173.112657
  167. 173.11261
  168. 173.11261
  169. 173.11261
  170. 173.11261
  171. 173.11261
  172. 172.651373
  173. 171.613134
  174. 170.940394
  175. 170.940394
  176. 172.149437
  177. 173.238805
  178. 173.718808
  179. 173.718762
  180. 173.325557
  181. 173.325511
  182. 173.325511
  183. 173.325511
  184. 173.325511
  185. 172.949489
  186. 172.086433
  187. 171.246985
  188. 171.246985
  189. 172.558567
  190. 173.577713
  191. 173.577713
  192. 173.577666
  193. 172.966532
  194. 172.966532
  195. 172.966532
  196. 172.966532
  197. 172.966532
  198. 172.966532
  199. 171.868503
  200. 171.130523
  201. 171.700446
  202. 172.975939
  203. 173.476571
  204. 172.887975
  205. 172.279822
  206. 172.279822
  207. 173.077732
  208. 173.925795
  209. 173.925795
  210. 173.549494
  211. 172.141753
  212. 171.125121
  213. 171.125121
  214. 172.627484
  215. 173.611101
  216. 173.611054
  217. 172.57086
  218. 172.570813
  219. 173.081132
  220. 173.960999
  221. 173.960999
  222. 173.960999
  223. 172.882201
  224. 172.32825
  225. 172.32825
  226. 172.732538
  227. 172.732491
  228. 172.732491
  229. 172.732491
  230. 172.732491
  231. 172.732491
  232. 173.627958
  233. 173.627958
  234. 173.627958
  235. 172.580266
  236. 171.948364
  237. 171.948317
  238. 171.948364
  239. 172.363408
  240. 172.363361
  241. 172.363361
  242. 172.363361
  243. 172.964437
  244. 173.544185
  245. 173.544185
  246. 173.544185
  247. 173.544185
  248. 172.875123
  249. 172.334444
  250. 172.334397
  251. 172.334444
  252. 172.776869
  253. 172.776822
  254. 171.961077
  255. 171.961077
  256. 173.300551
  257. 174.0498
  258. 174.049754
  259. 173.395406
  260. 173.39536
  261. 173.39536
  262. 173.39536
  263. 172.800058
  264. 172.236189
  265. 171.478232
  266. 171.478186
  267. 172.114465
  268. 173.313497
  269. 173.313497
  270. 173.31345
  271. 172.824133
  272. 173.360296
  273. 174.019486
  274. 174.019486
  275. 174.019486
  276. 172.76057
  277. 171.637908
  278. 171.637861
  279. 171.637908
  280. 172.962947
  281. 173.374545
  282. 173.374498
  283. 172.67419
  284. 172.67419
  285. 173.685886
  286. 173.685886
  287. 173.685886
  288. 173.685886
  289. 172.293419
  290. 171.702867
  291. 171.702867
  292. 172.653096
  293. 172.653096
  294. 172.653049
  295. 172.653049
  296. 172.653049
  297. 173.78456
  298. 174.372597
  299. 174.37255
  300. 173.293101
  301. 172.618451
  302. 172.618404
  303. 172.618404
  304. 172.618404
  305. 172.618404
  306. 172.241265
  307. 172.241265
  308. 172.790466
  309. 173.256313
  310. 173.70577
  311. 173.70577
  312. 173.705723
  313. 173.212681
  314. 173.212634
  315. 173.212634
  316. 173.212634
  317. 172.485644
  318. 171.991671
  319. 171.991671
  320. 172.810908
  321. 173.720624
  322. 174.147403
  323. 174.147356
  324. 173.31522
  325. 172.841409
  326. 172.841363
  327. 172.841409
  328. 173.346139
  329. 172.92928
  330. 172.001682
  331. 171.189755
  332. 171.189755
  333. 172.610115
  334. 173.755456
  335. 173.755456
  336. 173.297664
  337. 173.297618
  338. 173.297618
  339. 173.297618
  340. 173.780741
  341. 173.405977
  342. 172.415236
  343. 171.366939
  344. 171.366893
  345. 171.950972
  346. 172.947953
  347. 172.947953
  348. 172.947953
  349. 172.947906
  350. 173.414405
  351. 174.175156
  352. 174.175156
  353. 173.606165
  354. 172.828045
  355. 172.046106
  356. 171.619654
  357. 171.619654
  358. 172.516704
  359. 172.516704
  360. 172.516704
  361. 172.516657
  362. 172.516657
  363. 173.291238
  364. 173.924956
  365. 173.92491
  366. 173.078384
  367. 172.407832
  368. 172.407785
  369. 172.407785
  370. 172.407785
  371. 172.824319
  372. 172.824319
  373. 172.824273
  374. 172.340963
  375. 172.340916
  376. 173.063762
  377. 174.2539
  378. 174.825126
  379. 174.31532
  380. 173.033588
  381. 171.798561
  382. 171.344448
  383. 171.344448
  384. 172.337843
  385. 172.958709
  386. 172.958709
  387. 172.958709
  388. 172.406901
  389. 172.406854
  390. 172.843318
  391. 173.950521
  392. 174.420979
  393. 173.90484
  394. 172.826229
  395. 171.698397
  396. 170.952268
  397. 170.952268
  398. 171.997817
  399. 173.529331
  400. 174.719235
  401. 174.719235
  402. 174.201466
  403. 173.283229
  404. 172.900874
  405. 172.900874
  406. 172.900874
  407. 172.900874
  408. 172.900874
  409. 172.900828
  410. 172.900828
  411. 172.900828
  412. 172.900828
  413. 172.478659
  414. 172.478659
  415. 172.964018
  416. 173.854874
  417. 174.700748
  418. 174.700702
  419. 173.629308
  420. 172.255887
  421. 171.240699
  422. 171.240652
  423. 171.240699
  424. 172.496587
  425. 173.410866
  426. 173.806213
  427. 173.806166
  428. 173.012167
  429. 173.012121
  430. 173.456315
  431. 174.034201
  432. 174.034201
  433. 174.034201
  434. 172.935659
  435. 171.792228
  436. 171.262166
  437. 171.837863
  438. 173.102878
  439. 173.940277
  440. 173.94023
  441. 172.748929
  442. 172.748882
  443. 172.748929
  444. 173.489377
  445. 173.489377
  446. 173.489377
  447. 173.489377
  448. 172.158796
  449. 171.147706
  450. 171.147659
  451. 171.742216
  452. 173.093006
  453. 174.121978
  454. 174.121978
  455. 174.121931
  456. 173.37664
  457. 173.376594
  458. 172.886066
  459. 172.88602
  460. 172.88602
  461. 172.88602
  462. 172.88602
  463. 172.88602
  464. 172.88602
  465. 172.240008
  466. 172.239961
  467. 172.240008
  468. 173.44486
  469. 174.224656
  470. 174.224656
  471. 173.851987
  472. 172.65873
  473. 171.469571
  474. 171.040138
  475. 171.584496
  476. 172.64192
  477. 173.62861
  478. 173.62861
  479. 173.62861
  480. 172.593584
  481. 172.593538
  482. 172.593538
  483. 173.817622
  484. 174.362119
  485. 174.362073
  486. 172.985112
  487. 171.777792
  488. 171.32964
  489. 171.989668
  490. 173.197314
  491. 173.935061
  492. 173.935015
  493. 172.715029
  494. 172.264827
  495. 172.759686
  496. 173.650729
  497. 174.105121
  498. 174.105074
  499. 172.995543
  500. 171.974953
  501. 171.406288
  502. 171.406288
  503. 172.3486
  504. 173.183903
  505. 173.652917
  506. 173.652871
  507. 173.218828
  508. 172.759825
  509. 172.759825
  510. 173.402438
  511. 173.794478
  512. 173.794432
  513. 172.421569
  514. 171.281863
  515. 170.797901
  516. 171.411829
  517. 172.876008
  518. 174.134318
  519. 174.134318
  520. 173.532683
  521. 172.836706
  522. 172.836659
  523. 172.836706
  524. 172.836706
  525. 172.836706
  526. 172.836706
  527. 173.234614
  528. 173.234567
  529. 172.724482
  530. 172.276422
  531. 172.276376
  532. 172.276376
  533. 173.118897
  534. 173.916901
  535. 173.916901
  536. 174.335763
  537. 173.929241
  538. 172.793446
  539. 171.480374
  540. 171.026075
  541. 171.781564
  542. 173.083553
  543. 173.892733
  544. 173.892686
  545. 173.182134
  546. 172.738964
  547. 172.738917
  548. 172.738964
  549. 173.576362
  550. 174.11178
  551. 174.11178
  552. 173.331797
  553. 172.000332
  554. 171.117298
  555. 171.117298
  556. 172.374304
  557. 173.535524
  558. 173.535524
  559. 173.535477
  560. 172.591675
  561. 172.591675
  562. 173.30111
  563. 174.105354
  564. 174.105354
  565. 173.692638
  566. 172.142033
  567. 171.09164
  568. 171.09164
  569. 172.632514
  570. 173.839414
  571. 173.839414
  572. 173.839368
  573. 172.732864
  574. 172.732817
  575. 173.115684
  576. 173.80612
  577. 173.806073
  578. 173.009234
  579. 172.030786
  580. 171.491457
  581. 171.491457
  582. 172.046339
  583. 172.857009
  584. 173.489144
  585. 173.489144
  586. 173.489144
  587. 173.489144
  588. 173.489144
  589. 173.489144
  590. 173.983676
  591. 173.983676
  592. 173.4511
  593. 172.301522
  594. 171.325449
  595. 171.325449
  596. 172.304269
  597. 173.487095
  598. 174.15192
  599. 174.151873
  600. 173.123367
  601. 172.626553
  602. 172.626553
  603. 173.716433
  604. 173.716433
  605. 173.716433
  606. 172.671769
  607. 172.002008
  608. 172.001962
  609. 172.002008
  610. 173.322763
  611. 174.04058
  612. 174.04058
  613. 174.040534
  614. 173.575617
  615. 173.082063
  616. 172.505155
  617. 172.505109
  618. 172.505155
  619. 173.106091
  620. 173.106045
  621. 172.350649
  622. 172.350602
  623. 172.350602
  624. 173.547864
  625. 174.229313
  626. 174.229266
  627. 173.301902
  628. 172.821572
  629. 172.821572
  630. 172.821572
  631. 172.821572
  632. 172.821572
  633. 172.166899
  634. 172.166852
  635. 172.166852
  636. 172.635121
  637. 173.27317
  638. 173.27317
  639. 173.27317
  640. 173.27317
  641. 173.27317
  642. 173.27317
  643. 173.27317
  644. 173.27317
  645. 173.273124
  646. 172.534958
  647. 171.92224
  648. 171.922194
  649. 172.351301
  650. 173.303438
  651. 173.906051
  652. 173.906004
  653. 172.839919
  654. 172.839873
  655. 172.839873
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入98汤圆

发表于 2023-12-13 23:14:51 | 显示全部楼层
IIR低通滤波就行,阶数和建立时间自己调试平衡一下
等效的低通滤波算法还有均值滤波,中值滤波啥的
再复杂一点用扩展卡尔曼滤波也可以

出0入9汤圆

发表于 2023-12-13 23:56:29 | 显示全部楼层
如果要速度可以考虑硬件加滤波器。用python跑了下16和32滤波的波形如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入60汤圆

发表于 2023-12-14 00:21:54 | 显示全部楼层
本帖最后由 Bunny_Girl 于 2023-12-14 09:01 编辑

按楼主位的数据,13点的均值滤波加28点的均值滤波,就能滤掉大部分了



客户想要的是完全的直流???这是模拟量啊,再怎么滤都会有波形的吧
完全直流就都是一个值?还是阶跃那样的?

如果噪声类型是缓变的,可以定期抽取小部分数据做一下简单的频谱分析,以此来选择最合适的滤波器以及滤波参数
或者是否已知噪声类型?
看楼主位的数据,明显噪声主要在基波上,其次是2次谐波,而且基波是比较纯的,2次谐波就比较泛了(不过中心频率还是能看出是噪声基波的2倍,勉强算是2次谐波吧)
单单从时域上看,就能看到客户想要除去的噪声具有明显的周期性

也许客户需要的是高频滤波+欠采样+插值的效果
就是在滤除了大部分的高频噪声后,降低采样率,再直接插值,这样自然就“直”了
最简单的插值,直接用过采样点的值去插

++++++
再说直白点:
先进行合适的高频滤波,掐掉大部分高频噪声,可以定期进行自适应的滤波参数调整
然后,按N点分段,比如128点,取这128点的均值,直接代替分段内所有128点的值(这样就直啦)
(效果在6楼)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2023-12-14 00:38:14 来自手机 | 显示全部楼层
仿佛记得电路或信号与系统学过,但是全忘了

出0入60汤圆

发表于 2023-12-14 01:51:32 | 显示全部楼层
想要的是完全直流还是阶跃的?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出50入135汤圆

发表于 2023-12-14 04:31:33 来自手机 | 显示全部楼层
Bunny_Girl 发表于 2023-12-14 01:51
想要的是完全直流还是阶跃的?
(引用自6楼)

高手,高手

出0入8汤圆

发表于 2023-12-14 09:49:01 | 显示全部楼层
Bunny_Girl 发表于 2023-12-14 00:21
按楼主位的数据,13点的均值滤波加28点的均值滤波,就能滤掉大部分了


(引用自4楼)

刮目相看啊,以为层主是混水区的,原来是懂技术的 。请教这个软件是什么软件?软件调好的效果,可以生成滤波代码吗

出0入60汤圆

发表于 2023-12-14 09:55:30 来自手机 | 显示全部楼层
本帖最后由 Bunny_Girl 于 2023-12-14 10:23 编辑
了无 发表于 2023-12-14 09:49
刮目相看啊,以为层主是混水区的,原来是懂技术的 。请教这个软件是什么软件?软件调好的效果,可 ...
(引用自8楼)


代码是昨天晚上自己写的
软件是octave,语法兼容matlab,还可以混合调用c++、c
不过没有matlab集成那么多的,比较小巧,不到100M的,我在Linux上用的,不喜欢臃肿的,我都用cli模式的(无gui,在终端里用)

经典的滤波器还是自带有的,不用自己写的
不过周期性明显的噪声信号,我习惯均值滤波(也就是滑动窗口取均值,很简单,自己写了,点位适合自己用,软件自带的也有,对齐好有点问题)
只用一个的话,对谐波滤除效果会差一些,对其它更高频的杂波效果更差,所以习惯再叠加一个
运算也简单

经典的滤波器也是不能自动生成代码的,没有matlab那些自动工具箱
不过可以自己去翻源码……

出0入60汤圆

发表于 2023-12-14 10:18:28 来自手机 | 显示全部楼层
了无 发表于 2023-12-14 09:49
刮目相看啊,以为层主是混水区的,原来是懂技术的 。请教这个软件是什么软件?软件调好的效果,可 ...
(引用自8楼)

现在一个月都未必能碰一次电脑啊
今年这小孩大人轮番生病的
去年则是小朋友各种厌学死活不上幼儿园(今年好多了,都跟班上最帅的男生是好朋友,看到好几次热聊,还是小帅哥主动的,女生好友也好多个了,所以不厌学了)
更小的时候更离不开人了

大前天晚上我自己发高烧,估计是中流感了,前天最高都39.8了,昨天好多了,白天37.5左右,前半夜37.8左右
所以刚好跟孩子隔离开几天,半夜起来喝水,状态还好,开电脑敲了会儿键盘 —— 敲完发现,体温降了0.5😲
早上起来36.9,体温稳定了,就是开始喉咙痒咳嗽了,鼻涕则是流了好几天了

出20入62汤圆

发表于 2023-12-14 10:43:00 | 显示全部楼层
看幅值是171-175跳动,直接直接把二进制后三位滤掉算了。。。
输出 = (输入 >> 3) << 3

出50入135汤圆

发表于 2023-12-14 11:35:16 来自手机 | 显示全部楼层
了无 发表于 2023-12-14 09:49
刮目相看啊,以为层主是混水区的,原来是懂技术的 。请教这个软件是什么软件?软件调好的效果,可 ...
(引用自8楼)

+1,我是也表达你说的意思,一直以为是混水区的,卧虎藏龙哈

出0入0汤圆

发表于 2023-12-14 11:50:35 | 显示全部楼层
Stm32Motor 发表于 2023-12-14 11:35
+1,我是也表达你说的意思,一直以为是混水区的,卧虎藏龙哈
(引用自12楼)

同意,以为是混水区的

出0入17汤圆

发表于 2023-12-14 13:25:59 来自手机 | 显示全部楼层
版主多年前曾经在STM32上面手搓语音识别算法,就问你们服不服

出0入22汤圆

 楼主| 发表于 2023-12-14 13:28:29 | 显示全部楼层
rclong 发表于 2023-12-13 23:14
IIR低通滤波就行,阶数和建立时间自己调试平衡一下
等效的低通滤波算法还有均值滤波,中值滤波啥的
再复杂 ...
(引用自2楼)

能具体说说操作方法吗?谢谢!

出0入22汤圆

 楼主| 发表于 2023-12-14 13:29:30 | 显示全部楼层
wanggoals 发表于 2023-12-13 23:56
如果要速度可以考虑硬件加滤波器。用python跑了下16和32滤波的波形如下:
(引用自3楼)

客户方要求滤波后的数值跳动在±0.05,所以要求比较高。

出0入22汤圆

 楼主| 发表于 2023-12-14 13:30:26 | 显示全部楼层
本帖最后由 zxq6 于 2023-12-14 13:33 编辑
Bunny_Girl 发表于 2023-12-14 01:51
想要的是完全直流还是阶跃的?
(引用自6楼)


谢谢耐心帮忙实验,客户方要求过滤完的数据跳动范围±0.05。
也就是在250个数据点的范围内,数值的最大值减去最小值,绝对值不能大于0.1。

出0入22汤圆

 楼主| 发表于 2023-12-14 13:31:45 | 显示全部楼层
本帖最后由 zxq6 于 2023-12-14 13:33 编辑
天下乌鸦一般黑 发表于 2023-12-14 10:43
看幅值是171-175跳动,直接直接把二进制后三位滤掉算了。。。
输出 = (输入 >> 3)  ...
(引用自11楼)


如果能够这么简单的实现就好了,滤波的同时还需要数据输出的连续性,不能有很大的阶跃。

出20入62汤圆

发表于 2023-12-14 14:07:44 | 显示全部楼层
zxq6 发表于 2023-12-14 13:31
如果能够这么简单的实现就好了,滤波的同时还需要数据输出的连续性,不能有很大的阶跃。 ...
(引用自18楼)

是不是客户只对静态有要求,动态就无所谓了啊?

出0入98汤圆

发表于 2023-12-14 14:27:01 | 显示全部楼层
zxq6 发表于 2023-12-14 13:31
如果能够这么简单的实现就好了,滤波的同时还需要数据输出的连续性,不能有很大的阶跃。 ...
(引用自18楼)

楼里提到的其他算法和这个方法大致都是等效的,
用了平滑之后,阶跃输入也会被平衡(低通滤波的效果)

最简单的写法
out = lastout*0.9 + in*0.1;
lastout = out;

更多的可以在网上搜索一下IIR低通滤波算法,或者让AI给你写一个。

出300入477汤圆

发表于 2023-12-14 14:29:01 | 显示全部楼层
本帖最后由 redroof 于 2023-12-14 14:34 编辑
天下乌鸦一般黑 发表于 2023-12-14 14:07
是不是客户只对静态有要求,动态就无所谓了啊?
(引用自19楼)


哈哈,想想莫大之前见到的那个新款的耳温枪的算法吧。。
对付乱提要求的客户,这是最好的办法~~

实际采到的数字是173,跳动范围4,想把跳动范围压到0.1
不损失别的东西是基本上不可能办到的

允许损失某些东西,用那个耳温枪的算法,倒是没问题。实际上就是内部用上面任何一种滤波算法,得出一个真实的平均值,然后再记录一个上次输出值。
内部设定一个误差范围,如果真实值和上次输出值的差小于误差范围,就保持上次输出值不变。
真实值和上次输出值的差大于误差范围,输出值就变成当前的最新值,然后重复上面的流程。
只要你的误差范围稍微大一点,不管输入数据跳的再多,输出也不会跳

出0入98汤圆

发表于 2023-12-14 14:32:38 | 显示全部楼层
我用阿里的通义千问写了一个

我的提问是:“用C语言写一个IIR二阶低通滤波器,截止频率是采样频率的1/200,通带部分增益0dB。”

它的回答是:

这是一个二阶Butterworth低通滤波器的设计。以下是C语言的实现代码:

```c
#include <math.h>

#define PI 3.14159265

// 计算butterworth滤波器系数
void butterworthCoeffs(float sampleFreq, float cutoffFreq, float* b0, float* b1, float* b2, float* a1, float* a2) {
    float wc = 2 * PI * cutoffFreq / sampleFreq;
    float wa = tan(wc/2);
    float g = 1 / sqrt(2);

    *b0 = 1 / (1 + wa*wa);
    *b1 = 2 * (*b0);
    *b2 = *b0;
    *a1 = -2 * cos(wc);
    *a2 = 1 - (2 / (1 + wa*wa));
}

// 滤波器函数
float iirFilter(float input, float* output, float* b0, float* b1, float* b2, float* a1, float* a2) {
    static float x1 = 0, x2 = 0, y1 = 0, y2 = 0;

    // Direct Form II Transposed
    float outputTemp = *b0 * input + *b1 * x1 + *b2 * x2 - *a1 * y1 - *a2 * y2;
    x2 = x1;
    x1 = input;
    y2 = y1;
    y1 = outputTemp;

    return outputTemp;
}

int main() {
    float sampleFreq = 8000; // 采样频率
    float cutoffFreq = sampleFreq / 200; // 截止频率

    float b0, b1, b2, a1, a2;
    butterworthCoeffs(sampleFreq, cutoffFreq, &b0, &b1, &b2, &a1, &a2);

    float input, output;
    while(1) {
        scanf("%f", &input);
        output = iirFilter(input, &output, &b0, &b1, &b2, &a1, &a2);
        printf("%f\n", output);
    }

    return 0;
}
```

在这个代码中,我们首先计算了Butterworth滤波器的系数,然后在主函数中使用这些系数对输入信号进行滤波。注意,这个滤波器是无限脉冲响应(IIR)滤波器,它会记住一些过去的输入和输出值以用于当前的计算。这就是为什么我们需要一些静态变量来存储这些值。

这个程序是一个无限循环,你可以在控制台上输入一个浮点数,它将被滤波并打印出来。你可以通过修改`sampleFreq`和`cutoffFreq`的值来改变采样频率和截止频率。

出0入22汤圆

 楼主| 发表于 2023-12-14 14:33:36 | 显示全部楼层
天下乌鸦一般黑 发表于 2023-12-14 14:07
是不是客户只对静态有要求,动态就无所谓了啊?
(引用自19楼)

动态也有要求啊,不然可就简单了,动态要求在信号突变后,0.5秒达到变化后信号的99%。
亦即当从0v跳到2.5V,则我的AD值也需要在0.5秒内达到2.475V.
提供的数据采样率是50Hz

出0入22汤圆

 楼主| 发表于 2023-12-14 14:34:35 | 显示全部楼层
rclong 发表于 2023-12-14 14:27
楼里提到的其他算法和这个方法大致都是等效的,
用了平滑之后,阶跃输入也会被平衡(低通滤波的效果)

(引用自20楼)

谢谢,这也是一个思路。我去研究一下。

出0入22汤圆

 楼主| 发表于 2023-12-14 14:35:03 | 显示全部楼层
redroof 发表于 2023-12-14 14:29
哈哈,想想莫大之前见到的那个新款的耳温枪的算法吧。。
对付乱提要求的客户,这是最好的办法~~

(引用自21楼)

这个,额,客户需要严格检测的。估计是不能通过测试。

出300入477汤圆

发表于 2023-12-14 14:36:45 | 显示全部楼层
zxq6 发表于 2023-12-14 14:34
谢谢,这也是一个思路。我去研究一下。
(引用自24楼)

看你的输入值,我认为作假是最好的办法。
作假方法我上面说了。
采样率50,然后延迟允许0.5秒,所以你用最近20个点滤波得到真实值就行。作假值和真实值之间的允许偏差自己去实测。

出300入477汤圆

发表于 2023-12-14 14:42:05 | 显示全部楼层
zxq6 发表于 2023-12-14 14:35
这个,额,客户需要严格检测的。估计是不能通过测试。
(引用自25楼)

正规做法的真实值基本上不太可能达到提要求的稳定度。
楼上有版主算的32点滤波的结果。明显那个结果还是离要求的稳定度差很多。
更长的点数那么延迟就很高了。
所以不用费事了
除非误差来自于你的采样电路,你把采样电路做得更好一点或许可以

出0入0汤圆

发表于 2023-12-14 14:46:47 | 显示全部楼层
一阶,或是二阶滤波电路可以试试。电路也容易实现。

出40入518汤圆

发表于 2023-12-14 14:54:55 | 显示全部楼层
廉价体重秤算法:如果跟上一次体重相差不超过x,就显示上一次体重?

出0入22汤圆

 楼主| 发表于 2023-12-14 14:56:52 | 显示全部楼层
redroof 发表于 2023-12-14 14:42
正规做法的真实值基本上不太可能达到提要求的稳定度。
楼上有版主算的32点滤波的结果。明显那个结果还是 ...
(引用自27楼)

硬件上目前把该想的办法已经想完了。
比如:模拟地和数字地分开
采用4层板结构
供电采用低噪声LDO
信号滤波电容使用低噪声电容
AD使用低噪声参考
模拟部分使用屏蔽罩
数字部分和模拟部分分开布局
尽量在一个稳定的空间做测试
等等。

目前我能够想到的方法也只有作假。但是这个也没有好的实施思路。
输入部分可能会有缓慢变化,万一线性变化的时候,采集到的数据突然跳一下,就露馅了。

出0入60汤圆

发表于 2023-12-14 15:11:31 来自手机 | 显示全部楼层
本帖最后由 Bunny_Girl 于 2023-12-14 15:45 编辑
zxq6 发表于 2023-12-14 14:56
硬件上目前把该想的办法已经想完了。
比如:模拟地和数字地分开
采用4层板结构

(引用自30楼)


又当又立的要求……

需要平滑且波动范围有限的滤波
滤波参数需要自适应调整,而调整的过程也得足够平滑……好在允许有延时
免不了需要插值(插值就是造假了,只是看着像真的,跟真实值也有关联)

也就是说,要做的不是滤波,而是插值
只不过插值需要用滤波后原始数据以及N点内的波动幅度作自适应参数
而客户的要求就是波动范围不能超标、延时不能超标,能允许的运算量貌似也很有限

出0入60汤圆

发表于 2023-12-14 16:02:59 来自手机 | 显示全部楼层
本帖最后由 Bunny_Girl 于 2023-12-14 16:04 编辑
zxq6 发表于 2023-12-14 14:56
硬件上目前把该想的办法已经想完了。
比如:模拟地和数字地分开
采用4层板结构

(引用自30楼)


楼主位的数据均值大约173左右,实际采样到的数据可能会有缓变,比如2秒内从100升到200,这样么?

出0入60汤圆

发表于 2023-12-14 17:09:21 | 显示全部楼层
本帖最后由 Bunny_Girl 于 2023-12-14 17:41 编辑
zxq6 发表于 2023-12-14 14:56
硬件上目前把该想的办法已经想完了。
比如:模拟地和数字地分开
采用4层板结构
(引用自30楼)


类似这样的小波动的么?


刚好波动没超标,没做调整没做插值,只是滤波的结果
有缓变幅度大的么数据么?

其实均值滤波,8点跟128点甚至512点是差不多开销的,因为窗口每滑动一点,都是移除最旧的一点,加入最新的一点,更新变动的都是两个点的值
只不过点数越多,需要的内存量越大(得存得下那么多个点的值),第一个值得老老实实算出来,从第二个点开始就只需要更新新旧两个点的运算量了
还有其它效率高的滤波方式,哪个划算用哪个

250点内局部波动超标的点,局部小范围处理,不计较曲线是否光滑的话直接改,替换成跟周边点近似的不超标的点
如果要求曲线光滑,可以上三次曲线插值

如果波动超标点太多,可以动态调整滤波器,过渡阶段稍加处理

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入22汤圆

 楼主| 发表于 2023-12-14 18:10:11 | 显示全部楼层
本帖最后由 zxq6 于 2023-12-14 19:14 编辑
Bunny_Girl 发表于 2023-12-14 17:09
类似这样的小波动的么?


(引用自33楼)


这里第二列有缓慢变化的数据,也有阶跃数据。


非常感谢提供的思路和例程!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入60汤圆

发表于 2023-12-14 19:22:19 | 显示全部楼层
zxq6 发表于 2023-12-14 18:10
这里第二列有缓慢变化的数据,也有阶跃数据。


(引用自34楼)


打开看到有4列数据,第2列第一个数据接在第1列最后一个数据后面么?以此类推?
还是这里面存的是4个信号的数据?

……

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入22汤圆

 楼主| 发表于 2023-12-14 19:24:17 | 显示全部楼层
Bunny_Girl 发表于 2023-12-14 19:22
打开看到有4列数据,第2列第一个数据接在第1列最后一个数据后面么?以此类推?
还是这里面存的是4个信号 ...
(引用自35楼)

不是的,每一列数据单独从传感器出来的,在这里跟其他列无关。

出0入60汤圆

发表于 2023-12-14 19:26:18 | 显示全部楼层
本帖最后由 Bunny_Girl 于 2023-12-14 19:58 编辑
zxq6 发表于 2023-12-14 19:24
不是的,每一列数据单独从传感器出来的,在这里跟其他列无关。
(引用自36楼)


就是4个不同时间片段采样的数据吧?

++++++
导入进来看到了,有几处阶跃相当的大啊
除了最后一列,其它列都有相当大的阶跃,最大的差值都有248.22了
这样就无法满足250点内波动幅度0.1以内了,否则就得明显严重失真的
是否这种阶跃其实是客户希望保留的,而不是想要滤除的噪声?
换句话说,其实客户想要保留的是单纯的直线段组成的信号,直线段可以是水平的,可以是斜的,(垂直的不可能,只可能是近似于垂直的斜线段),而其余的成分都是不想要的噪声
采样率是50hz,那么在这份数据中,相邻的有效阶跃的时间差最短的也有10秒左右(约500个采样点),而客户要求250点内(也就是5秒)波动幅度不超过0.1,所以其实是不是有效阶跃的相邻时间间隔至少是1秒以上的(10秒的1/10,5秒的1/5)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入22汤圆

 楼主| 发表于 2023-12-14 20:03:18 | 显示全部楼层
Bunny_Girl 发表于 2023-12-14 19:26
就是4个不同时间片段采样的数据吧?

++++++
(引用自37楼)

这个阶跃信号是需要保留的,而且对这个阶跃的陡峭程度有要求,比如上升沿,需要在10个点内达到上升后值的99.5%。

出0入60汤圆

发表于 2023-12-14 20:14:11 | 显示全部楼层
本帖最后由 Bunny_Girl 于 2023-12-14 20:42 编辑
zxq6 发表于 2023-12-14 20:03
这个阶跃信号是需要保留的,而且对这个阶跃的陡峭程度有要求,比如上升沿,需要在10个点内达到上升后值的 ...
(引用自38楼)


那就是我上面推测的了
以上面数据为例(不画图了)
红色的,应该是一条小坡度的正值的斜线,中间突然有一段突变成了负值,并且负值部分是水平的
蓝色的,也是一条小坡度的正值的斜线,中间突然……(同上)……
黄色的,也是……(同上)……
紫色那条应该是完全水平的,估计是无信号的状态,理想值应该是0,实际值是相对于信号非常微小的负值(运放之类的?)
以上就是客户想要保留的有效信号成分,其余统统都是噪声不要的,并且阶跃的部分得足够陡峭(比如上升沿,需要在10个点内达到上升后值的99.5%;而理想状态,斜率应该是无穷大的)
没错吧?

终于理解楼主位说的客户只要的“直流”是怎么回事了😲
更像是类似示波器那样的,而不是新版的博朗耳温枪

噪声基本都是硬件噪声…… 所以当然是不要的……
上面这4组的频域看过了,大体上是白噪声和1/f噪声(有点忘了,好像是叫粉红噪声?),不过又混着很微小的类周期噪声(这里很小,几乎忽略不计),很常见的硬件噪声
而楼主位的数据中,周期性的噪声就很强了
这种类周期性的噪声是哪种器件产生的么?频率很低的,只有4hz左右

出0入22汤圆

 楼主| 发表于 2023-12-14 20:47:36 来自手机 | 显示全部楼层
目前不确定是什么东西产生的,换算成电压,噪声只有2-300个uv。因为我们采集的是客户的信号调理版过来的电压信号。目前出来的数据就有这样的噪声。

出0入60汤圆

发表于 2023-12-14 21:26:29 来自手机 | 显示全部楼层
本帖最后由 Bunny_Girl 于 2023-12-14 21:27 编辑
zxq6 发表于 2023-12-14 20:47
目前不确定是什么东西产生的,换算成电压,噪声只有2-300个uv。因为我们采集的是客户的信号调理版过来的电 ...
(引用自40楼)


无所谓了


我觉得,思路方向就不是滤波了,更不是造假,而是“求真”

首先,检测出“有效阶跃”的位置,进而完成分段工作 —— 分出【阶跃段】 和 【平稳段】
检测的依据就是信号数据相邻两点的差值,matlab中直接用自带方法diff即可得到

接着,依据每个分段内的真实采样数据以及分段的类型,拟合出理想信号
平稳段,理想的是只有一个斜率的斜线,拟合的参数就是斜率、起点、终点,需要从真实采样数据中近似出来
阶跃段,就是差值极大的两点,加上两边的过渡,连接上相邻的平稳段

然后,把真实采样信号x减去理想信号y,得出差值信号r
再根据客户的要求,对r进行修饰
既要满足客户的要求底线,又得保留足够的真实成分 —— 就好像女生美颜修图,既要好看减少瑕疵,又要看不出来美颜过;既要化妆气色好瑕疵少,又要看不出化妆过
r修饰过得到s

最后,y+s,就是客户想要看到的结果了

出0入37汤圆

发表于 2023-12-14 22:44:42 | 显示全部楼层
几个方法结合起来
1、划窗均值滤波,所谓划窗就是1----n均值,然后2----n+1均值,依次类推,n就是窗口,n越大,约平滑,而且数据也一直在更新不存在实时性差的问题,缺点是对数据变化不敏感,一些检测空气质量,测环境温度的仪表这么做,前提是数据的真值变化比较慢而测得值比较离散,比如环境温度,同样提到阿莫的耳温枪,如果关机再开,然后测量,结果更真实,保持开机状态,测温会有各种数据处理的狠办法来让结果看上去很稳定,因为数字温度传感器本身的一致性就比较差,他所谓的精度事实上是灵敏度,很多人把这两个词弄混,灵敏度是最小刻度或者说最后一位有效位,精度是测量值的绝对误差和真值的比值,一些本身精度不高的传感器,把有效位数弄的很多,其实根本达不到,比如一些24位的AD,多半后几位不可靠。
2、划窗中值滤波,还是划窗,但是不是求均值了,而是求中值,或者求N个中值,然后求均值,缺点如上,同时需要排序,运算量更大一些,但是能排除马爸爸的收入跟我们平均这种情况。
3、用一个叫贝塞尔公式的东东求若干个数据的标准差(标准差反应的是数据的分散程度),然后用均值加减n倍的标准差(一般n取3)为标准把跳动过大的数据踢出去,然后剩下的再来一把,直到没有大过三倍标准差的数据,剩下的数据求平均值,这个平均值比较可靠。
以上几个方法组合使用,解决绝大多数问题

还有就是FIR或者iir这些方法不适用这个项目。这些方法本质上是通过滤波器求信号的直流分量而这个直流分量就是均值,和直接求均值差不了太多,运算量还大了很多。

靠谱的是划窗和标准差。

出0入22汤圆

 楼主| 发表于 2023-12-14 22:45:32 | 显示全部楼层

理论上,有效信号的斜率并不固定。而且在不同的时刻可能不一样。只是样本这个信号特例了。
类似正弦信号,在很短一段x范围内,可能可以近似看成斜线,但是当x范围到一定程度的时候,就不是了。
我正在消化您提供的信息。非常感谢。

出0入60汤圆

发表于 2023-12-15 00:10:23 来自手机 | 显示全部楼层
本帖最后由 Bunny_Girl 于 2023-12-15 00:20 编辑
zxq6 发表于 2023-12-14 22:45
理论上,有效信号的斜率并不固定。而且在不同的时刻可能不一样。只是样本这个信号特例了。
类似正弦信号 ...

(引用自43楼)


这样啊,原来只是冰山一角

上面你给的数据约3000点,采样率50hz,所以就是约60s
也就是说,在60s的窗口里,每个分段内的信号的斜率都很接近(上面说的平稳段和阶跃段)
然后现在知道了,60s只是冰山一角,在更长的窗口里看就是类正弦的信号了,信号斜率是变化的

上面层的思路依然有用
第一步依然是分段,阶跃段除外的其它信号部分,它们的理想型就可以近似为斜率连续的n段三次曲线的组合(搜一下三次曲线差值就知道了),算是【连续段】
不过不需要去作插值
简单地对【连续段】内的数据做低通滤波即可,然后再根据客户的波动幅度限制要求进行修饰
而【阶跃段】,不作低通滤波,陡峭又干净利落地跟【连续段】过渡连接起来,根据客户的要求修饰好(客户要求足够陡峭)

既然信号缓变的速度比较慢,具体信号什么类型也不确定
那么就可以定期取样分析,判断是哪种类型的曲线(直线也是特殊的曲线)或者线段组(比如三次曲线组+不定时的阶跃),然后套用相应的处理方法
定期取样的周期可以很长的,比如远大于60s(远大于3000点),而且需要分析的数据是大比例欠采样的数据(比如3000点才取1点),所以运算量很小的

出10入95汤圆

发表于 2023-12-15 09:03:20 | 显示全部楼层
Bunny_Girl 发表于 2023-12-14 01:51
想要的是完全直流还是阶跃的?
(引用自6楼)

请教版主: 红线是经过了什么运算得出的?

出0入60汤圆

发表于 2023-12-15 09:43:09 来自手机 | 显示全部楼层
ddcour 发表于 2023-12-15 09:03
请教版主: 红线是经过了什么运算得出的?
(引用自45楼)


楼主需要的不是红线这种效果,我没理解对,他也没表达好(上面最新的楼层已经get到了,你看44楼)

只问这个红线的话,很简单,就是在绿线的基础上,按128点分段,每段取平均值,直接把这个平均值赋值给段内每一个点

出420入0汤圆

发表于 2023-12-15 10:30:51 | 显示全部楼层
难得技术贴

出0入22汤圆

 楼主| 发表于 2023-12-15 10:50:48 | 显示全部楼层
Bunny_Girl 发表于 2023-12-15 00:10
这样啊,原来只是冰山一角

上面你给的数据约3000点,采样率50hz,所以就是约60s
(引用自44楼)

非常感谢详细解答,正在消化中。
看来只能用类似的方法来实现了。

出75入8汤圆

发表于 2023-12-15 10:55:10 | 显示全部楼层
Bunny_Girl 发表于 2023-12-14 10:18
现在一个月都未必能碰一次电脑啊
今年这小孩大人轮番生病的
去年则是小朋友各种厌学死活不上幼儿园(今年 ...
(引用自10楼)

这次发烧也很厉害,症状和阳了一样,而且感觉比上次更严重,我很久没咳嗽了, 之前就是冷了没注意防护咳嗽,这次直接病毒引起咳嗽,一个多月才好,而且带喘的那种,所以大家要注意。

出0入60汤圆

发表于 2023-12-15 11:07:49 来自手机 | 显示全部楼层
本帖最后由 Bunny_Girl 于 2023-12-15 11:11 编辑
ZHAOBAO511 发表于 2023-12-15 10:55
这次发烧也很厉害,症状和阳了一样,而且感觉比上次更严重,我很久没咳嗽了, 之前就是冷了没注意防护咳 ...
(引用自49楼)


周二晚上开始就退烧了,周三傍晚到睡前一点低烧
昨天周四就体温都正常了,但是开始咳嗽
昨天晚上开始咳得厉害,现在也是咳得厉害
鼻涕倒是从黄鼻涕转为清鼻涕了

6月份我也是高烧退烧后咳了3个星期,挂呼吸内科,医生听诊也没事的
我是5月20号首阳的,520那一天……

去年有一次,也是感冒之后狂咳了一个月……

都是喉咙痒起来咳嗽的
试过两三次喝右美沙芬,都得更要命,狂想咳但是没法咳出来,非常痛苦的,不敢不敢了,不适合我

出75入8汤圆

发表于 2023-12-15 11:31:51 | 显示全部楼层
Bunny_Girl 发表于 2023-12-15 11:07
周二晚上开始就退烧了,周三傍晚到睡前一点低烧
昨天周四就体温都正常了,但是开始咳嗽
昨天晚上开始咳得 ...
(引用自50楼)

应该是病毒引起的气管炎,不行就输液,能抗的话吃药。

出0入42汤圆

发表于 2023-12-15 19:44:58 | 显示全部楼层
lz, 要不你告诉咱, 原始信号到底是啥鬼玩意. 拿一段一段数据来搞滤波器有点吃力.
比如是压力应变片? 雷达回波?还是啥的

出0入22汤圆

 楼主| 发表于 2023-12-15 20:27:07 来自手机 | 显示全部楼层
albert_w 发表于 2023-12-15 19:44
lz, 要不你告诉咱, 原始信号到底是啥鬼玩意. 拿一段一段数据来搞滤波器有点吃力.
比如是压力应变片? 雷达 ...

(引用自52楼)

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

本版积分规则

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

GMT+8, 2024-5-4 15:49

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

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