功能介绍:实现一款简易Andriod App,具备对信号数据进行50Hz陷波处理的能力,并将结果绘制成波形图,支持滤波器类型包括:巴特沃斯、切比雪夫Ⅰ型、切比雪夫Ⅱ型准备事项:Matlab,AndriodStudio,一台安卓手机设计与实现:

1、Step1:设计滤波器

通过MATLAB仿真设计滤波器,并导出滤波器参数,具体的:打开MATLAB中的FDA Tool(Filter Design & Analysis),设置好参数,点击"Design Filter"即可:

差频技术的应用(IIR工频干扰50Hz数字陷波器在Android系统的实践)(1)

Matlab设计滤波器示例

​点击工具栏中"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 }; // 传递函数分母数组

2、Step2:根据直接型IIR滤波器原理,设计滤波器算法

传递函数:

差频技术的应用(IIR工频干扰50Hz数字陷波器在Android系统的实践)(2)

传递函数

​差分方程:

差频技术的应用(IIR工频干扰50Hz数字陷波器在Android系统的实践)(3)

差分方程

50Hz陷波算法流程【重点难点】,基于差分方程的递推算法(其中:length为数据总数;i为滤波器阶数)

差频技术的应用(IIR工频干扰50Hz数字陷波器在Android系统的实践)(4)

50Hz陷波器算法流程

​3、Step3:Andriod程序的编写

主要实现思路:继承异步类AsyncTask,编写异步任务,异步执行滤波操作

/** * 异步进行50Hz带阻滤波 */ private class execFilterTask extends AsyncTask<Integer, void, String> { 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); } }

50Hz陷波器函数核心代码:

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

落地成果:对信号做50Hz的陷波​

差频技术的应用(IIR工频干扰50Hz数字陷波器在Android系统的实践)(5)

** ​​​源码已开源至Github和CSDN,下载链接:

GitHub - vroy007/MoveDSP: Android平台的数字信号处理软件,可对数字信号做50Hz陷波处理,以及音频信号实时快速傅里叶变换

Android平台的数字信号处理软件_安卓数字信号处理,安卓数字信号-Android代码类资源-CSDN文库

,