只有实现了EMA,才能取得MACD
EMA,指数移动平均线是一种 IIR 滤波器,很容易用 C 语言实现,并且使用最少的资源。与简单的移动平均线不同,它不需要 RAM 缓冲区来存储先前的样本。它只需要存储一个值(前一个平均值)。
指数移动平均线表示为以下等式:avg[n] = (in * alpha) + avg[n-1]*(1-alpha)。使用浮点数学实现这个方程很简单,但使用定点变量有点棘手。此处的代码片段使用 32 位有符号整数作为平均值和输入值。中间值需要使用 64 位数学运算以避免溢出错误。
Alpha 值接近零表示重平均,而 Alpha 值为 1 表示不平均。
//This macros defines an alpha value between 0 and 1
#define DSP_EMA_I32_ALPHA(x) ( (uint16_t)(x * 65535) )
int32_t dsp_ema_i32(int32_t in, int32_t average, uint16_t alpha){
int64_t tmp0; //calcs must be done in 64-bit math to avoid overflow
tmp0 = (int64_t)in * (alpha) + (int64_t)average * (65536 - alpha);
return (int32_t)((tmp0 + 32768) / 65536); //scale back to 32-bit (with rounding)
}
//here is a function that uses the averaging code
int32_t my_avg_func(void){
static int32_t average = 0;
int32_t adc_value;
adc_value = read_the_adc_value();
average = dsp_ema_i32(adc_value, average, DSP_EMA_I32_ALPHA(0.1));
return average;
}
来源:https://www.embeddedrelated.com/showcode/304.php
相关资料:
标签:int32,EMA,average,value,C语言,指标,MACD,adc,alpha From: https://www.cnblogs.com/yuyanc/p/17673076.html