我是靠谱客的博主 虚拟火车,最近开发中收集的这篇文章主要介绍一阶低通数字滤波,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一阶低通滤波算法:

3、 一阶低通滤波优缺点

一阶低通滤波数学意义:一阶低通滤波法采用本次采样值与上次滤波输出值进行加权,得到有效滤波值,使得输出对输入有反馈作用。

优缺点:滤波系数越小,滤波结果越平稳,但灵敏度越低,滤波系数越大,灵敏度越高,但滤波结果越不稳定。相位滞后,灵敏度低,滞后程度取决于a值大小;不能消除频率高于采样频率的1/2的干扰信号。

4、 C语言代码实现

/*low-pass filtering structure variables */

typedef struct

{

_iq In; /* Input: Reference input */

_iq Out; /* Output:PID output */

_iq Kflt; /* Parameter:Integral gain */

} LPF1ST;

/*******************************************************************************

* Routine: LPF_1st_calc

* Purpose: first order filter

* 传递函数:Y(s)=X(s)*1/(1+Ts)

* 离散方程:Y(k) = (1-Kflt)*Y(k-1)+Kflt*X(k)

* 滤波系数: kflt = 1/(1+T/Delt_T)=1/(1+Sam_Fre*T)

* Delt_T:采样周期 Sam_Fre=1/Delt_T:采样频率 T:时间常数

******************************************************************************/

voidLPF_1st_calc(LPF1ST *p)

{

/* Low-pass filtering to the new measured signals(p->In) */

p->Out = (p->Out - _IQmpy(p->Out, p->Kflt)) + _IQmpy(p->In, p->Kflt);

}

/*******************************************************************************/

温度采样电路及代码实现

1、 用NTC热敏电阻做温度采集

凌阳科技有关于用NTC热敏电阻做温度采集的应用文档,包括NTC特性、采集电路说明、线性插值查表算法等均有详细描述,参见网络文档《用NTC热敏电阻做温度采集》。https://wenku.baidu.com/view/80cc56956f1aff00bfd51e29.html

2、 用PTC热敏电阻做温度采集

用PTC热敏电阻做温度采集与NTC方案类似,区别在于选用的PTC为正温度系数热敏电阻,NTC为负温度系数热敏电阻,故在制作温度-ADC对应表格和线性插值查表时有所区别,具体参见代码实现。

3、 温度采集C代码实现

Eg:NTC温度采集C代码实现

/* 温度-ADC数字量对应表,温度范围: -40...100℃ */

const int16 io_adc_inverter_temperature_table[] = {

3026,3021 ,3017 ,3012 ,3007 ,3002 ,2996 ,2991 ,2985 ,2978 ,2972 ,2965 ,2958 ,2951,2943 ,2935 ,2927 ,2919 ,2910 ,2901 ,2891 ,2881 ,2871 ,2861 ,2850 ,2838 ,2827,2815 ,2802 ,2790 ,2776 ,2763 ,2749 ,2734 ,2719 ,2704 ,2688 ,2672 ,2656 ,2639,2621 ,2604 ,2586 ,2567 ,2548 ,2529 ,2509 ,2489 ,2468 ,2448 ,2426 ,2405 ,2383,2360 ,2337 ,2314 ,2291 ,2267 ,2243 ,2219 ,2195 ,2170 ,2145 ,2120 ,2094 ,2069,2043 ,2017 ,1991 ,1964 ,1938 ,1911 ,1885 ,1858 ,1831 ,1804 ,1778 ,1751 ,1724,1698 ,1671 ,1644 ,1618 ,1591 ,1565 ,1539 ,1512 ,1486 ,1461 ,1435 ,1409 ,1384,1359 ,1334 ,1310 ,1285 ,1261 ,1237 ,1214 ,1190 ,1167 ,1145 ,1122 ,1101 ,1079,1058 ,1037 ,1016 ,996 ,976 ,956 ,937 ,918 ,899 ,881 ,862 ,845 ,827 ,810 ,793,776 ,760 ,744 ,729 ,713 ,698 ,684 ,669 ,655 ,641};

/*******************************************************************************/

#define INV_ADC_ARRAY_NUM (sizeof(io_adc_inverter_temperature_table)/sizeof(io_adc_inverter_temperature_table[0]))

#defineINV_TEMPER_REF -40

/*reference temperature at array index 0 */

/*******************************************************************************/

static int16io_adc_calc_inv_phase_temp(int16 adc_value)

{

int16 index;

index = search_inv_data(adc_value);

return inv_temp_calc(index, adc_value);

}

/*******************************************************************************/

static int16search_inv_data(Uint16 search_value) //ntc

{

Uint16 max = INV_ADC_ARRAY_NUM - 1;

Uint16 min = 0;

Uint16 mid;

while(min < max)

{

mid = (max + min) / 2;

if (search_value >io_adc_inverter_temperature_table[mid])

{

max = mid;

}

else if (search_value < io_adc_inverter_temperature_table[mid])

{

min = mid + 1;

}

else

{

return mid;

}

}

return min;

}

/**温度线性插值查表*****************************************************************/

static int16inv_temp_calc(int16 index, Uint16 adc_value)

{

if ((index < 0) || (index > INV_ADC_ARRAY_NUM -1))

{

return 0;

}

else

{

int16 temper;

temper = 10 *(adc_value -io_adc_inverter_temperature_table[index]); // enlarged for 10

temper /=(io_adc_inverter_temperature_table[index+1] -io_adc_inverter_temperature_table[index]); // (xn- x1)

temper += 10*(index + INV_TEMPER_REF);

temper /= 10;

return temper;

}

}

/*******************************************************************************/

最后

以上就是虚拟火车为你收集整理的一阶低通数字滤波的全部内容,希望文章能够帮你解决一阶低通数字滤波所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部