가속도계 데이터 특성 분석 및 필터 설계


14

기본 주행 시나리오 25MPH 일반 도로에 대한 약 32 초 분량의 가속도계 데이터와 약 7 개의 구덩이와 거친 도로 패치가 있습니다. 가속도계는 양면 테이프로 차량의 대시 보드에 장착됩니다.

문제점 : 가속도계에서 시끄러운 모든 데이터를 가지고 있으며 구덩이 이벤트가 발생했음을 감지하는 간단한 방법을 만들어야합니다. 아래는 시간 영역 및 FFT의 여러 데이터 그래프입니다. 가속도계는 GForce로 측정됩니다

기본적으로 나는 arduino가 움푹 들어간 곳이 상당히 큰 정확도로 발생하고 대학원 수준의 수학과 기술을 사용하지 않음을 알기를 원합니다.

100Hz에서 샘플링 된 가속도계는 Z 축에 간단한 50HZ RC 저역 통과 필터를 가지고 있습니다.

Here is the CSV data for the 32 seconds of accelerometer readings TIME, GFORCE format:

http://hamiltoncomputer.us/50HZLPFDATA.CSV

업데이트 : 이것은 Arduino에서 얻을 수있는 가장 높은 샘플링 속도로 샘플링 된 가속도계 1000HZ의 RAW 전체 대역폭입니다. 직접 CSV 파일 다운로드 : 약 112 초의 데이터

http://hamiltoncomputer.us/RAWUNFILTEREDFULLBANDWIDTH500HZ.csv

블랙 트레이스는 RAW 필터링되지 않은 가속도계 데이터입니다. 블루 트레이스는 FFT, Dominate 2HZ 및 12HZ에있는 극한 주파수를 기반으로 대역 저지 필터로 필터링됩니다.

http://img213.imageshack.us/img213/194/rollout.png

시간 영역에서 움푹 들어간 곳 이벤트는 다음과 같습니다. 여기에 이미지 설명을 입력하십시오

FFT에 10 ~ 15HZ 구성 요소가 무엇인지 확실하지 않은지, 실제 구덩이입니까, 아니면 도로에 대한 바퀴의 휠 홉입니까, 아니면 자동차의 공진 주파수입니까?

FFT :

FFT

실제 움푹 들어간 곳 이벤트 인 것 같습니다. 여기는 HPF @ 13HZ입니다. 움푹 들어간 곳의 주요 기능은 강화 된 것으로 보입니다

http://img69.imageshack.us/img69/8663/hpf13potholefft.png

움푹 들어간 곳을 실시간으로 감지하고 계산할 수 있기를 원합니다

서스펜션은 10-13 HZ보다 훨씬 느리게 움직여서 멀미를 유발할 수 있습니다.

최신 정보:

AngryEE의 제안에 따라 가속도계 1000HZ의 전체 대역폭과 arduino에서 얻을 수있는 최대 샘플링 속도를 사용했습니다.

FFT :

FFT 필터링되지 않은 데이터 전체 대역폭

다음은 구덩이 이벤트와 그 주변의 울퉁불퉁 한 도로 및 소음에 대한 샘플 데이터입니다.

파일되지 않은 데이터 이벤트

다이오드 엔벨로프 검출기 회로를 추가하면 출력이 동일하게 보입니다 ... 가속도계는 항상 0에서 3.3V를 음이 아닌 전압으로 출력합니다 ... 여기에 이미지 설명을 입력하십시오

최신 정보:

많은 도로 테스트에서 Z 축의 자동차에서 1.6G의 최대 45MPH를 초과하지 않았으며 rand ()를 사용하여 의사 난수 Gforce 가속을 생성했습니다.

내 생각은 1 ~ 3 초의 데이터 창을 볼 수 있다면 Z 축의 변위를 계산할 수 있지만 가속도계 드리프트 및 통합 오류에 대해 걱정했습니다. 여기에서 90 % 정확도를 유지할 필요는 없습니다.> 70 %가 좋을 것입니다.하지만 한 번에 1 ~ 3 초에 변위를보고 있다면 실시간으로 가능할까요? 이 방법으로 변위가 1 인치, 2 인치, 5 인치보다 큰지 알 수 있습니다. 변위가 클수록 범프 또는 움푹 들어간 곳이 거칠어졌습니다.

