グラフィックスやオーディオの編集および処理ソフトウェアには、「ハイパス フィルター」および「ローパス フィルター」と呼ばれる機能が含まれていることがよくあります。これらは正確に何をし、それらを実装するためのアルゴリズムは何ですか?
6 に答える
畳み込みを使用してローパス フィルターを実装する方法は次のとおりです。
double[] signal = (some 1d signal);
double[] filter = [0.25 0.25 0.25 0.25]; // box-car filter
double[] result = new double[signal.Length + filter.Length + 1];
// Set result to zero:
for (int i=0; i < result.Length; i++) result[i] = 0;
// Do convolution:
for (int i=0; i < signal.Length; i++)
for (int j=0; j < filter.Length; j++)
result[i+j] = result[i+j] + signal[i] * filter[j];
この例は非常に単純化されていることに注意してください。範囲チェックを行わず、エッジを適切に処理しません。使用されるフィルター (box-car) は、多くのアーティファクト (リンギング) を引き起こすため、特に悪いローパス フィルターです。フィルター設計について調べてください。
周波数領域でフィルターを実装することもできます。FFT を使用してハイパス フィルターを実装する方法を次に示します。
double[] signal = (some 1d signal);
// Do FFT:
double[] real;
double[] imag;
[real, imag] = fft(signal)
// Set the first quarter of the real part to zero to attenuate the low frequencies
for (int i=0; i < real.Length / 4; i++)
real[i] = 0;
// Do inverse FFT:
double[] highfrequencysignal = inversefft(real, imag);
繰り返しますが、これは単純化されていますが、アイデアは得られます。コードは数学ほど複雑には見えません。
ウィキペディア:
これらの「高」、「低」、および「帯域」という用語は、周波数を指します。ハイパスでは、低周波を除去しようとします。ローパスでは、ハイを削除しようとします。バンドパスでは、連続した周波数範囲のみを残すことができます。
カットオフ周波数の選択は、アプリケーションによって異なります。これらのフィルターのコーディングは、RC 回路をシミュレートするか、時間ベースのデータのフーリエ変換をいじって行うことができます。コード例については、ウィキペディアの記事を参照してください。
ハイパスフィルターは、高周波(詳細/ローカル情報)を通過させます。
ローパスフィルターは、低周波数(粗い/粗い/グローバルな情報)を通過させます。
フィルタリングは、データ内のさまざまな周波数にさまざまなレベルの減衰を適用する方法でデータを処理する動作を表します。
ハイパスフィルターは、高周波数に対して最小の減衰を適用します(つまり、レベルを変更しないままにします)が、低周波数には最大の減衰を適用します。
ローパスフィルターは逆です。高周波数に減衰を適用することにより、低周波数に減衰を適用しません。
使用されるさまざまなフィルタリングアルゴリズムがいくつかあります。最も単純な2つは、おそらく有限インパルス応答フィルター(別名FIRフィルター)と無限インパルス応答フィルター(別名IIRフィルター)です。
FIRフィルターは、一連のサンプルを保持し、それらの各サンプルに固定係数(一連の位置に基づく)を掛けることによって機能します。これらの各乗算の結果が累積され、そのサンプルの出力になります。これは積和演算と呼ばれ、専用のDSPハードウェアには、これを行うための特定のMAC命令があります。
次のサンプルが取得されると、シリーズの先頭に追加され、シリーズ内の最も古いサンプルが削除され、プロセスが繰り返されます。
フィルタの動作は、フィルタ係数の選択によって固定されます。
画像処理ソフトウェアによって提供されることが多い最も単純なフィルターの1つは、平均化フィルターです。これは、すべてのフィルター係数を同じ値に設定することにより、FIRフィルターによって実装できます。
それらは一般に、アナログ信号の一部を通過させる傾向がある電気回路です。ハイパスは高周波数成分をより多く通過させる傾向があり、ローパスは低周波数成分をより多く通過させる傾向があります。
それらはソフトウェアでシミュレートできます。たとえば、歩行平均はローパス フィルターとして機能し、歩行平均とその入力の差はハイ パス フィルターとして機能します。
これは、一度に 1 サンプルずつ信号を処理する C++ のローパス フィルターの非常に単純な例です。
float lopass(float input, float cutoff) {
lo_pass_output= outputs[0]+ (cutoff*(input-outputs[0]));
outputs[0]= lo_pass_output;
return(lo_pass_output);
}
ハイパスであることを除いて、これはほとんど同じです。
float hipass(float input, float cutoff) {
hi_pass_output=input-(outputs[0] + cutoff*(input-outputs[0]));
outputs[0]=hi_pass_output;
return(hi_pass_output);
}