Phân tích đặc điểm dữ liệu của gia tốc kế và thiết kế bộ lọc


13

Tôi có khoảng 32 giây dữ liệu gia tốc của kịch bản lái xe cơ bản 25MPH đường thông thường cùng với việc đánh khoảng 7 ổ gà và một đoạn đường gồ ghề. Gia tốc kế được gắn trên bảng điều khiển của xe tôi bằng băng keo hai mặt.

Vấn đề: Tôi có tất cả dữ liệu gây nhiễu từ gia tốc kế và tôi cần thực hiện một cách đơn giản để phát hiện sự kiện ổ gà đã xảy ra. Dưới đây là một số biểu đồ dữ liệu trong miền thời gian và FFT. Gia tốc kế đang đo bằng GForce

Về cơ bản tôi muốn arduino của tôi biết một ổ gà đã xảy ra với độ chính xác khá lớn và không sử dụng toán học và kỹ thuật cấp độ sau đại học.

Gia tốc kế được lấy mẫu ở 100hz có LỌC PASS THẤP RC 50HZ đơn giản TRÊN Z AXIS

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

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

CẬP NHẬT: Đây là băng thông đầy đủ RAW của gia tốc kế 1000HZ được lấy mẫu ở tốc độ lấy mẫu cao nhất tôi có thể nhận được trên Arduino. Tải xuống tệp CSV trực tiếp: Khoảng 112 giây dữ liệu

http://hamiltoncomputer.us/RAWUNFILTEREDFULLBANDWIDTH500HZ.csv

Dấu vết đen là dữ liệu Gia tốc kế chưa được lọc RAW: Dấu vết màu xanh được lọc bởi bộ lọc bandstop dựa trên tần số cực lớn được tìm thấy trong FFT, Thống trị 2HZ và 12HZ.

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

Sự kiện ổ gà trông như thế này trong miền thời gian: nhập mô tả hình ảnh ở đây

không chắc chắn thành phần 10 đến 15HZ trong FFT là ổ gà thực sự, hay nó là bánh xe của bánh xe so với đường, hay đó là tần số cộng hưởng của xe?

FFT:

FFT

Có vẻ như đó là sự kiện ổ gà thực tế, đây là HPF @ 13HZ Các tính năng vượt trội của ổ gà dường như được tăng cường

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

Tôi muốn có thể phát hiện và đếm ổ gà trong thời gian thực

Có vẻ như nó là phản trực giác, hệ thống treo sẽ di chuyển chậm hơn rất nhiều so với 10 đến 13 HZ sẽ gây ra chứng say tàu xe

CẬP NHẬT:

Theo đề xuất của AngryEE, tôi đã sử dụng toàn bộ băng thông của gia tốc kế 1000HZ và tốc độ lấy mẫu tối đa tôi có thể có trên arduino.

FFT:

FFT UNFILTERED DATA FULL BANDWIDTH

đây là một mẩu dữ liệu mẫu của sự kiện ổ gà và một số va chạm và tiếng ồn xung quanh nó:

SỰ KIỆN DỮ LIỆU DỮ LIỆU KHÔNG GIỚI HẠN

Đã thêm mạch dò đường bao Diode, đầu ra trông giống nhau ... Gia tốc kế luôn xuất 0 đến 3,3Volts không âm ... nhập mô tả hình ảnh ở đây

CẬP NHẬT:

Từ nhiều thử nghiệm trên đường, tôi chưa bao giờ vượt quá 1.6 MPH trong xe của mình trên trục Z, tôi đã sử dụng rand () để tạo ra khả năng tăng tốc giả của Gforce.

Ý tưởng của tôi là nếu tôi có thể nhìn vào 1 đến 3 cửa sổ dữ liệu, tôi có thể tính toán độ dịch chuyển của trục Z, nhưng tôi lo lắng về độ trôi của gia tốc kế và lỗi trong tích hợp. Tôi không cần phải chính xác 90% ở đây,> 70% sẽ tốt, nhưng nếu tôi nhìn vào sự dịch chuyển ở một đến ba giây một lần thì điều đó có thể làm được trong thời gian thực không? Bằng cách này tôi có thể thấy nếu độ dịch chuyển lớn hơn như 1 inch, 2 inch, 5 inch. Sự dịch chuyển càng lớn thì vết sưng hoặc ổ gà càng cứng:

Bạn có thể kiểm tra xem tôi có làm đúng không, về cơ bản tôi đã thiết lập trên máy tính để bàn của mình, sử dụng rand () để tạo gia tốc ngẫu nhiên từ -1,6 đến 1,6 G, ghi lại 3 giây dữ liệu @ tốc độ lấy mẫu 50HZ mô phỏng

Nếu giống như bạn chạy * nix, tôi đang sử dụng Sleep () từ Windows.h để thực hiện độ trễ 20mS, tốc độ lấy mẫu 50HZ

Tôi chỉ muốn xem mã có phù hợp với bạn không, tôi chưa thực hiện bộ đệm cicular, tôi hơi bối rối về cách triển khai nó: mã nhận xét, là từ lớp tôi đang làm việc cho nó , nhưng tôi chưa hiểu nó 100%. Một bộ đệm tròn sẽ cho phép di chuyển liên tục các cửa sổ dữ liệu phải không?

#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;
}

Chạy mẫu:

    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
Viết chi tiết độc đáo. Tuy nhiên: Chỉnh sửa câu hỏi này để nêu một câu hỏi cụ thể, tương đối hẹp , sẽ giúp có được câu trả lời tập trung.
Anindo Ghosh

Đã viết một câu hỏi cụ thể chung chung, tôi cần một cách để phát hiện ra rằng một ổ gà đã xảy ra từ một tín hiệu accelometer thô. Trích xuất các tính năng hữu ích hoặc phương pháp phát hiện cho phép một vi điều khiển như arduino phát hiện sự kiện ổ gà đã xảy ra trong thời gian thực
zacharoni16

Vì sự kiện ổ gà của bạn chậm hơn các rung động không phân biệt ổ gà, nên có lẽ bạn nên LPF thay vào đó và tăng cường vết sưng đẹp khi bạn đến gần ổ gà. Một bộ lọc trung bình di chuyển có thể có thể làm điều đó. Để làm cho cuộc sống dễ dàng hơn, bạn cũng có thể xem xét sử dụng giá trị abs của phép đo thay vì trước khi LPF, vì ổ gà của bạn thậm chí có vẻ được đặc trưng bởi một gói duy nhất với biên độ bao được tăng cường, được điều chỉnh bởi tần số rung của xe.
Chintalagiri Shashank

Thông tin cập nhật, cảm ơn và tôi sẽ làm việc trên mức trung bình di động, cộng hưởng của hệ thống treo dường như là khoảng 12,5HZ ??? LPF trong phần cứng sẽ có một điểm dừng ở đó tôi sẽ giả sử
zacharoni16

Cung cấp một tệp CSV ví dụ tốt hoặc một cái gì đó. Nơi bạn nói dữ liệu có sẵn ở trên dường như không hoạt động như một liên kết.
Olin Lathrop

Câu trả lời:


12

Điều này có vẻ như có thể được giải quyết bằng cách lọc khá đơn giản. Đây là dữ liệu gốc của bạn:

Đó là quá nhiều để xem những gì diễn ra trong một sự kiện riêng lẻ ở mức độ chi tiết phù hợp ở đây. Đây chỉ là dữ liệu từ ngày 26 đến 28:

Ban đầu tôi đã nghĩ đến bộ lọc thông thấp này, nhưng nó không hoạt động vì không có tín hiệu tần số thấp trong đó. Thay vào đó, biên độ của tín hiệu tần số cao tăng lên. Đây là một đường chuyền thấp chồng lên trên bản gốc:

Lưu ý điều này tuân theo "mức trung bình" của tín hiệu khá tốt không phải trong sự kiện ổ gà. Nếu chúng ta trừ đi mức trung bình này từ tín hiệu ban đầu, chúng ta sẽ có các chuyến du ngoạn cao hơn mức trung bình này trong suốt sự kiện so với mức khác. Nói cách khác, những gì chúng ta thực sự muốn là một bộ lọc thông cao. Chúng tôi sẽ làm điều đó bằng cách trừ đi mức thấp từ bản gốc vì đó là cách chúng tôi đã đến đây, nhưng trong một hệ thống sản xuất, bạn sẽ làm điều này bằng cách lọc rõ ràng thông qua cao. Dù sao, đây là bản gốc vượt qua được lọc:

Điều này bây giờ chỉ ra một cách tiếp cận rõ ràng để phát hiện sự kiện. Có rất nhiều biên độ tín hiệu trong sự kiện hơn so với khác. Chúng tôi có thể phát hiện điều này bằng cách tính toán RMS và áp dụng một số bộ lọc thông thấp:

Thu nhỏ lại toàn bộ dữ liệu, chúng tôi thấy:

Điều này xác định rõ ràng năm sự kiện trong dữ liệu, mặc dù tôi không biết liệu đó là những gì dữ liệu này được cho là hiển thị. Nhìn vào các sự kiện kỹ hơn, bạn nhận thấy rằng mỗi trong số chúng có mức giảm thấp khoảng 1 giây trước và sau các đỉnh. Điều này có nghĩa là có thể được thực hiện nhiều hơn nếu chỉ đơn giản là đập tín hiệu RMS vì hiện tại nó không đủ tốt. Ví dụ, một thuật toán đơn giản tìm chiều cao của một điểm so với mức thấp nhất trong vòng 1 giây sẽ làm giảm thêm nhiễu nền. Một cách khác để nói về điều tương tự là phân biệt tín hiệu này để tìm kiếm sự gia tăng trong khoảng thời gian 1 giây. Một sự kiện ổ gà sau đó sẽ được phát hiện bởi một cặp đôi, có nghĩa là một đỉnh cao được bao bọc bởi một đỉnh thấp.

Một cách khác để xem xét điều này là băng thông qua tín hiệu RMS. Nó đã được lọc thông thấp, nhưng vì bạn đang tìm kiếm các sự kiện bất ngờ có độ dốc mạnh, nên việc tắt một số tần số thấp cũng có tác dụng giảm nhiễu nền.

Có rất nhiều cách để tinh chỉnh tín hiệu từ đây, nhưng hy vọng tôi đã chỉ ra cách để có được ít nhất một kết quả hữu ích đầu tiên.

Thêm:

Tôi đã tò mò về việc tìm kiếm các điểm ở hai bên của một đỉnh sẽ hoạt động tốt như thế nào, vì vậy tôi đã thử nó. Tôi đã sử dụng bộ lọc phi tuyến tính bắt đầu với RMS từ âm mưu trước đó. Giá trị của mỗi điểm là mức tối thiểu bao nhiêu so với điểm thấp nhất trong giây trước và điểm thấp nhất trong giây tiếp theo. Kết quả có vẻ khá tốt:

Thấp nhất trong 5 đỉnh cao hơn 3 lần so với nhiễu nền cao nhất. Tất nhiên, điều này là giả sử 5 lỗi này đại diện cho các sự kiện bạn muốn phát hiện và phần còn lại thì không.

Đã thêm vào để trả lời các bình luận:

Tôi đã thực hiện các bộ lọc trong miền thời gian, vì vậy tôi không biết trực tiếp đáp ứng tần số. Đối với bộ lọc thông thấp, tôi kết hợp tín hiệu đầu vào với hạt nhân bộ lọc COS ^ 2. Nếu tôi nhớ đúng, bán kính (khoảng cách từ tâm đến cạnh) của hạt nhân là vài 100 ms. Tôi đã thử nghiệm với giá trị cho đến khi cốt truyện có vẻ tốt. Để bộ lọc thông thấp RMS, tôi đã sử dụng cùng một hạt nhân bộ lọc nhưng lần này với bán kính khoảng một giây. Tôi không nhớ chính xác. Thử nghiệm cho đến khi bạn nhận được kết quả tốt.

Bộ lọc phi tuyến tính đã không phát hiện các chuỗi kép. Như tôi đã nói, tôi đã tìm thấy sự khác biệt giữa điểm hiện tại và điểm thấp nhất trong tất cả các điểm trong vòng 1 giây trước đó và cũng là sự khác biệt giữa điểm hiện tại và điểm thấp nhất trong tất cả các điểm trong vòng 1 giây sau đó. Sau đó tôi lấy phút của hai người đó.