내가 올바르게하고 있는지 확인할 수 있습니까? 기본적으로 데스크톱에서 rand ()를 사용하여 -1.6에서 1.6G로 임의 가속을 생성하여 시뮬레이션 된 50HZ 샘플링 속도에서 3 초의 데이터를 캡처합니다.

* nix를 실행하는 것처럼 Windows.h의 Sleep ()을 사용하여 20mS 지연, 50HZ 샘플링 속도를 사용합니다

나는 단지 코드가 당신에게 잘 보이는지보고 싶었다. 나는 아직 cicular 버퍼를하지 않았다. 나는 그것을 구현하는 방법에 약간 혼란스러워했다 : 주석 처리 된 코드는 내가 작업중 인 클래스에서 온 것이다. 하지만 아직 100 % 이해하지 못합니다. 원형 버퍼는 연속적으로 데이터 창을 오른쪽으로 이동할 수 있습니까?

#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <ctime> // USED BY RAND
#include <windows.h> // Used for delay


using namespace std;



#define SAMPLE_RATE   0.020 // Sample rate in Milliseconds
#define GRAVITYFT_SEC 32 // Gravity velocity 32 feet/sec
#define INCH_FOOT     12 // 12 inches in foot, from velocity to inch displacement calculation










int main(int argc, char *argv[])
{
    srand((unsigned)time(0)); // SEED RAND() for simulation of Geforce Readings

    // SIMULATING ACCELERATION READINGS INTO A CIRCULAR BUFFER

   // circular_buffer Acceleration; // Create a new Circular buffer for Acceleration

   // cb_init(&Acceleration, 150, 4); // Sampling @ 50HZ, 3 seconds of data = 150, size is float data of 4 bytes

    //Simulate a sample run of Acceleration data using Rand()

    // WE WILL BE SIMULATING "RANDOM" GEFORCE RATINGS using the rand() function constraining to -1.6 to 1.6 GFORCE 
    // These ratings are consistent with our road tests of apparently random vibration and Geforce readings not exceeding about 1.6 G's

    float Gforce[150]; // Random Geforce for 3 second window of data
    float velocity[150]; // Hold velocity information
    float displacement[150]; // Hold Displacement information


    float LO = -1.6; // Low GForce limit recorded from 6 road tests at different speeds
    float HI = 1.6; // High GForce limit recorded from 6 road tests at different speeds

    for(int i = 0; i < 150; i++) // 3 Second iwndow of random acceleration data
    {  
            Gforce[i] = LO + (float)rand()/((float)RAND_MAX/(HI-LO)); // Borrowed from Stackexchange : http://stackoverflow.com/questions/686353/c-random-float
            if( i == 0) // Initial values @ first Acceleration
            {
                velocity[i] = Gforce[i] * SAMPLE_RATE * GRAVITYFT_SEC; // Initial velocity
                displacement[i] = velocity[i] * SAMPLE_RATE * INCH_FOOT; // Initial Displacement
            }
            else
            {
                velocity[i] = velocity[i-1] + (Gforce[i] * SAMPLE_RATE * GRAVITYFT_SEC); // Calculate running velocity into buffer
                displacement[i] = displacement[i-1] +(velocity[i] * SAMPLE_RATE * INCH_FOOT); // Calculate running displacement into buffer
            }
            //cout << endl << Gforce[i]; // Debugging
            //cb_push_back(&Acceleration, &Gforce[i]);                   // Push the GeForce into the circular buffer


            Sleep(SAMPLE_RATE*1000); // 20mS delay simulates 50HZ sampling rate Sleep() expects number in mS already so * 1000

    }
    // PRINT RESULTS
    for (int j = 0; j < 150; j++)
            {
                cout << setprecision (3) << Gforce[j] << "\t\t" << velocity[j] << "\t\t" << displacement[j] << endl;
            }

    // READ THE BUFFER





    //cb_free(&Acceleration); // Pervent Memory leaks

    system("PAUSE");
    return EXIT_SUCCESS;
}

샘플 실행 :

    GFORCE          FT/SEC          Inch Displacement Z axis

