가속도계 데이터에 대한 올바른 필터 선택


28

저는 DSP를 처음 접했고 파이썬에서 가속도계 데이터를 평활화하기 위해 가능한 필터에 대한 연구를 수행했습니다. 다음 이미지에서 경험할 수있는 데이터 유형의 예를 볼 수 있습니다.

가속도계 데이터

본질적으로, 나는이 데이터를 부드럽게 속도와 변위로 변환하기 위해이 데이터를 부드럽게하는 것에 대한 조언을 찾고 있습니다. 휴대 전화의 가속도계는 소음이 심하다는 것을 알고 있습니다.

나는 데이터에 의해 생성 된 잡음을 참조하기 위해 장치를 잡지 못하기 때문에 현재 칼만 필터를 사용할 수 있다고 생각하지 않습니다 (장치를 평평하게 놓고 그 수치에서 잡음의 양을 찾는 것이 필수적이라는 것을 읽었습니까?)

FFT는 몇 가지 흥미로운 결과를 낳았습니다. 내 시도 중 하나는 가속 신호를 FFT 한 다음 저주파수를 렌더링하여 절대 FFT 값이 0이되도록하는 것입니다. 그런 다음 오메가 산술 및 역 FFT를 사용하여 속도 플롯을 얻었습니다. 결과는 다음과 같습니다.

필터링 된 신호

이것이 좋은 일입니까? 신호의 전체 노이즈 특성을 제거하려고하지만 약 80 초와 같은 명백한 피크를 식별해야합니다.

또한 원래 가속도계 데이터에 저역 통과 필터를 사용하여 피곤해졌습니다. 매끄럽게 처리하는 데 많은 도움이되었지만 여기서 어디로 가야할지 확실하지 않습니다. 여기에서 어디로 가야하는지에 대한 안내가 정말 도움이 될 것입니다!

편집 : 약간의 코드 :

for i in range(len(fz)): 
    testing = (abs(Sz[i]))/Nz

    if fz[i] < 0.05:
        Sz[i]=0

Velfreq = []
Velfreqa = array(Velfreq)
Velfreqa = Sz/(2*pi*fz*1j)
Veltimed = ifft(Velfreqa)
real = Veltimed.real

따라서 본질적으로 필자는 가속도계 데이터에 대해 FFT를 수행하여 간단한 벽돌 벽 필터를 사용하여 Sz에 필터링 된 고주파수를 제공했습니다 (이상적이지 않음). 그런 다음 데이터의 FFT에서 오메가 산술을 사용하십시오. 또한 내 게시물에 이미지를 추가 한 datageist에게 대단히 감사합니다 :)


DSP에 오신 것을 환영합니다! 두 번째 사진의 빨간색 곡선이 원본 (녹색) 데이터의 "부드러운"버전입니까?
Phonon

적색 곡선 (희망!)는 FFT로부터 생성 된 속도 곡선 (2 * PI로 나누어 오메가 연산 한 후, 여과 하였다 F INV에 의해 다음, J). fft
Michael M

1
아마도 당신이 한 일에 대해 더 정확한 수학적 표현이나 의사 코드를 포함 시키면 문제가 해결 될 것입니다.
Phonon

이제 코드의 일반적인 느낌을 일부 추가했습니다.
Michael M

1
내 질문은 : 데이터에서 무엇을 기대합니까? 필터링 후에 볼 수있는 기본 신호에 대해 알지 않는 한 올바른 접근 방법이 있는지 알 수 없습니다. 또한 표시 한 코드가 혼동됩니다. fz어레이 의 초기화는 표시하지 않지만 대신 고역 통과 필터를 적용하고있는 것 같습니다.
Jason R

답변:


13

샤프 전환을 유지하면서 신호 노이즈 제거를 위한 트릭 백 에서 @JohnRobertson이 지적한 것처럼 , 전체 가변 주파수 (TV) 노이즈 제거는 신호가 부분적으로 일정한 경우 또 다른 좋은 대안입니다. 신호가 다른 고지대에 따라 계속 변하는 경우 가속도계 데이터의 경우 일 수 있습니다.

다음은 이러한 신호에서 TV 노이즈 제거를 수행하는 Matlab 코드입니다. 이 코드는 전체 변형 비디오 복원을위한 Augmented Lagrangian Method 라는 논문을 기반으로합니다 . 노이즈 수준과 신호 특성에 따라 매개 변수 및 를 조정해야합니다.μρ

경우 잡음 신호이며, 를 추정 할 수있는 신호 인, 함수는 최소화 될 , 여기서 유한 차 연산자이다.yxμxy2+Dx1D

function denoise()

f = [-1*ones(1000,1);3*ones(100,1);1*ones(500,1);-2*ones(800,1);0*ones(900,1)];
plot(f);
axis([1 length(f) -4 4]);
title('Original');
g = f + .25*randn(length(f),1);
figure;
plot(g,'r');
title('Noisy');
axis([1 length(f) -4 4]);
fc = denoisetv(g,.5);
figure;
plot(fc,'g');
title('De-noised');
axis([1 length(f) -4 4]);

function f = denoisetv(g,mu)
I = length(g);
u = zeros(I,1);
y = zeros(I,1);
rho = 10;

eigD = abs(fftn([-1;1],[I 1])).^2;
for k=1:100
    f = real(ifft(fft(mu*g+rho*Dt(u)-Dt(y))./(mu+rho*eigD)));
    v = D(f)+(1/rho)*y;
    u = max(abs(v)-1/rho,0).*sign(v);
    y = y - rho*(u-D(f));
