3

青い曲線で示されている、不要な振動キャリアを含む信号があります。ローパス フィルター (5 次バターワース) を作成し、filtfilt関数を適用しました。低フィルター出力は赤い曲線です。

[b,a] = butter(5,.7);
y = filtfilt(b,a,y);

ここに画像の説明を入力 x 値 500 から最後までの赤い曲線はまさに私が望んでいたものですが、最初の振動はまだ残っています。フィルタ関数は、フィルタの入力と出力の初期値と終了値を一致させようとするため、発振が維持されるようです。初期値を不一致にして、振動なしでスムーズな出力を得る方法はありますか?

更新: 私の質問は明確ではなかったと思います。黒い曲線(手描き)のようなものが欲しい:振動を完全に取り除き、初期値と一致させない. これどうやってするの?ここに画像の説明を入力

4

4 に答える 4

6

簡単に言えば、あなたが求めていることは不可能だということです。

すべてのフィルターは「ウォームアップ」するのに時間がかかります。これは、フィルターの「立ち上がり時間」として知られています。これは、n次数フィルターが最後のnサンプルの加重平均を実行し、信号が最初に開始されたときに、そのサンプルのバックログが利用できないために発生します。

そこにあるフィルターは、実際にはかなり良い立ち上がり時間を持っています-入力を適切に追跡し始めるのに約10サンプルしかかかりません。

発生する振動は「オーバーシュート」として知られています。フィルターを設計する場合、立ち上がり時間とオーバーシュートの間にトレードオフがあり、立ち上がり時間を速くすることはできず、オーバーシュートはありません。ダンピングに関するウィキペディアの記事は、あなたにとって良いリソースかもしれません。

于 2012-12-30T06:26:01.530 に答える
3

この問題に直面したとき、私がよくやることは、フィルタリングされた信号に先行する起動信号を作成することです。

比較的簡単な作業ですが、元の信号に依存するローパスフィルターの場合。私の最初の試みは、原点に関して信号の一部を反映することです:

[b,a] = butter(5,.7);
N = 50; % change this to suit your needs
    yNew = filtfilt(b,a,[y(N:-1:1);y];
yNew = yNew(N+1:end);

これにより、起動が最小限に抑えられ、「すぐに実行に移す」ことができます。

于 2013-01-01T07:23:01.767 に答える
1

以前の回答とコメントを読むと、フィルタリングはこの特定の質問に対して求められている回答ではないようです。

信号をパラメトリック曲線でフィッティングすることを検討しましたか? 求める曲線は信号の中にある (「外れ値」がない) ため、最小二乗フィッティングは非常にうまくいくようです。

% assuming y is your signal
% fit polynomial of degree Deg
Deg = 5; 
x = linspace(0,1, numel(y));
p = polyfit( x, y, Deg );
figure('Name','fit poly');
plot( y, '-+b');
hold all;
plot( polyval( p, x ), ':k', 'LineWidth', 1.2 );

この例では以前に使用polyfitDeg=5ましたが、さまざまな機能とさまざまな程度を考慮することができます。

fit役立つツールが見つかるかもしれません。

于 2012-12-31T09:38:30.523 に答える