-0.882          -0.565          -0.136
0.199           -0.437          -0.24
-1.32           -1.29           -0.549
0.928           -0.691          -0.715
0.6             -0.307          -0.788
1.47            0.635           -0.636
0.849           1.18            -0.353
-0.247          1.02            -0.108
1.29            1.85            0.335
0.298           2.04            0.824
-1.04           1.37            1.15
1.1             2.08            1.65
1.52            3.05            2.38
0.078           3.1             3.12
-0.0125         3.09            3.87
1.24            3.88            4.8
0.845           4.42            5.86
0.25            4.58            6.96
0.0463          4.61            8.06
1.37            5.49            9.38
-0.15           5.39            10.7
0.947           6               12.1
1.18            6.75            13.7
-0.791          6.25            15.2
-1.43           5.33            16.5
-1.58           4.32            17.5
1.52            5.29            18.8
-0.208          5.16            20.1
1.36            6.03            21.5
-0.294          5.84            22.9
1.22            6.62            24.5
1.14            7.35            26.3
1.01            8               28.2
0.284           8.18            30.1
1.18            8.93            32.3
-1.43           8.02            34.2
-0.167          7.91            36.1
1.14            8.64            38.2
-1.4            7.74            40
-1.49           6.79            41.7
-0.926          6.2             43.2
-0.575          5.83            44.6
0.978           6.46            46.1
-0.909          5.87            47.5
1.46            6.81            49.2
0.353           7.04            50.8
-1.12           6.32            52.4
-1.12           5.6             53.7
-0.141          5.51            55
0.463           5.8             56.4
-1.1            5.1             57.6
0.591           5.48            59
0.0912          5.54            60.3
-0.47           5.23            61.5
-0.437          4.96            62.7
0.734           5.42            64
-0.343          5.21            65.3
0.836           5.74            66.7
-1.11           5.03            67.9
-0.771          4.54            69
-0.783          4.04            69.9
-0.501          3.72            70.8
-0.569          3.35            71.6
0.765           3.84            72.5
0.568           4.21            73.5
-1.45           3.28            74.3
0.391           3.53            75.2
0.339           3.75            76.1
0.797           4.26            77.1
1.3             5.09            78.3
0.237           5.24            79.6
1.52            6.21            81.1
0.314           6.41            82.6
0.369           6.65            84.2
-0.598          6.26            85.7
-0.905          5.68            87.1
-0.732          5.22            88.3
-1.47           4.27            89.4
0.828           4.8             90.5
0.261           4.97            91.7
0.0473          5               92.9
1.53            5.98            94.3
1.24            6.77            96
-0.0228         6.76            97.6
-0.0453         6.73            99.2
-1.07           6.04            101
-0.345          5.82            102
0.652           6.24            104
1.37            7.12            105
1.15            7.85            107
0.0238          7.87            109
1.43            8.79            111
1.08            9.48            113
1.53            10.5            116
-0.709          10              118
-0.811          9.48            121
-1.06           8.8             123
-1.22           8.02            125
-1.4            7.13            126
0.129           7.21            128
0.199           7.34            130
-0.182          7.22            132
0.135           7.31            133
0.885           7.87            135
0.678           8.31            137
0.922           8.9             139
-1.54           7.91            141
-1.16           7.16            143
-0.632          6.76            145
1.3             7.59            146
-0.67           7.16            148
0.124           7.24            150
-1.19           6.48            151
-0.728          6.01            153
1.22            6.79            154
-1.33           5.94            156
-0.402          5.69            157
-0.532          5.35            159
1.27            6.16            160
0.323           6.37            162
0.428           6.64            163
0.414           6.91            165
-0.614          6.51            166
1.37            7.39            168
0.449           7.68            170
0.55            8.03            172
1.33            8.88            174
-1.2            8.11            176
-0.641          7.7             178
-1.59           6.69            179
1.02            7.34            181
-0.86           6.79            183
-1.55           5.79            184
-0.515          5.46            186
0.352           5.69            187
0.824           6.22            188
1.14            6.94            190
-1.03           6.29            192
-1.13           5.56            193
0.139           5.65            194
0.293           5.84            196
1.08            6.53            197
-1.23           5.75            199
-1.1            5.04            200
-1.17           4.29            201
-0.8            3.78            202
-0.905          3.2             203
-0.0769         3.15            203
-0.323          2.95            204
-0.0186         2.93            205
Press any key to continue . . .

3
훌륭하게 상세한 글쓰기. 그러나, 비교적 좁은 특정 질문 을 설명하기 위해 이것을 편집 하면 집중적 인 답변을 얻는 데 도움이됩니다.
Anindo Ghosh

일반적인 특정 질문을 작성했을 때, 잡음이 심한 가속도계 신호에서 움푹 들어간 곳이 발생했음을 감지하는 방법이 필요합니다. arduino와 같은 마이크로 컨트롤러가 움푹
들어간 곳

