#ifndef EMG_UTIL_H #define EMG_UTIL_H // SOS 绯绘暟锛�20-450 Hz 甯﹂�氾紝fs=1000Hz锛� // const double sos[2][6] = { // {1.0000000000, -2.0000000000, 1.0000000000, 1.0, -1.8794729180, 0.8944729180}, // {1.0000000000, -2.0000000000, 1.0000000000, 1.0, -1.9657267688, 0.9676167688} // }; // 宸寸壒娌冩柉婊ゆ尝鍣ㄥ弬鏁癝OS 绯绘暟锛�20-450 Hz 甯﹂�氾紝fs=1000Hz锛� const double sos[2][6] = { {1.0000000000, 2.0000000000, 1.0000000000, 1.0, 1.5597000000, 0.6416000000}, {1.0000000000, -2.0000000000, 1.0000000000, 1.0, -1.8225000000, 0.8373000000} }; // 鐢� MATLAB 鐢熸垚骞跺浐鍖栧埌 C 鐨勭郴鏁帮紙50Hz 闄锋尝锛宖s=1000Hz锛夐櫡娉㈡护娉⒙峰弬鏁� // const double NOTCH_B[3] = { 0.961538461538462, -1.846153846153846, 0.961538461538462 }; // const double NOTCH_A[3] = { 1.000000000000000, -1.846153846153846, 0.876923076923077 }; const double NOTCH_B[3] = {0.9955, -1.8936, 0.9955}; const double NOTCH_A[3] = {1.0000, -1.8936, 0.9911}; typedef struct { double b[3]; // 鍒嗗瓙绯绘暟: b0, b1, b2 double a[3]; // 鍒嗘瘝绯绘暟: a0, a1, a2 (a0 閫氬父褰掍竴鍖栦负 1) double x1, x2; // 杈撳叆寤惰繜鍗曞厓: x[n-1], x[n-2] double y1, y2; // 杈撳嚭寤惰繜鍗曞厓: y[n-1], y[n-2] } NotchFilter; float f0 = 50.0f;//宸ラ float q = 30.0f;//璐ㄩ噺绯绘暟 float low_cut = 20.0f; // 浣庢埅姝㈤鐜� float high_cut = 450.0f; // 楂樻埅姝㈤鐜� int order = 4; // 婊ゆ尝鍣ㄩ樁鏁� // 宸寸壒娌冩柉婊ゆ尝鍣ㄧ粨鏋勪綋锛坉ouble绫诲瀷锛� typedef struct { double x1, x2; double y1, y2; } BiquadState; // Symlet 4 (sym4) 婊ゆ尝鍣ㄧ郴鏁帮紙鏍囧噯鍖栵級 static double sym4_h[8] = { 0.0266700579010166, 0.0607514995432352, -0.0656160944756398, -0.1498879107562273, 0.4829629131445341, 0.8365163037378608, 0.2242848007341553, -0.1077300958383618 }; static double sym4_g[8] = { -0.1077300958383618, -0.2242848007341553, 0.8365163037378608, -0.4829629131445341, -0.1498879107562273, 0.0656160944756398, 0.0607514995432352, -0.0266700579010166 }; void emg_denoised(double *emg_raw, int length, int fs, double *emg_denoised); #endif // EMG_UTIL_H