10种数字滤波技术详解

4 下载量 54 浏览量 更新于2024-09-01 收藏 37KB PDF 举报
"这篇文章主要介绍了10种简单的数字滤波技术,适用于数字信号处理和硬件设计,通过子程序实现,包括限幅滤波、中位值滤波、算术平均滤波、递推平均滤波等。" 1、限幅滤波 限幅滤波是一种最简单的数字滤波方法,其基本原理是限制信号的变化幅度。在给定的阈值A范围内,如果新采样的值与当前有效值之间的差值超过A,则返回当前有效值;否则,更新有效值为新采样的值。这种方法可以有效地抑制突然的噪声干扰。 2、中位值滤波 中位值滤波器通过计算一段时间内采样值的中位数来过滤噪声。这种方法对消除尖峰噪声特别有效,因为尖峰通常会被多数正常值包围。这里采用了冒泡排序算法来对采样值进行排序,并返回中位数作为滤波后的值。 3、算术平均滤波 算术平均滤波器是通过计算一段时间内多个采样值的平均值来平滑信号。这种滤波器可以降低噪声的影响,但对突变信号响应较慢。滤波器的响应时间取决于采样数量N。 4、递推平均滤波(滑动平均滤波) 递推平均滤波器也称为滑动平均滤波器,它不断更新一个固定大小的样本窗口内的平均值。新采样的值替换掉最早的一次采样值,然后计算新的平均值。这种方法在保持实时性的同时,也能提供一定的噪声抑制。 5、中位值平均滤波 结合了中位值滤波和算术平均滤波的特点,中位值平均滤波器首先计算一组采样值的中位数,然后将这个中位数与历史平均值相结合,形成一个新的平均值。这种方法既能去除尖峰噪声,又能平滑信号。 6、指数平均滤波 指数平均滤波器,也称为加权平均滤波,给予最近的采样值更大的权重,而对旧的采样值给予较小的权重。这使得滤波器对短期变化反应更快,对长期趋势跟踪更准确。 7、滑窗滤波 滑窗滤波器在信号上应用一个固定长度的窗函数,然后对每个窗口内的采样值进行某种运算,如平均或求和,以得到滤波结果。 8、巴特沃斯滤波 巴特沃斯滤波器是一种线性相位的数字滤波器,具有平直的频率响应特性。它可以通过IIR(无限冲激响应)结构实现,对特定频段的信号进行平滑处理。 9、卡尔曼滤波 卡尔曼滤波是一种统计滤波方法,利用先验信息和观测数据来估计系统状态。它适用于处理随机过程中的噪声,并且能处理多变量系统。 10、自适应滤波 自适应滤波器可以根据输入信号的特性自动调整其参数,例如LMS(最小均方误差)算法就是一种常见的自适应滤波方法。这种方法可以适应不断变化的噪声环境,提高滤波效果。 这些滤波技术各有优缺点,适用于不同的应用场景。在实际应用中,需要根据系统需求选择合适的滤波器类型。例如,对于快速变化的信号,可能需要选择响应速度快的滤波器;而对于需要抑制特定频率噪声的场景,则可以选择具有特定频率响应特性的滤波器。
2012-04-24 上传
void CDIPDlg::OnOpen() { // TODO: Add your command handler code here CString fileName; CFileDialog OpenDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_EXPLORER,"图像文件格式(*.bmp)|*.bmp|JPG file format (*.jpg)|*.jpg|",NULL); if(OpenDlg.DoModal()!=IDOK) return; fileName=OpenDlg.GetPathName(); std::string tempName=(LPCSTR)CString(fileName); const char* tmp=tempName.c_str(); if((pImg=cvLoadImage(tmp,1))==0) return; wImg=cvCreateImage(cvGetSize(pImg),pImg->depth,pImg->nChannels); cvCopy(pImg,wImg,NULL); ShowImage( pImg,IDC_STATIC_P ); ShowOImage( pImg, IDC_STATIC_O ); } void CDIPDlg::OnSave() { // TODO: Add your command handler code here CFileDialog SaveDlg(FALSE,"bmp","未命名",OFN_HIDEREADONLY|OFN_EXPLORER,"图像文件格式(*bmp)|*.bmp|JPG file format (*jpg)|*.jpg|",NULL); if(SaveDlg.DoModal()==IDOK){ CString savefileName=SaveDlg.GetPathName(); std::string tempSaveName=(LPCSTR)CString(savefileName); const char* nameOfFile=tempSaveName.c_str(); if(wImg) cvSaveImage(nameOfFile,wImg); else cvSaveImage(nameOfFile,pImg); MessageBox("ok!"); } else MessageBox("no!"); } void CDIPDlg::OnEsc() { // TODO: Add your command handler code here CDialog::OnDestroy(); cvReleaseImage(&pImg;); cvReleaseImage(&wImg;); cvReleaseImage(&gImg;); cvDestroyAllWindows(); AfxGetMainWnd()->SendMessage(WM_CLOSE); } void CDIPDlg::OnGaos() { // TODO: Add your command handler code here wImg=cvCreateImage(cvGetSize(pImg),pImg->depth,pImg->nChannels); cvCopy(pImg,wImg,NULL); IplImage* in; in = wImg; IplImage* out = cvCreateImage(cvGetSize(in),IPL_DEPTH_8U,wImg->nChannels); // 建立辅助位图 cvSmooth(in,out,CV_GAUSSIAN,3,wImg->nChannels); // Gauss 平滑 // cvNamedWindow("高斯滤波",1); // cvShowImage("高斯滤波",out); ShowImage( out,IDC_STATIC_P ); wImg=cvCreateImage(cvGetSize(out),out->depth,out->nChannels); cvCopy(out,wImg,NULL); cvWaitKey(0); // cvDestroyWindow("高斯滤波"); cvReleaseImage(∈); cvReleaseImage(&out;); }