end

function y = D(x)
y = [diff(x);x(1)-x(end)];

function y = Dt(x)
y = [x(end)-x(1);-diff(x)];

결과 :

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오


이 답변과 똑같이 시도해보십시오. 답장이 너무 오래 걸려서 죄송합니다!
Michael M

훌륭한 답변입니다. 자세한 내용에 감사드립니다. 이 코드의 C 버전을 찾고 있습니다. 여기 누구 든지이 matlab 코드를 C로 이식하여 공유하고 싶습니까? 감사.
Rene Limberger

구간 별 상수 란 무엇입니까?
tilaprimera 2016 년

6

문제는 노이즈에 플랫 스펙트럼이 있다는 것입니다. 당신이 가정하면 백색 가우시안 잡음 (좋은 가정 것으로 판명)의 파워 스펙트럼 밀도는 일정하다. 대략적으로 말하면 잡음에 모든 주파수가 포함되어 있다는 의미입니다. 그렇기 때문에 DFT 또는 저역 통과 필터와 같은 주파수 접근 방식이 좋지 않습니다. 잡음이 스펙트럼 전체에 있기 때문에 차단 주파수는 무엇입니까?

이 질문에 대한 답변 중 하나는 Wiener 필터입니다.이 필터에는 노이즈 통계와 원하는 신호에 대한 지식이 필요합니다. 기본적으로 노이즈 신호 (신호 + 노이즈)는 노이즈가 신호보다 강할 것으로 예상되는 주파수에서 감쇠되고 신호가 노이즈보다 강할 것으로 예상되는 곳에서는 증폭됩니다.

그러나 비선형 처리를 사용하는 웨이블릿 노이즈 제거와 같은 더 현대적인 접근 방식을 제안합니다. 이러한 방법은 탁월한 결과를 제공합니다. 기본적으로 노이즈 신호는 먼저 웨이블릿으로 분해 된 다음 작은 계수가 제로화됩니다. 이 방법은 웨이블릿의 다중 해상도 특성으로 인해 작동하며 DFT는 작동하지 않습니다. 즉, 신호는 웨이블릿 변환에 의해 정의 된 주파수 대역에서 개별적으로 처리됩니다.

MATLAB에서 'wavemenu'를 입력 한 다음 'SWT denoising 1-D'를 입력하십시오. 그런 다음 '파일', '예시 분석', '시끄러운 신호', '5 단계에서 소음 발생, 시끄러운 블록'. 이 예제는 Haar wavelet을 사용하는데, 문제에 적합합니다.

나는 파이썬에 능숙하지 않지만 Haar wavelet denoising을 수행하는 NumPy 패키지를 찾을 수 있다고 생각합니다.


1
당신의 첫 진술에 동의하지 않습니다. 관심있는 신호가 입력 시퀀스의 전체 대역폭을 커버한다고 가정합니다. 이 경우 선형 필터링을 사용하여 향상된 대역 대 잡음비를 얻을 수있어 대역 외 잡음을 제거 할 수 있습니다. 신호가 과도하게 샘플링 된 경우 간단한 접근 방식으로 크게 개선 될 수 있습니다.
Jason R

사실이며, 이는 신호 및 노이즈 통계를 알고있을 때 Wiener 필터에 의해 달성됩니다.
Daniel R. Pipa

웨이블릿 노이즈 제거의 이론은 복잡하지만 구현 방법은 설명 된 방법만큼 간단합니다. 필터 뱅크와 임계 값 만 포함합니다.
Daniel R. Pipa

1
지금 연구 중이며, 지금까지의 모든 도움에 대해 귀하와 Phonon 모두에게 감사드립니다.
Michael M

@DanielPipa 문제의 matlab 패키지에 액세스 할 수 없습니다. matlab 코드에 해당하는 방법을 설명하는 종이 또는 기타 참조를 제공 할 수 있습니다.
존 로버트슨

0

Daniel Pipa의 제안에 따라 Wavelet Denoising을 살펴보고 Francisco Blanco-Silva의 훌륭한 기사 를 찾았습니다 .

여기에서는 이미지 처리가 3D (이미지) 데이터가 아닌 2D (가속도계)와 작동하도록 Python 코드를 수정했습니다.

참고 , 임계 값은 시스코의 예에서 소프트 임계 위해 "만들어"입니다. 이것을 고려하고 응용 프로그램에 맞게 수정하십시오.

def wavelet_denoise(data, wavelet, noise_sigma):
    '''Filter accelerometer data using wavelet denoising

    Modification of F. Blanco-Silva's code at: https://goo.gl/gOQwy5
    '''
    import numpy
    import scipy
    import pywt

    wavelet = pywt.Wavelet(wavelet)
    levels  = min(15, (numpy.floor(numpy.log2(data.shape[0]))).astype(int))

    # Francisco's code used wavedec2 for image data
    wavelet_coeffs = pywt.wavedec(data, wavelet, level=levels)
    threshold = noise_sigma*numpy.sqrt(2*numpy.log2(data.size))

    new_wavelet_coeffs = map(lambda x: pywt.threshold(x, threshold, mode='soft'),
                             wavelet_coeffs)

    return pywt.waverec(list(new_wavelet_coeffs), wavelet)

어디에:

  • wavelet-사용할 웨이블릿 형식의 문자열 이름 ( pywt.wavelist()예 : 참조 'haar')
  • noise_sigma -데이터 소음의 표준 편차
  • data -필터링 할 값의 배열 (예 : x, y 또는 z 축 데이터)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.