第一步:通过MATLAB设计滤波器,并导出滤波器参数
打开MATLAB中的FDA Tool(Filter Design & Analysis),设置好参数,点击"Design Filter"即可:
点击工具栏中"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为滤波器阶数))
第三步:继承异步类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陷波后的结果:
源码下载链接:
https://github.com/vroy007/MoveDSP
http://download.csdn.net/detail/sctu_vroy/8720193