配列や動的割り当てを使用せずに、入力データ (本当の正) を平滑化しようとしています。出来ますか?
終了条件は、ユーザーが負の数を入力したときです。例えば:
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;
}
実際には、2 の累乗の Smooth_factor を使用し、smooth_factor による除算の代わりにシフト演算を使用することで、おそらくより効率的になるでしょう。total および num サンプルを事前にシードする場合は、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;
}
多くの値を平滑化する場合は、シフトの 1 つを削除しても大きな影響はありません (ただし、これは演習として残しておきます)。
あなたの質問が「配列や動的割り当てを使用せずに未定義の数の変数を宣言できますか?」である場合、答えはノーです。
配列要素ではなくいくつかの変数またはレジスタに状態を保存できる場合は、リアルタイム処理に IIR (または再帰) フィルターを使用できます。データをサンプルごとに処理するときに 4 つの状態変数のみを必要とする IIR フィルターである DSP 双二次フィルターを検索します。
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
それでも配列の概念は存続します。