움푹 들어간 곳 이벤트는 움푹 들어간 곳에 관계없이 존재하는 진동보다 느리기 때문에 대신 LPF를 사용하고 움푹 들어간 곳 근처로 가면서 멋진 충격을 강화해야합니다. 이동 평균 필터가이를 수행 할 수 있습니다. 삶의 편의성을 높이기 위해 LPF를 측정하기 전에 측정 값의 절대 값을 사용하는 것도 고려할 수 있습니다. 왜냐하면 움푹 들어간 곳은 자동차의 진동 주파수로 변조 된 향상된 엔벨로프 진폭을 가진 단일 패킷으로 특징 지워지기 때문입니다.
Chintalagiri Shashank

업데이트 된 정보 덕분에 이동 평균을 연구 할 것입니다. 현탁 공명은 약 12.5HZ 인 것 같습니다. ?? 하드웨어의 LPF는 내가 생각할 수있는 컷오프가있을 것입니다.
zacharoni16

CSV 파일이나 그와 비슷한 좋은 예를 제공하십시오. 위의 데이터를 사용할 수 있다고 말하면 링크로 작동하지 않는 것 같습니다.
Olin Lathrop 2013

답변:


13

이것은 상당히 직접적인 필터링으로 해결할 수있는 것처럼 보입니다. 원본 데이터는 다음과 같습니다.

개별 이벤트에서 무슨 일이 일어나고 있는지에 대한 세부 수준으로보기에는 너무나 많습니다. 다음은 두 번째 26에서 28 사이의 데이터입니다.

나는 이것을 저역 통과 필터라고 생각했지만 저주파수 신호가 없기 때문에 작동하지 않습니다. 고주파 신호의 진폭이 대신 증가합니다. 다음은 원본에 겹쳐진 로우 패스입니다.

이것은 움푹 들어간 곳이 아닌 동안 신호의 "평균"을 따르지 않습니다. 원래 신호에서이 평균을 빼면 이벤트 동안이 평균보다 훨씬 더 높은 소풍이 남습니다. 달리 말하면, 우리가 정말로 원하는 것은 고역 통과 필터입니다. 우리는 여기에 도착한 방식으로 원본에서 로우 패스를 빼서 그렇게 할 것입니다. 그러나 프로덕션 시스템에서는 명시 적으로 하이 패스 필터링을 통해이를 수행합니다. 어쨌든, 하이 패스 필터링 원본은 다음과 같습니다.

이것은 이제 이벤트를 감지하기위한 명백한 접근법을 지적합니다. 이벤트 중에는 다른 것보다 훨씬 더 많은 신호 진폭이 있습니다. RMS를 계산하고 저역 통과 필터링을 적용하여이를 감지 할 수 있습니다.

전체 데이터를 축소하면 다음과 같습니다.

이것은이 데이터가 무엇을 보여줄지 모르겠지만 데이터의 5 가지 이벤트를 명확하게 식별합니다. 이벤트를보다 자세히 살펴보면 각각의 피크 전후 약 1 초 동안 딥이 낮다는 것을 알 수 있습니다. 즉, RMS 신호를 단순히 임계 값으로 지정하는 것만으로는 충분하지 않은 경우 더 많은 작업을 수행 할 수 있습니다. 예를 들어, 1 초 이내에 가장 낮은 지점을 기준으로 한 지점의 높이를 찾은 간단한 알고리즘은 배경 소음을 더 줄여야합니다. 같은 것을 말하는 또 다른 방법은 1 초 동안 상승을 찾는이 신호를 구별하는 것입니다. 그런 다음 구덩이 이벤트는 이중선으로 감지되어 낮은 피크로 인해 높은 피크가 발생합니다.

이것을 보는 또 다른 방법은 RMS 신호를 대역 전달하는 것입니다. 이미 저역 통과 필터링되었지만 강한 경사로 갑작스러운 이벤트를 찾고 있기 때문에 저주파수 중 일부를 제거하면 배경 소음도 줄어 듭니다.

여기에서 신호를 구체화하는 방법은 많이 있지만, 적어도 첫 번째 패스로 유용한 결과를 얻는 방법을 보여 주었기를 바랍니다.

추가 :

