你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G474 lms自适应滤波算法

[复制链接]
XH750507 提问时间:2023-8-9 15:28 / 未解决

有一个直流电压 1.65v,用ADC进行单端采样,电源噪声50mV引起数据波动较大,大约有几十mV

如果用64数据做平均值,可获得3mV的跳动。

如果使用LMS自适应滤波算法,将参考数据设定到一个固定值,似乎结果可以偏向这个设定值,但数据依然跳动很大,请教大神,是何原因?

收藏 评论9 发布时间:2023-8-9 15:28

举报

9个回答
yr 回答时间:2023-9-8 22:23:32

事例展示的是变动滤波器系数的过程,处理的数据一帧一帧的方式,针对2个谐波的数据,采用的是第一组系数,过滤掉2个谱线的噪声,针对3个噪声的数据,假如能自适应算出新的系数,比如分析fft等再求出系数,那么用新的系数滤除带有3个谱线噪声的数据,体现自适应的特点。例子中设定2个数组放缓冲数据,表明在处理过程中,可以加载下一帧要处理的数据,体现协处理器的特点,两组系数怎么得到,文中未提,认为笔者可以通过其他算法计算得出,不是这里的重点。

yr 回答时间:2023-8-30 10:32:01

有个例子可以参考,网上搜AN5305有相关的文档说明

.\STM32Cube\Repository\STM32Cube_FW_G4_V1.5.1\Projects\NUCLEO-G474RE\Examples\FMAC\FMAC_Adaptive_FIR_AN5305

yr 回答时间:2023-8-21 22:20:02

可以先用matlab设计fir滤波器,利用内置的fmac外设实时滤波啊

xmshao 回答时间:2023-8-9 16:15:55
给些提醒:
1、做ADC前记得做校准;
2、采样时间在不影响性能前提下尽量设置长点;
3、电源尽量尽量稳定;
4、被测试信号脚尽量远离干扰,尽量避免旁边存在电平频繁跳变的管脚;
5、必要时做些数字滤波处理也是可以的;
XH750507 回答时间:2023-8-10 07:10:31

xmshao 发表于 2023-8-9 16:15
给些提醒:
1、做ADC前记得做校准;
2、采样时间在不影响性能前提下尽量设置长点;

干扰似乎是个周期性且有规律的 因为做平均后数据趋于稳定 一定有什么数字算法可以处理掉 将需要的数据完整的分离出来

XH750507 回答时间:2023-8-10 07:35:43

XH750507 发表于 2023-8-10 07:10
干扰似乎是个周期性且有规律的 因为做平均后数据趋于稳定 一定有什么数字算法可以处理掉 将需要的数 ...

[md]校准过

采样时间也加到247.5

示波器可以看到干扰是来自金升阳的DC-DC K7805模块 查手册刚好是50mV

想请教有什么数字算法滤波可有效分离出准确数据

XH750507 回答时间:2023-8-27 15:57:33

yr 发表于 2023-8-21 22:20
可以先用matlab设计fir滤波器,利用内置的fmac外设实时滤波啊

请教下 fir可以用自适应滤波器替换么? 或者说自适应滤波器如何使用FMAC?

XH750507 回答时间:2023-9-8 20:47:33
yr 发表于 2023-8-30 10:32
有个例子可以参考,网上搜AN5305有相关的文档说明

.\STM32Cube\Repository\STM32Cube_FW_G4_V1.5.1\Pr ...

[md]我在读这个例程,有些疑惑请教您。


  /* Fill first frame with input signal and zero the other frame */
  /* Normally samples would come from ADC or other source, in this example the */
  /* same data is reloaded from Flash */
for (Index=0; Index<ARRAY_SIZE; Index++)
  {
    aInputValues[0][Index] = TwoToneNoise[Index];
    aInputValues[1][Index] = 0;
  }
  /* generate filter coefficents (in this example they are simply read from flash */
  for (Index=0; Index<COEFF_VECTOR_B_SIZE; Index++)
  {
    aFilterCoeffB[Index] = TwoToneFilter[Index];
  }


    /* While processing is going on, fill next frame with input signal */
    /* Normally samples would come from ADC or other source, in this example the */
    /* data are loaded from Flash */
    for (Index=0; Index<ARRAY_SIZE; Index++)
    {
      aInputValues[OldFrame][Index] = ThreeToneNoise[Index];
    }
    /* Update filter coefficients for next frame */
    /* Normally this would be done by the adaptive algorithm, in this example the */
    /* coefficients are loaded from flash */
    for (Index=0; Index<COEFF_VECTOR_B_SIZE; Index++)
    {
      aFilterCoeffB[Index] = ThreeToneFilter[Index];
    }



这是例程中函数的2段参数入口。不太明白这2个参数入口的含义,也不太明白例程设置2个是为了什么呢?如果我只有一个ADC数据采集使用FMAC是否删掉其中一个就可以?如果我有3个ADC数据采集都想使用FMAC又该如何呢?
XH750507 回答时间:2023-9-9 08:06:01

yr 发表于 2023-9-8 22:23
事例展示的是变动滤波器系数的过程,处理的数据一帧一帧的方式,针对2个谐波的数据,采用的是第一组系 ...

[md]谢谢您的点拨,给我如何参考这段代码指明的方向,非常感谢您!

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版