ハイパスフィルターとローパスフィルターとは何ですか?
-
09-06-2019 - |
質問
グラフィックおよびオーディオの編集および処理ソフトウェアには、「ハイパス フィルター」および「ローパス フィルター」と呼ばれる機能が含まれていることがよくあります。これらは正確に何をするのでしょうか?また、それらを実装するためのアルゴリズムは何ですか?
解決
ウィキペディア:
これらの「高」、「低」、および「帯域」という用語は、 周波数. 。ハイパスでは、低周波を除去しようとします。ローパスでは高域を除去しようとします。バンドパスでは、連続した周波数範囲のみを残すことができます。
カットオフ周波数の選択は、アプリケーションによって異なります。これらのフィルターのコーディングは、RC 回路をシミュレートするか、時間ベースのデータのフーリエ変換を試すことで実行できます。コード例については、ウィキペディアの記事を参照してください。
他のヒント
畳み込みを使用してローパス フィルターを実装する方法は次のとおりです。
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];
この例は非常に単純化されていることに注意してください。範囲チェックは行わず、エッジを適切に処理しません。使用されるフィルター (ボックスカー) は、多くのアーティファクト (リンギング) を引き起こすため、特に悪いローパス フィルターです。フィルター設計について読んでください。
周波数領域でフィルターを実装することもできます。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);
繰り返しますが、これは単純化されていますが、アイデアは理解できます。コードは数学ほど複雑ではないようです。
これらは一般に、アナログ信号の一部を通過させる傾向のある電気回路です。ハイパスは高周波数部分をより多く通過させる傾向があり、ローパスは低周波数部分をより多く通過させる傾向があります。
これらはソフトウェアでシミュレートできます。たとえば、移動平均はローパス フィルターとして機能し、移動平均とその入力の差はハイパス フィルターとして機能します。
ハイパス フィルターをかけてみましょう 高い- 頻度 (詳細/地域情報) 合格.
ローパス フィルターをかけてみましょう 低い- 周波数 (粗い/粗い/全体的な情報) 合格.
フィルタリングとは、データ内のさまざまな周波数にさまざまなレベルの減衰を適用する方法でデータを処理する行為を指します。
ハイパスフィルターは最小限の減衰を適用します(つまり、高周波の場合はレベルを変更しないままにします)が、低周波には最大の減衰が適用されます。
ローパスフィルターはその逆で、高周波数に減衰を適用することで低周波数には減衰を適用しません。
さまざまなフィルタリング アルゴリズムが使用されています。最も単純な 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);
}