나는 피크의 어느 쪽이 딥을 찾는 것이 효과가 있는지 궁금해서 시도했습니다. 이전 플롯의 RMS로 시작하는 비선형 필터를 사용했습니다. 각 포인트의 값은 이전 초에서 가장 낮은 포인트와 다음 초에서 가장 낮은 포인트를 초과하는 최소값입니다. 결과는 꽤 좋아 보인다 :

5 개의 피크 중 가장 낮은 것이 가장 높은 배경 노이즈보다 3 배 이상 높습니다. 물론이 5 개의 범프는 감지하려는 이벤트를 나타내고 나머지는 그렇지 않다고 가정합니다.

의견에 대한 답변으로 추가 :

시간 도메인에서 필터를 사용했기 때문에 주파수 응답을 직접 알 수 없습니다. 저역 통과 필터의 경우 입력 신호를 COS ^ 2 필터 커널과 관련 시켰습니다. 내가 올바르게 기억한다면 커널의 반경 (중심에서 가장자리까지의 거리)은 몇 100ms입니다. 줄거리가 좋아 보일 때까지 값을 실험했습니다. RMS를 저역 통과 필터링하기 위해 동일한 필터 커널을 사용했지만 이번에는 반경이 약 1 초입니다. 정확히 기억 나지 않습니다. 좋은 결과를 얻을 때까지 실험하십시오.

비선형 필터가 이중선을 감지하지 못했습니다. 내가 말했듯이, 1 초 이내에 현재 지점과 모든 지점 중 가장 낮은 지점의 차이와 1 초 이내에 현재 지점과 모든 지점 중 가장 낮은 지점의 차이점을 발견했습니다. 그런 다음 그 두 분을 가져갔습니다.

내가 사용한 소프트웨어는이 목적으로 해킹 한 프로그램이었습니다. CSV 파일을 읽고 쓰는 다양한 루틴이 이미 있었으므로 필터링 코드 만 있으면됩니다. 이는 매우 간단합니다. 나머지는 CSV 파일을 조작하고 플로팅하기 위해 기존 프로그램으로 수행되었습니다.


이것이 매우 흥미로운 결과입니다. 실용적인 용어로 설명 할 수있는 좋은 방법이 있습니다. 집에 가서이 일을 시작하게되어 기쁩니다! HPF에서 어떤 컷오프 주파수를 사용했는지, RMS 신호의 LPF 컷오프가 완벽하게 보이는지 궁금합니다. 또한 이중선을 감지하는 데 사용한 비선형 필터는 matlab 또는 설계 응용 프로그램에서 수행 했습니까? 나는 이것을 하드웨어에서 디자인하려고합니다. 내가 맞은 5 개의 움푹 들어간 곳과 일치하는 5 개의 피크, 훌륭한 결과! 내가 MATLAB을 가지고 있고 또한 SciDavis 사용하고
zacharoni16

@zach : 귀하의 질문 중 일부를 해결하기 위해 답변을 업데이트하려고합니다. 불행히도 내 대답은 커뮤니티 위키로 변환되었으므로 모드를 먼저 수정하기를 기다리고 있습니다. 이 CW는 무언가에 시간을 할애 할 때 정말 짜증납니다. 갑자기 더 이상 소유하지 않습니다.
Olin Lathrop 2013

@OlinLathrop 편집 할 때 다시 변환하게됩니다. 편집이 끝나면 되돌 리도록 플래그를 지정해야합니다. 나는 지금 그것을 할 것이다. 그러나 당신이 다시 깃발을 써야해도 놀라지 마라. CW에 대한 불만 사항에 대해 4-6 개월마다 한 번씩 CW를 되돌려 야합니다.이 편집 내용이 많고 사용자가 CW가되고 싶지 않은 매우 좁은 상황에 대해 이야기하고 있다고 생각합니다. Tony 또는 다른 상황을 처리하는 것과 비교할 때 이것은 쉽고 깔끔한 절단을 처리하기에 이상적인 깃발에 관한 것입니다. :)
Kortuk

1
@Andrew : 대답의 마지막 단락에서 말했듯이 CSV 파일과 라이브러리 루틴을 조작하여 쉽게 읽고 쓸 수있는 다양한 미리 준비된 프로그램이 있습니다. 그 위에 필터링 코드를 추가하는 것은 빠르고 쉽습니다. 대부분의 필터는 여러 번 실행되는 몇 줄의 코드입니다. 위에서 한 것과 같은 일회성 테스트의 경우 모든 것이 즉시 종료되므로 프로세서를 효율적으로 사용할 필요가 없습니다. 예를 들어, 필요할 때마다 테이블을 작성하는 대신 COS 함수를 호출했습니다.
Olin Lathrop 2013

