1

DC オフセットがあり、傾きがわずかにある可能性があるデータがあります。信号は 2 つの主要なピーク (ガウスに似ています) であり、その後に減衰振動が続きます。

次のコードを試しましたが、これは DC オフセットを削除しません。曲線オフセット (正弦波?) を削除します。

function [ filteredData ] = fourierFilter( inputData )

factor = 8;
N = 1024*factor;
dataRaw = zeros([1 N]);
dataStart = N/2 - round(size(inputData,2)/2);
indices = dataStart:(dataStart+size(inputData,2))-1;
dataRaw(indices) = inputData;

% transform to fourierspace
fourierSpectrum = (fftshift(fft(dataRaw)));

% add filter
delta = 1*factor/4;
indicesfftfilter = N/2-delta:N/2+delta;
fourierSpectrum(indicesfftfilter) = 0;

% back transform
filteredData = real(ifft(ifftshift(fourierSpectrum)));
filteredData = (filteredData(indices));

以下は、データ (青) とフィルター処理された曲線 (赤) の例です。delta = 3*factor/4

ここに画像の説明を入力

4

3 に答える 3

6

DC を削除するには、次のように入力します。

inputData_DCRemoved = inputData - mean(inputData);
于 2013-08-15T08:56:32.473 に答える
1

低周波ブロッキング フィルターは、これに対処する最善の方法ではありません。フーリエ空間のエッジが粗いため、いくつかの振幅をゼロに設定し、隣接する振幅をそのままにして、リンギングが発生している可能性があります。

ベター: 直線または低次多項式をデータに当てはめ、それから減算します。

編集: ああ、あなたのデータの例を見たので...まず、そのピークを「悪いデータ」としてマークし、残りの部分に低次多項式を当てはめます。勾配がまったく見られないか、または非常にわずかな勾配が見られないため、定数 (ゼロ次) の適合がうまくいく可能性があります。この定数または多項式を元のデータから減算すると (「悪い」データは忘れて)、結果が得られます。フーリエ空間ではこれほど簡単なことはありません。

重み付きポリ フィット ルーチンは、Matlab を含む、広く使用されているすべてのインタラクティブな数学プログラムに存在します。

于 2013-08-15T07:49:39.950 に答える
0

ハイパス フィルターは、信号の変化の遅い部分を取り除くだけです。信号の最も遅い部分はその平均なので、信号からそれを差し引くだけです...

それ以外の場合は、信号を取得して平滑化してから減算できます。

lowpasssignal = smooth(signal,100);
signal_highpass = signal - lowpasssignal;

これが実用的なアプローチです。

于 2013-08-15T08:34:12.330 に答える