Phần mềm tôi sử dụng là một chương trình tôi đã hack cho mục đích này. Tôi đã có các thói quen khác nhau để đọc và ghi tệp CSV, vì vậy tất cả những gì tôi phải viết là mã lọc, rất đơn giản. Phần còn lại được thực hiện với các chương trình có sẵn mà tôi có để thao tác và vẽ các tệp CSV.


WOW đây là kết quả rất thú vị, bạn có một cách tuyệt vời để giải thích mọi thứ theo cách thực tế và tôi rất hào hứng khi về nhà và bắt đầu làm việc này! Tôi tò mò về tần số cắt mà bạn đã sử dụng trong HPF và ngưỡng LPF cho tín hiệu RMS trông hoàn hảo. Ngoài ra, bộ lọc phi tuyến tính mà bạn đã sử dụng để phát hiện các bộ đôi, bạn đã làm điều đó trong MATLAB hoặc một ứng dụng thiết kế? Tôi cũng muốn thử thiết kế phần cứng này, 5 đỉnh bạn đang trùng với 5 ổ gà tôi đạt được, kết quả tuyệt vời! Tôi có MATLAB và cũng đang sử dụng SciDavis
zacharoni16

@zach: Tôi sẽ cố gắng cập nhật câu trả lời của tôi để giải quyết một số câu hỏi của bạn. Thật không may, câu trả lời của tôi đã được chuyển đổi sang wiki cộng đồng, vì vậy tôi đang chờ một mod để sửa nó trước. Điều CW này thực sự hấp dẫn khi bạn dành thời gian cho một cái gì đó, sau đó đột nhiên bạn không sở hữu nó nữa.
Olin Lathrop

@OlinLathrop Bạn sẽ có nó chuyển đổi trở lại khi bạn chỉnh sửa nó. Bạn nên gắn cờ tôi để hoàn nguyên nó sau khi chỉnh sửa xong. Tôi sẽ làm điều đó ngay bây giờ, nhưng đừng ngạc nhiên nếu bạn phải gắn cờ lại. Về lưu ý phàn nàn về CW, chúng tôi phải hoàn nguyên CW một lần sau mỗi 4 - 6 tháng, tôi nghĩ bạn đang nói về một trường hợp rất hẹp trong trường hợp có nhiều chỉnh sửa này và người dùng không muốn bị CW, và so với việc đối phó với Tony hoặc một số tình huống khác, đây là về lá cờ lý tưởng để giải quyết, cắt dễ dàng và sạch sẽ. :)
Kortuk

1
@Andrew: Như tôi đã nói trong đoạn cuối câu trả lời của mình, tôi có nhiều chương trình đóng hộp khác nhau thao túng các tệp CSV và thói quen thư viện giúp bạn dễ đọc và viết chúng. Thêm mã lọc ở trên đó là nhanh chóng và dễ dàng. Hầu hết các bộ lọc chỉ là một vài dòng mã được thực thi nhiều lần. Đối với một lần thử nghiệm, giống như những gì tôi đã làm ở trên, không cần sử dụng hiệu quả bộ xử lý vì mọi thứ kết thúc ngay lập tức. Ví dụ, tôi đã gọi hàm COS bất cứ khi nào cần thiết thay vì xây dựng bảng.
Olin Lathrop

1
@OlinLathrop Tôi đã thấy những gì bạn đã đề cập trong câu trả lời nhưng tôi không biết nếu bạn có một số tập lệnh tùy chỉnh được thiết lập, có thể là matlab hoặc một cái gì đó để chạy nó mặc dù hoặc những gì bạn đã làm. Bạn có thể chia sẻ cách bạn đang làm nó? Nghe có vẻ hấp dẫn. Bạn đang sử dụng các thư viện đồ họa đóng hộp để xem đầu ra, chỉ cần kết xuất và vẽ trong Excel hoặc sử dụng gnuplot / octave hoặc ...?
akohlsmith

2

Cạnh phát hiện ổ gà có thể yêu cầu sự cố. Phong bì rung xe là nơi câu trả lời nằm, vì các rung động thực tế mà cảm biến nhìn thấy có tần số cao hơn nhiều. Tôi sẽ đi với RMS tới DC, đáp ứng ở khoảng 15Hz hoặc cao hơn và vượt qua điều đó.


