OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2622|回复: 2

stm32h743 dsp库中的lms函数

[复制链接]

5

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2019-7-22
在线时间
43 小时
发表于 2020-2-9 21:23:28 | 显示全部楼层 |阅读模式
10金钱
有没有 用过dsp库的arm_lms_f32  函数的 我用了一下 为什么输出都是0 是哪里写错了吗
附上 部分代码
#include "sys.h"
#include "delay.h"
#include "arm_math.h"


#define TEST_LENGTH_SAMPLES  320    /* 采样点数 */
#define PI2   6.28318530717959f
#define BLOCK_SIZE           32   //调用一次处理的采样点个数
#define NUM_TAPS              29  /* 滤波器系数个数 */


float Ts=0.0001;//采样时间Ts=0.1ms
float Fs=10000;//对应的采样频率Fs=10KHz
static float u=0.01;  //步长参数

int N_iden;
int n_iden;

float32_t DESIRE_dn[TEST_LENGTH_SAMPLES]; //模拟AD采集过来的信号,lms的期望信号dn,经过系统之后的输出信号
float32_t INPUT_xn[TEST_LENGTH_SAMPLES]; //输入到系统的信号,xn
float32_t OUTPUT_yn[TEST_LENGTH_SAMPLES]; //输出的信号,yn
float32_t ERROR_en[TEST_LENGTH_SAMPLES]; //误差信号,en

static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1]; //状态缓存


//wn
const float32_t firCoeffs32[NUM_TAPS] = {1};

uint32_t blockSize = BLOCK_SIZE;
uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE; /* 需要调用arm_fir_f32的次数 */



// 正弦波产生          
void Produce_sin(u16 FRE,float Ts) //位数 频率 采样时间
  {
     u16 i=0;
     float temp; //计算得到的sin值
//         uint16_t SINGLE[TEST_LENGTH_SAMPLES];//未变换之前的取整sin值
          
     for(i=0;i<TEST_LENGTH_SAMPLES;i++)
      {  
       temp=i*Ts*FRE*PI2;
                  
                 DESIRE_dn[i]=sin(temp);
                  
//       SINGLE[i]=(uint16_t)(sin(temp));
//                  
//       DESIRE_dn[i]= (2^width)/2+(sin(temp)*((2^(width)/2) - 1));

      }
  }


   void Produce_sin_noise(u16 FRE1,float  Ts,u16 FRE2) //位数 频率 采样时间
  {
     u16 i=0;
     float temp1,temp; //计算得到的sin值
//         uint16_t SINGLE[TEST_LENGTH_SAMPLES];//未变换之前的取整sin值
          
     for(i=0;i<TEST_LENGTH_SAMPLES;i++)
      {  
       temp=i*Ts*FRE1*PI2;
                  
           temp1=i*Ts*FRE2*PI2;
                  
           INPUT_xn[i]=sin(temp)+sin(temp1);
                  
//       SINGLE[i]=(uint16_t)(sin(temp)+sin(temp1));
//                  
//       INPUT_xn[i]= (2^width)/2+((sin(temp)+sin(temp1))*((2^(width)/2) - 1));

      }
  }



int main(void)
{
  uint32_t i;
  arm_lms_instance_f32 S;
  float32_t  *inputF32, *outputF32, *desireF32,*errorF32;
       
  N_iden=16000;
  Produce_sin(1000,Ts);
  Produce_sin_noise(1000,Ts,6000);       

  inputF32 = &INPUT_xn[0];
  outputF32 = &OUTPUT_yn[0];
  desireF32 = &DESIRE_dn[0];
  errorF32 = &ERROR_en[0];
       
//        Cache_Enable();                                        //打开L1-Cache
//        HAL_Init();                                                        //初始化HAL库
//        Stm32_Clock_Init(160,5,2,4);                      //设置时钟,400Mhz
//        delay_init(400);                                                //延时初始化
       

  arm_lms_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], blockSize,u);

   while(n_iden<N_iden)
   {
        for(i=0; i < numBlocks; i++)
       {
         arm_lms_f32(&S, inputF32 + (i * blockSize), desireF32 + (i * blockSize),outputF32+ (i * blockSize) ,errorF32 + (i * blockSize),blockSize);
       }
           n_iden++;
  }

  while (1);                          
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-7-13
在线时间
11 小时
发表于 2020-3-1 18:08:43 | 显示全部楼层
arm_lms_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], blockSize,u);最后两个参数是不是反了?
回复

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-7-13
在线时间
11 小时
发表于 2020-3-1 19:57:04 | 显示全部楼层
while(n_iden<N_iden)这个是用来干嘛的?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-7 15:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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