1
@OlinLathrop 나는 당신이 대답에서 언급 한 것을 보았지만 커스텀 스크립트가 설정되어 있는지, matlab 또는 그것을 실행하기 위해 또는 무엇을했는지 알지 못했습니다. 어떻게하는지 공유 할 수 있습니까? 매혹적인 소리. 통조림 그래픽 라이브러리를 사용하여 출력을 보거나 Excel에서 덤프 및 플로팅하거나 gnuplot / octave 또는 ...를 사용합니까?
akohlsmith

2

가장자리 감지 구덩이에 문제가있을 수 있습니다. 자동차 진동 엔벨로프는 센서에서 보이는 실제 진동이 훨씬 높은 주파수에 있기 때문에 답이있는 곳입니다. RMS to DC를 사용하여 약 15Hz 이상에서 응답하고 저역을 전달합니다.


1000HZ의 전체 센서 대역폭으로 다른 테스트를 수행했으며 Arduino와 직렬로 연결할 수있는 한 빨리 샘플링했습니다. 비슷한 결과를 얻습니다. 약 17HZ 이상의 주파수는 2HZ 및 13HZ의 지배 주파수와 비교할 때 빠르게 소멸됩니다. 가속도계가 대시 보드에 장착되어 있습니다. 서스펜션이 9에서 13HZ로 이동하지 않거나 미친 듯이 튀어 오르고 있습니다. RMS에서 DC로 무엇을 의미하는지 잘 모르겠습니다.
zacharoni16

가속도계는 차량에 어떤 식 으로든 부착되어 있습니다. 어떻게 든 물건을 차대에 볼트로 고정하더라도 볼트는 주파수를 억제하고 증폭시킬 수 있습니다. 자동차는 사물이 여러 주파수에서 진동하기에 충분히 복잡한 짐승입니다. AC 신호를 DC RMS 값으로 변환하는 회로 (및 수학적 알고리즘)가 있습니다. 검색은 하나를 찾아야합니다. 이를 통해 고주파 진동을 진폭으로 전환하여 신호 범위를 생성 할 수 있습니다.
Chintalagiri Shashank

반파 정류기 (다이오드)는 어떻습니까? 그러나 그것은 모든 것을 양의 피크로 변환 할 것입니다, 움푹 패인 사건은 -G를 끌어 당깁니까 아니면 문제가되지 않습니까?
zacharoni16

나는 그것이 문제가 될 것이라고 기대하지 않습니다. 당신의 진동 진폭이 지배적 인 효과가 될만큼 충분히 높은 것 같습니다. 그러나 신호를 살펴보면 작은 구덩이를 놓치지 않기 위해 전파 정류를 제안하는 것이 좋습니다.
Chintalagiri Shashank

Shashack 위에 게시 된 evelope 회로를 추가하면 출력이 크게 변경되지 않았습니다. RC 시정 수를 약 2mS로 선택하고 2mS에서 샘플링합니다. 500 Samples / second 가속도계 전압은 항상 0과 3.3V 사이입니다.
zacharoni16

2

주파수 도메인 필터 또는 임계 값을 찾는 대신 "일반적인"움푹 들어간 곳을 찾기 위해 커널을 만들고이를 실행하는 것이 좋습니다. 템플릿 매칭 기술로 간주되며 마이크로 컨트롤러 플랫폼에 적합합니다.

빠른 검토에 대해서는 http://scribblethink.org/Work/nvisionInterface/vi95_lewis.pdf 를 참조 하십시오. DOBBS, STEVEN E., NEIL M. SCHMITT 및 HALUK S. OZEMEK도 있습니다. "마이크로 컴퓨터에서 실시간 상관 관계를 이용한 템플릿 매칭에 의한 QRS 탐지." 임상 공학 저널 9.3 (1984) : 197-212.

더 강력한 플랫폼을 사용하고 있다면 웨이블릿에 스핀을주는 것이 좋습니다.


고마워 :), 이것은 매우 어려운 것처럼 보입니까, 아니면 뭔가 빠졌습니까?
zacharoni16

단순한 필터보다 더 어렵지만 완료시 원하는 작업을 수행 할 가능성이 높습니다! 꼭 Matlab 또는 R과 같은 방식으로 작동 할 때까지 마이크로 컨트롤러에서 구현하려고 시도하지 마십시오.
스콧 Seidman