Chỉ cần thực hiện một thử nghiệm khác với băng thông cảm biến đầy đủ 1000HZ và lấy mẫu nhanh nhất có thể qua serial với Arduino. Nhận kết quả tương tự. Bất kỳ tần số nào trong khoảng 17HZ đều nhanh chóng biến mất so với tần số thống trị của 2HZ và 13HZ tôi vẫn không nhận được từ thứ 9 đến 13,5HZ đến từ đâu. Gia tốc kế được gắn trên bảng điều khiển, Hệ thống treo rõ ràng không di chuyển ở mức 9 đến 13HZ hoặc tôi sẽ bị dội lại như điên. Tôi không chắc ý của bạn về RMS đối với DC là gì?
zacharoni16

Gia tốc kế của bạn được gắn theo một cách nào đó vào xe. Ngay cả khi bạn bằng cách nào đó đã bắt vít điều đó vào bánh xe của bạn, các bu lông có thể triệt tiêu và khuếch đại tần số. Một chiếc xe hơi là một con thú đủ phức tạp để mọi thứ rung động ở nhiều tần số khác nhau. Có các mạch (và có thể là các thuật toán toán học) chuyển đổi tín hiệu AC thành giá trị DC RMS của nó. Một tìm kiếm nên tìm một. Điều đó có thể giúp bạn tạo đường bao tín hiệu bằng cách biến các dao động tần số cao thành biên độ của chúng.
Chintalagiri Shashank

Điều gì về một bộ chỉnh lưu nửa sóng (diode)? Nhưng điều đó sẽ chuyển đổi mọi thứ thành các đỉnh dương, sự kiện ổ gà kéo -G hoặc điều này sẽ không thành vấn đề?
zacharoni16

Tôi không mong đợi nó sẽ là một vấn đề. Biên độ rung của bạn dường như đủ cao để trở thành hiệu ứng nổi trội. Tuy nhiên, nhìn vào các tín hiệu của bạn, tôi đề nghị chỉnh lưu toàn bộ sóng thay vì để tránh bỏ qua các ổ gà nhỏ hơn.
Chintalagiri Shashank

Shashack Đã thêm mạch phong bì được đăng ở trên, đầu ra không thay đổi nhiều. Tôi đã chọn hằng số thời gian RC là khoảng 2mS, tôi đang lấy mẫu ở mức 2mS 500 Mẫu / giây Điện áp gia tốc luôn nằm trong khoảng từ 0 đến 3,3V mặc dù ... không bao giờ bị âm nên diode không hoạt động?
zacharoni16

2

Thay vì tìm kiếm bộ lọc miền tần số hoặc ngưỡng, tôi khuyên bạn nên thử đưa ra một hạt nhân cho ổ gà "điển hình" và thực hiện tương quan chạy với nó. Nó sẽ được coi là một kỹ thuật khớp mẫu và dường như sẽ tự cho mình mượn một nền tảng vi điều khiển.

Xem http://scribeblethink.org/Work/nvisionInterface/vi95_lewis.pdf để xem xét nhanh và có thể DOBBS, STEVEN E., NEIL M. SCHMITT và HALUK S. OZEMEK. "Phát hiện QRS bằng cách khớp mẫu bằng cách sử dụng tương quan thời gian thực trên máy vi tính." Tạp chí kỹ thuật lâm sàng 9.3 (1984): 197-212.

Nếu bạn đang ở trên một nền tảng mạnh mẽ hơn, tôi khuyên bạn nên cung cấp cho các bước sóng.


Cảm ơn :), Điều này dường như rất khó để làm, hoặc tôi đang thiếu một cái gì đó?
zacharoni16

Khó hơn một bộ lọc đơn giản, nhưng nhiều khả năng nó sẽ làm những gì bạn muốn nó làm khi bạn hoàn thành! Bằng mọi cách, đừng cố thực hiện nó trên một vi điều khiển cho đến khi bạn làm cho nó hoạt động trong một cái gì đó như Matlab hoặc R
Scott Seidman

