2008-08-30 10 views

答えて

18

ウィキペディア:

これらの、 "高" "低"、および "バンド" という用語は、周波数を参照してください。ハイパスでは、低い周波数を除去しようとします。ローパスでは、高いレベルを取り除こうとします。バンドパスでは、連続した周波数範囲が残るだけです。

カットオフ周波数の選択は、アプリケーションによって異なります。これらのフィルタをコーディングするには、RC回路をシミュレートするか、時間ベースのデータをフーリエ変換して再生します。コード例については、wikipediaの記事を参照してください。

5

これらは一般に、アナログ信号の一部を通過させる傾向がある電気回路です。ハイパスは、より多くの高周波成分を伝達する傾向があり、ローパスは、より多くの低周波成分を通過する傾向がある。

ソフトウェアでシミュレートすることができます。ウォーキング平均はローパスフィルタとして機能し、ウォーキング平均と入力の差はハイパスフィルタとして機能します。

5

ハイパスフィルタは、高い - 周波数(詳細/ローカル情報)パスができます。
ローパスフィルタは低い - 周波数(粗い/ラフ/グローバル情報)パスができます。ここで

27

あなたは畳み込みを使用して、低域通過フィルタを実装する方法である:例は非常に単純化していることを

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]; 

注意。範囲チェックは行わず、エッジを適切に処理しません。使用されるフィルタ(ボックスカー)は、アーティファクト(リンギング)が多く発生するため、特に悪いローパスフィルタです。フィルターデザインを読む。

周波数領域でフィルタを実装することもできます。

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

コードサンプルが非常に涼しいです。なぜ1つのケースではたたみ込み、もう1つのケースではFFTですか? – dfrankow

+2

@dfrankow特に理由はありません。さまざまなドメインでどのように見えるかを示すだけです。これを反映するようにテキストを更新しました。ありがとう。 – Hallgrim

+0

矩形関数を使用して時間領域で畳み込みを適用する答えの最初の部分が正しいですか?私は、時間領域のローパスフィルタがsinc関数の畳み込みを必要とすると考えましたか? – stackoverflowuser2010

5

フィルタリングは、データ内の異なる周波数にさまざまなレベルの減衰を適用する方法でデータを処理する行為を表します。

ハイパスフィルタは、高周波数に対しては最小限の注意(すなわち、レベルを変更しない)を適用しますが、低周波に対しては最大減衰を適用します。

ローパスフィルタは逆です。高周波に減衰を適用することで、低周波数には減衰が適用されません。

さまざまなフィルタリングアルゴリズムが使用されています。最も単純なのはおそらく、有限インパルス応答フィルタ(別名FIRフィルタ)と無限インパルス応答フィルタ(別名IIRフィルタ)です。

FIRフィルタは、一連のサンプルを保持し、それらのサンプルのそれぞれに固定係数(シリーズ内の位置に基づく)を乗算することによって機能します。これらの乗算のそれぞれの結果は累算され、そのサンプルの出力となります。これは積和演算(Multiply-Accumulate)と呼ばれ、専用のDSPハードウェアには、これを行うための特定のMAC命令があります。

次のサンプルを撮影すると、シリーズの先頭に追加され、シリーズ内の最も古いサンプルが削除され、処理が繰り返されます。

フィルタの動作は、フィルタ係数の選択によって固定されます。

画像処理ソフトウェアによって提供されることが多い最も簡単なフィルタの1つが、平均化フィルタです。これは、すべてのフィルタ係数を同じ値に設定することによって、FIRフィルタによって実施することができる。ここで

5

は時の信号つのサンプルを処理して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); 
} 
+4

私はあなたがコードであることを試していますが、「カットオフ」が何を象徴しているのか分かりません。ヘルツでのカットオフ周波数ではありませんか? –

+1

答えはほぼ10年前ですが、私はまだ計算に取られるべき出力[0]ではないと信じていますが、以前のフィルタリングされたサンプル値です。 – Mike

+0

関連:https://dsp.stackexchange.com/questions/39063/simple-software-low-pass-filter –

関連する問題