linux做网站服务器,做seo有什么好处,南京做企业网站的公司,厦门网站建设维护arm-dsp库官方已经封装好了#xff0c;使用的时候需要把dsp库移植到工程里面#xff0c;具体怎么移植网上可以找到教程
这里直接说怎么用FIR的流程#xff1a;
一、Matlab里面生成所配置的阶数和系数
1、在Matlab命令窗口输入fdatool,回车#xff0c;会弹出一个新窗口 2…arm-dsp库官方已经封装好了使用的时候需要把dsp库移植到工程里面具体怎么移植网上可以找到教程
这里直接说怎么用FIR的流程
一、Matlab里面生成所配置的阶数和系数
1、在Matlab命令窗口输入fdatool,回车会弹出一个新窗口 2、在新窗口中的响应类型选择【低通】设计方法选择【 FIR里面的最平坦】滤波器阶数选择【指定阶 80】这里以80举例频率设置选择【Hz,Fs3200,Fc200】同样也是举例后面自己按照需求改动,选择完后点击设计滤波器并在上方【编辑】中点击【转换结构】选择【Direct-Form FIR】在点击确认 3、在上方选择【目标】中的【生成C的头文件】 改变导出类型为【单精度浮点】然后点击生成保存到文件夹中 二、在keil 写相关程序
主要是用到了dsp库里面这两个函数 我们先把要处理的数据放进一个数组我自己使用的ADC采集信号发生器发出的基频为100Hz的信号。
将ADC采集的数据转换为电压存入一个数组中
uint32_t i0;
for(i0;i256;i)
{inbuf[i](float)(ADC1_ConvertedValue[i]*3.3/4096);
}
接下来就要配置上面用的函数了
//FIR实例化结构体arm_fir_instance_f32 * S; 还记得刚刚Matlab生成的文件吗打开这个文件复制这些到工程里面去。 //FIR滤波器系数个数
uint16_t numTaps81;
//FIR滤波器系数
float32_t pCoeffs[81]{3.671998324e-22,2.631265729e-20,9.278031016e-19, 2.14557019e-17,3.659253801e-16,4.907191783e-15,5.387333849e-14, 4.97747839e-13,3.948472625e-12,2.730093235e-11,1.664632598e-10,9.033196413e-10,4.394613118e-09,1.927893756e-08,7.661567736e-08,2.767831404e-07,9.112107477e-07,2.737595878e-06,7.507435839e-06,1.876901842e-05,4.263511073e-05,8.741336933e-05,0.0001597262308,0.0002535805688,0.0003294369671,0.0002852701291,-6.710144226e-05,-0.0009913889226,-0.002741852077, -0.00537379086,-0.00846511405, -0.01084412821, -0.01049835142,-0.004857060499, 0.008461467922,0.03057124838, 0.0603001751, 0.09375944734, 0.1249034405, 0.1470876038,0.1551340818, 0.1470876038, 0.1249034405, 0.09375944734, 0.0603001751,0.03057124838, 0.008461467922,-0.004857060499, -0.01049835142, -0.01084412821,-0.00846511405, -0.00537379086,-0.002741852077,-0.0009913889226,-6.710144226e-05,0.0002852701291,0.0003294369671,0.0002535805688,0.0001597262308,8.741336933e-05,4.263511073e-05,1.876901842e-05,7.507435839e-06,2.737595878e-06,9.112107477e-07,2.767831404e-07,7.661567736e-08,1.927893756e-08,4.394613118e-09,9.033196413e-10,1.664632598e-10,2.730093235e-11,3.948472625e-12, 4.97747839e-13,5.387333849e-14,4.907191783e-15,3.659253801e-16, 2.14557019e-17,9.278031016e-19,2.631265729e-20,3.671998324e-22
};
//FIR滤波器状态变量暂存数组的大小numTapsblocksize-1
float32_t pState[336]{0.0f};
//块处理大小
uint32_t blockSize256;
//输入数据
float32_t inbuf[256]{0};//输出数据
float32_t outbuf[256] {0}; 接下来就要调用上面说的函数了不过我们先要为arm_fir_instance_f32这个结构体开辟一个空间
// 为FIR实例分配内存
S (arm_fir_instance_f32 *)malloc(sizeof(arm_fir_instance_f32));
if (S NULL)
{// 内存分配失败处理错误 return;
}
malloc和free这两个函数需要包含#include stdlib.h这个头文件不然会报错
这行代码 S (arm_fir_instance_f32 *)malloc(sizeof(arm_fir_instance_f32)); 是C语言中动态内存分配的一个常见用法。这行代码做了以下几件事情
sizeof(arm_fir_instance_f32)计算arm_fir_instance_f32结构体类型所占用的字节数。malloc(sizeof(arm_fir_instance_f32))调用malloc函数请求分配足够存储一个arm_fir_instance_f32结构体的内存空间。malloc返回的是一个指向所分配内存区域的void指针。(arm_fir_instance_f32 *)将void指针强制类型转换为arm_fir_instance_f32指针。这是因为malloc返回的是void指针而我们需要一个指向arm_fir_instance_f32的指针来操作分配的内存。S ...将转换后的指针赋值给S这样S现在就指向了一块新分配的内存这块内存足够存储一个arm_fir_instance_f32实例。
重要的是要注意在使用malloc分配内存之后你有责任在不再需要这块内存时使用free函数来释放它以避免内存泄漏。
另外务必检查malloc的返回值是否为NULL。如果malloc无法分配所需的内存例如由于内存不足它将返回NULL。在这种情况下你应该处理这个错误情况而不是尝试使用NULL指针因为这会导致程序崩溃。
现在再调用那两个函数
arm_fir_init_f32(S,numTaps,pCoeffs,pState,blockSize);
arm_fir_f32(S,inbuf,outbuf,blockSize); 这样在outbuf数组中就是低通滤波后的数据了
最后我们使用free函数释放内存避免内存泄漏
free(S); // 释放内存
S NULL; // 将指针设置为 NULL以避免悬挂指针
OK,用串口打印出来看看效果 蓝色的方波是原始信号橙色的正弦波是经过低通滤波的信号效果还是ok的
到此就完成了软件滤波