可变频率信号的移动平均值

问题描述 投票:0回答:1

我使用此代码来获取具有恒定频率的正弦实时波的移动平均值。 (test_sin 是具有恒定频率的正弦波)。我采样了 100 个样本,如 LENGTH_X = 100 和 Buffer_X[100] 中所示。

static double test_sin = 0; 
static double sum_x = 0 , filter_out_X = 0 ;
static int LENGTH_X = 100 , counter_filter_X = 0 ;
static double Buffer_X[100]= {0} ;
.
.
.
sum_x = sum_x + test_sin - Buffer_X\[counter_filter_X\];
filter_out_X = sum_x / LENGTH_X ;
Buffer_X\[counter_filter_X\] = (test_sin);
counter_filter_X = counter_filter_X+1 ;
if (counter_filter_X == LENGTH_X)
{
counter_filter_X = 0 ;
}

基本上我按照这个参考资料在 Youtube 上制作了算法: 高效移动平均滤波器

我想问的问题是如何更改此代码以便我可以更改示例。

我的正弦波具有可变频率,因此我想保留 LENGTH_X 和 BUffer_X[] 变量或更改,而不仅仅是 100 个样本。 我已经知道样品要保留多少。

一旦我设置 Length_X =100 和 Buffer_X[100]= {0},即使稍后我尝试重新初始化它,它也会卡在 100 个样本,它也不会重新初始化。

我尝试了简单的事情,例如以不同的方式初始化:

if(freq>1000)
{
static int LENGTH_X = 100 , counter_filter_X = 0 ;
static double Buffer_X[100]= {0} ;
}
else
{
static int LENGTH_X = 10 , counter_filter_X = 0 ;
static double Buffer_X[10]= {0} ;
}
c average sensors moving-average
1个回答
0
投票

发布的用于更改样本数量的代码将不起作用。

if-else
部分内定义的变量在
if-else
之后将无法访问。

如果您的系统支持,您可以使用可变长度数组和

memset
。喜欢:

int LENGTH_X;
int counter_filter_X = 0;
if(freq>1000)
{
    LENGTH_X = 100;
}
else
{
    LENGTH_X = 10;
}
double Buffer_X[LENGTH_X];  // variable length array
memset(Buffer_X, 0, LENGTH_X * sizeof Buffer_X[0]); // zero initialize

或者您可以选择动态分配的内存。喜欢

int LENGTH_X;
int counter_filter_X = 0;
if(freq>1000)
{
    LENGTH_X = 100;
}
else
{
    LENGTH_X = 10;
}
double* Buffer_X = calloc(LENGTH_X, sizeof Buffer_X[0]);  // dynamic zero-initialized memory

也就是说,我会考虑是否有理由在运行时更改数组大小。如果您知道

LENGTH_X
的最大值,只需将数组设为最大大小,并仅使用当前想要的数组部分。可以使用
memset
重新初始化,如上所示。

© www.soinside.com 2019 - 2024. All rights reserved.