
前言:
心电图是被记录在布满大小方格的纸上,所以想要知道心电图怎么看,首要的是知道这些格子代表的意义。这些方格中每一条细竖线相隔1mm,每一条细横线也是相隔1mm,它们围成了1mm见方的小格。粗线是每五个小格一条,每条粗线之间相隔就是5mm,横竖粗线又构成了大方格。
心电图记录纸是按照国际规定的标准速度移动的,移动速度为25mm/s,也就是说横向的每个小细格代表0.04s;每两条粗线之间的距离就是代表0.2s。
国际上对记录心电图时的外加电压也是有规定的,即外加1mV电压时,基线就应该准确地抬高10个小格,也就是说,每个小横格表示0.1mV,而每个大格就表示0.5mV,每两个大格就代表了这1mV。
特点:
- 走纸速度固定:25mm/s
- 一屏显示的数据量不确定;
- 以下采用的是心电(ECG)的知识,填充的是心音(PCG)的数据,所以采样率是8000;
1、Android实现:
网格图:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class GridView extends View {
private int width, height;
private int row = 5;
private Paint paint;
public GridView(Context context) {
this(context, null);
}
public GridView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public GridView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
}
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
// super.onLayout(changed, left, top, right, bottom);
width = getWidth();
height = getHeight();
}
protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);
paint.setStrokeWidth(2);
drawGird(canvas, row * 5, Color.parseColor("#D7D7D7"));
paint.setStrokeWidth(4);
drawGird(canvas, row, Color.parseColor("#D7D7D7"));
}
private void drawGird(Canvas canvas, int cols, int color) {
paint.setColor(color);
float rowSpace = height * 1f / cols;
//画竖线
for (int i = 0; i * rowSpace <= width; i++) {
canvas.drawLine(i * rowSpace, 0, i * rowSpace, height, paint);
}
//画横线
for (int i = 0; i <= cols; i++) {
canvas.drawLine(0, i * rowSpace, width, i * rowSpace, paint);
}
}
// @Override
// protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// super.onSizeChanged(w, h, oldw, oldh);
// width = w;
// height = h;
// invalidate();
// }
}
波形图:
package com.kl.analyze.view.wave;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import com.kl.common.base.BaseApp;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class AudioWaveView extends SurfaceView implements Callback, Runnable, Serializable {
private final List<Short> pointList = Collections.synchronizedList(new LinkedList<>());
private Paint mPaint;
private SurfaceHolder mHolder;
private int mWidth = 0;
private int mCenterY = 0;
//网格颜色
protected int mWaveColor = com.kl.common.R.color.colorPrimary;
public float[] points;
private boolean isRunning = false;
private boolean isDraw = false;
List<Short> nativeDatas = null;
volatile ThreadPoolExecutor singleThreadExecutor;//单线程池
private double zoom;//每一毫米所占像素(mm/px)
private float gapX = 0.2f;// x轴每个点所占的像素(px)
private int xSize = 0;// x轴能绘制的点的数量
private final int FILTER_SIZE = 50;//采样率太高,数据抽稀
public void run() {
while (isRunning) {
if (isDraw) {
drawFrame();
} else {
Thread.yield();
}
}
}
public void addWaveData(short[] waveDataArray) {
if (!isRunning || waveDataArray == null) {
return;
}
if (nativeDatas == null) {
nativeDatas = new ArrayList<>();
}
for (short waveData : waveDataArray)<

最低0.47元/天 解锁文章
602

被折叠的 条评论
为什么被折叠?



