我正在尝试在不使用数组或动态分配的情况下平滑输入数据(真正的正数)。可能吗?
结束条件是用户输入负数。例如:
input: 1 2 3 4 5 -1
output: 1.5 2 3 4 4.5
我正在尝试在不使用数组或动态分配的情况下平滑输入数据(真正的正数)。可能吗?
结束条件是用户输入负数。例如:
input: 1 2 3 4 5 -1
output: 1.5 2 3 4 4.5
您可以使用移动平均线来做到这一点。以最简单的形式
const int smooth_factor = 3; // the higher the value the more smooth it is.
int samples = 0;
int total = 0; // make long or long long if danger of overflow.
int smoothed(int new_sample)
{
if (samples == smooth_factor)
{
total -= total / smooth_factor;
samples -= 1;
}
total += new_sample;
samples += 1;
return total / samples;
}
在实践中,您可能会通过使用两个平滑因子的幂并使用移位操作而不是除以平滑因子来提高效率。如果您愿意预先设定总样本数和样本数,也可以去掉 if 语句。
const int smooth_factor = 16; // the higher the value the more smooth it is.
int total = 129; // e.g. 129 = sum of first 16 samples
int smoothed(int new_sample)
{
total -= total >> 4;
total += new_sample;
return total >> 4;
}
如果您要对许多值进行平滑处理,那么您可以移除其中一个变化而不会产生显着影响(但我将把它留作练习)。
如果您可以将状态保存在几个变量或寄存器中而不是数组元素中,那么您可以使用 IIR(或递归)过滤器进行实时处理。搜索 DSP 双二阶滤波器,它是 IIR 滤波器,在逐个样本处理数据时只需要 4 个状态变量。
请注意,IIR 滤波器会产生一些与频率相关的非线性相位延迟。“平滑”的输出要到相应输入之后的一些样本才会出现,并且可能会出现形状倾斜。
没有记忆就无法“过滤”信号。时期。
使用 n 个内存插槽,可以实现 FIR 滤波器或 IIR 滤波器(或两者的组合)。
如果一个人不喜欢数组表示法a[5],b[5]
,可以通过声明一个单独的变量数组来改变规则,比如。
static a0=0,a1=0,a2=0,a3=0, b0=0,b1=0,b2=0,b3=0;
output = b3* B3 + b2*B2 + b1*B1 + b0* B0; // where B0..B3 are constant coefficients
b3=b2;b2=b1;b1=b0; b0=new_sample; // This is FIR filter (Finite impulse response)
a0=output;
output += a3*A3 + a2*A2 + a1*A1; // and this implements an IIR filter
a3=a2;a2=a1;a1=a0; // Infinite impulse response
数组的概念仍然存在。
如果您的问题是“我可以在不使用数组或动态分配的情况下声明未定义数量的变量吗?”,答案是否定的。