"필터"를 실시간으로 실행하려면 모든 시간 단계에서 주파수 도메인 곱셈을 수행하는 것이 아니라 컨볼 루션으로 처리해야 할 것입니다. 교차 상관 (템플릿 일치에 대한 주요 접근 방식)은 임펄스 응답의 시간 스케일이 컨볼 루션 에서처럼 반전되지 않고이 임펄스 응답을 "템플릿"이라고 부르는 것을 제외하고는 동일한 정확한 작동입니다. . 이제 템플릿이 무엇인지 파악하면됩니다.
Scott Seidman

이 답변에 감사드립니다. 현재 기술 수준보다 높은 것으로 보이므로 구현하기 위해 더 많은 연구와 연구를해야합니다. 나는 노력을 주셔서 감사합니다
zacharoni16

2

또 다른 접근법은 움푹 들어간 곳이 실제로 튀어 나와 있는지 확인하기 위해 신호의 이동 분산을 계산하는 것입니다. 다음은 이동 분산 필터에 대한 matlab 함수입니다 .N 점은 넓습니다.

function y=movingvar(X,N)
% y=movingvar(X,N)
% Calculates N-point moving variance of  Vector X
% Highly recommend that N be odd (no error checking)
% Note: first and last N/2 points will be unreliable.
% Output will be a column vector.


X=X(:);
XSQR=X.*X;
convsig=ones(1,N);
y=(conv(convsig,XSQR)-(conv(convsig,X).^2)/N)/(N-1);

y=y(ceil(N/2):length(X)+floor(N/2));

이것이 표준 편차 계산과 비슷합니까?
zacharoni16

p, 방금 제곱
Scott Seidman

1

저의 초기 생각은 저역 통과 필터가 잘못된 유형의 필터 일 수 있다는 것입니다. 움푹 들어간 곳은 본질적으로 스텝 함수 또는 구형파와 같은 고주파 이벤트입니다. 50Hz로 필터링 된 데이터를 보면 구덩이에 대한 정보를 잃어 버렸다고 생각할 수 있습니다. 구덩이 이벤트와 별다른 차이가없는 동일한 구불 구불 한 것처럼 보입니다. 먼저 고역 통과 필터를 사용한 다음 훨씬 더 높은 주파수의 저역 통과 필터를 사용합니다. 가속도계가 이미 저역 통과 필터링 된 경우 저역 통과 필터를 모두 피할 수 있습니다.

고역 통과 필터링 된 데이터가 있으면 임계 값을 적절히 설정 한 간단한 비교기가 구덩이로 인한 가속도 데이터의 피크를 찾아서 계산할 수 있다고 생각합니다.


RC 50HZ 필터를 벗기고 가속도계는 기본 500HZ 또는 1000HZ LPF를 사용하는데, 이는 기계적 진동을 얻기에 충분히 높아야합니다. 샘플링 속도를 100HZ에서 1000HZ로 늘리고 더 많은 데이터를 게시하겠습니다. 통찰력 주셔서 감사합니다
zacharoni16

나는 사건이 어떻게 필터에 혼란 :( 유사한 데이터를 가져 오는 것 같다하고 깊은 구멍을 분리하고 범프, 전체 가속도계의 대역폭과 빠른 샘플링을 사용
zacharoni16

나는 저역 통과 필터가 아니라 고역 통과 필터를 사용한다고 말했다. 필터링되지 않은 데이터의 FFT를보고 싶습니다.
AngryEE 2013

가속도계에는 1000HZ LPF가 내장되어 있으며 변경할 수 없습니다. 필터링되지 않은 데이터의 FFT를 곧 게시하겠습니다.
zacharoni16

당신은 그것을 바꿀 필요가 없습니다-당신은 움푹 들어간 곳을 쳤을 때 급격한 가속에서 오는 높은 주파수를 원하지만 정상적인 주행의 완만 한 흔들림은 아닙니다. 귀하의 신호는 몇 가지 주요 일시적인 스파이크가있는 저주파수 진동으로 특징 지워 보입니다. 고주파수가 빠른 과도 스파이크를 포착하기를 원하지만 일정한 저주파수를 제거하려고합니다. 따라서 50Hz 또는 100Hz 미만의 모든 것을 필터링해야합니다.
AngryEE 2013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.