Để chạy "bộ lọc" của bạn trong thời gian thực, có lẽ bạn sẽ xử lý nó như một phép chập thay vì thực hiện phép nhân miền tần số ở mỗi bước. Một mối tương quan chéo (một cách tiếp cận chính để khớp mẫu) sẽ là hoạt động chính xác như nhau, ngoại trừ thang thời gian của đáp ứng xung sẽ không bị đảo ngược vì nó sẽ ở dạng chập và chúng ta sẽ gọi phản hồi xung này là "mẫu" . Bây giờ, bạn chỉ cần tìm ra mẫu đó cần là gì.
Scott Seidman

Cảm ơn câu trả lời này, tôi sẽ phải nghiên cứu và nghiên cứu nhiều hơn nữa để thực hiện nó vì nó dường như vượt quá trình độ kỹ năng hiện tại của tôi. Tôi đánh giá cao nỗ lực mặc dù
zacharoni16

2

Một cách tiếp cận khác sẽ là tính toán phương sai di chuyển của tín hiệu của bạn để xem ổ gà có thực sự ló ra không. Đây là hàm MATLAB cho bộ lọc phương sai di chuyển, N điểm rộng - một cách khéo léo (nếu tôi phải tự nói như vậy) bằng cách sử dụng tích chập để tính toá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));

Điều này sẽ tương tự như một tính toán độ lệch chuẩn?
zacharoni16

yup, chỉ bình phương
Scott Seidman

1

Suy nghĩ ban đầu của tôi là bộ lọc thông thấp có thể là loại bộ lọc sai sử dụng. Ổ gà về cơ bản là một sự kiện tần số cao - như hàm bước hoặc sóng vuông. Chỉ cần nhìn vào dữ liệu được lọc 50Hz khiến tôi nghĩ rằng bạn đang mất thông tin về ổ gà - tất cả trông giống như những tiếng cười khúc khích không có sự phân biệt đáng kể nào cho sự kiện ổ gà. Trước tiên tôi sẽ sử dụng bộ lọc thông cao, sau đó là bộ lọc thông thấp với tần suất cao hơn nhiều. Bạn có thể tránh bộ lọc thông thấp hoàn toàn nếu gia tốc kế của bạn đã được lọc thông thấp.

Khi bạn có dữ liệu được lọc thông cao, tôi nghĩ rằng một bộ so sánh đơn giản với ngưỡng được đặt phù hợp sẽ chọn ra các đỉnh trong dữ liệu tăng tốc do ổ gà gây ra và cho phép bạn đếm chúng.


Tôi sẽ tháo bộ lọc RC 50HZ sau đó gia tốc kế sẽ sử dụng LPF 500HZ hoặc 1000HZ mặc định, đủ cao để có được rung động cơ học. Tôi sẽ tăng tốc độ mẫu từ 100HZ lên 1000HZ và đăng thêm dữ liệu. Cảm ơn vì sự sáng suốt
zacharoni16

Tôi đã sử dụng toàn bộ băng thông của gia tốc kế và lấy mẫu nhanh hơn, dường như nhận được dữ liệu tương tự :( điều này gây nhầm lẫn về cách lọc và cách ly ổ gà và các sự kiện va chạm
zacharoni16

Tôi đã nói sử dụng bộ lọc pass CAO chứ không phải bộ lọc thấp. Tôi muốn thấy một FFT của dữ liệu chưa được lọc.
AngryEE

Chà, gia tốc kế có LPF 1000HZ tích hợp và tôi không thể thay đổi điều đó. Tôi sẽ sớm đăng nó FFT của dữ liệu chưa được lọc
zacharoni16

Bạn không cần phải thay đổi điều đó - bạn muốn tần số cao đến từ khả năng tăng tốc đột ngột khi bạn chạm vào ổ gà nhưng không phải lắc lư nhẹ nhàng khi đi xe bình thường. Tín hiệu của bạn dường như được đặc trưng bởi một rung động tần số thấp với một số đột biến chính thoáng qua. Bạn muốn các tần số cao để thu được các xung thoáng qua nhanh nhưng bạn muốn từ chối các tần số thấp không đổi. Vì vậy, có lẽ bạn nên lọc ra mọi thứ 50Hz hoặc 100Hz.
AngryEE
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.