1、Step1:设计滤波器
通过MATLAB仿真设计滤波器,并导出滤波器参数,具体的:打开MATLAB中的FDA Tool(Filter Design & Analysis),设置好参数,点击"Design Filter"即可:
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滤波器原理,设计滤波器算法
传递函数:
传递函数
差分方程:
差分方程
50Hz陷波算法流程【重点难点】,基于差分方程的递推算法(其中:length为数据总数;i为滤波器阶数)
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];
}
}
** 源码已开源至Github和CSDN,下载链接:
GitHub - vroy007/MoveDSP: Android平台的数字信号处理软件,可对数字信号做50Hz陷波处理,以及音频信号实时快速傅里叶变换
Android平台的数字信号处理软件_安卓数字信号处理,安卓数字信号-Android代码类资源-CSDN文库
,