Android平台的IIR工频干扰陷波器

转载请标明出处:http://blog.csdn.net/sctu_vroy/article/details/45846971


功能:导入信号数据,对原信号进行50Hz陷波处理,并将结果绘制成波形图……滤波器类型包括:巴特沃斯、切比雪夫Ⅰ型、切比雪夫Ⅱ型

设计步骤:

第一步:通过MATLAB设计滤波器,并导出滤波器参数

打开MATLAB中的FDA Tool(Filter Design & Analysis),设置好参数,点击"Design Filter"即可:

Android平台的IIR工频干扰陷波器_第1张图片

点击工具栏中"Targets"即可以头文件格式导出滤波器参数(如xxx.h),点击“Edit”可切换单阶节或双阶节(默认),切换选择单阶节,导出滤波器参数:

 	//巴特沃斯滤波器参数
	static final double[] BUTTER_B = {
		0.9899359622368,   -7.532029056607,    25.45032400023,   -49.84830016096,
	      61.88022925884,   -49.84830016096,    25.45032400023,   -7.532029056607,
	     0.9899359622368
	};  // 传递函数分子数组
	static final double[] BUTTER_A = {
		1,   -7.589362101251,    25.57922249866,   -49.97416107749,
	      61.87976151085,   -49.72205392803,    25.32179196493,   -7.475081328367,
	     0.9799732093296
	};  // 传递函数分母数组

第二步:根据直接型IIR滤波器原理,设计滤波器算法

传递函数:

差分方程:

50Hz陷波算法流程图:(基于差分方程的递推算法(注:length为数据总数;i为滤波器阶数)

Android平台的IIR工频干扰陷波器_第2张图片

第三步:继承异步类AsyncTask,编写异步任务,异步执行滤波操作

/**
* 异步进行50Hz带阻滤波
*/
private class execFilterTask extends AsyncTask {
	private ProgressDialog dialog = null;
	private LineGraphView resView = null; // 声明一个绘图类对象
	@Override
	protected void onPreExecute() { // 执行后台任务前,显示一个进度条对话框,提示用户
		super.onPreExecute();
		dialog = DialogUtil.showDialog(BandStopActivity.this, "正在进行滤波处理", "请稍候……");
	}
	@Override
	protected String doInBackground(Integer... params) { // 执行后台任务
		double[] result = null;
		result = DealFilter(params);  // 滤波函数
		resView = displayResult(result);  // 根据滤波后的数据计算返回一个绘图类对象
		return null;
	}
	@Override
	protected void onPostExecute(String result) { // 后台任务结束后,将绘图类对象动态加载到UI页面
		super.onPostExecute(result);
		llResult.setVisibility(View.VISIBLE);
		//移除之前所有子控件,才能重新写入一个新的LineGraphView
		llResult.removeAllViews();
		LinearLayout.LayoutParams lp = new   LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
		ViewGroup.LayoutParams.MATCH_PARENT);
		llResult.addView(resView, lp);
		DialogUtil.dismiss(dialog);
		btnSave.setVisibility(View.VISIBLE);
	}
}
***滤波函数:

double[] dealResult = null;
double x0, y0 = 0;
double[] w0 = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}; // 缓冲滤波运算中的中间值
dealResult = new double[arrRes.length]; // 创建新数组存放滤波后数据
/**
* 巴特沃斯50Hz陷波器算法
*/
if(type == BUTTERWORTH) {
	for(int i = 0; i < arrRes.length; i++) {
		x0 = arrRes[i]; // 输入信号
		// 递推计算中间值
		w0[0] = BUTTER_A[0] * x0 - BUTTER_A[1] * w0[1] - BUTTER_A[2] * w0[2] -  BUTTER_A[3] * w0[3] - BUTTER_A[4] * w0[4] - BUTTER_A[5] * w0[5] - BUTTER_A[6] * w0[6] - BUTTER_A[7] * w0[7] - BUTTER_A[8] * w0[8];
        // 根据中间值递推计算出最后的数据
		y0 = BUTTER_B[0] * w0[0] + BUTTER_B[1] * w0[1] + BUTTER_B[2] * w0[2] + BUTTER_B[3] * w0[3] + BUTTER_B[4] * w0[4] + BUTTER_B[5] * w0[5] + BUTTER_B[6] * w0[6] + BUTTER_B[7] * w0[7] + BUTTER_B[8] * w0[8];
		// 将每个处理后的数据存入另外的数组中
		dealResult[i] = y0;		
        // 递推赋值
		w0[8] = w0[7];
		w0[7] = w0[6];
		w0[6] = w0[5];
		w0[5] = w0[4];
		w0[4] = w0[3];
		w0[3] = w0[2];
		w0[2] = w0[1];
		w0[1] = w0[0];
	}
}
APP对信号进行50hz陷波后的结果:
Android平台的IIR工频干扰陷波器_第3张图片


源码下载链接:

https://github.com/vroy007/MoveDSP

http://download.csdn.net/detail/sctu_vroy/8720193

你可能感兴趣的:(Android应用)