10种简单的数字滤波算法
数字图像处理中常见的滤波算法研究

数字图像处理中常见的滤波算法研究在数字图像处理中,滤波是一种常用的技术,用于改善或修复图像的质量。
滤波算法可以通过降噪、增强边缘、图像平滑等方式来提高图像的视觉效果。
本文将介绍几种常见的滤波算法及其应用。
1. 均值滤波均值滤波是最简单的滤波算法之一。
它通过计算像素周围邻域的平均值来替换该像素的灰度值。
均值滤波可以有效地降低图像中的噪声,但也会导致图像失去细节信息。
因此,适用于对噪声敏感但对图像细节要求不高的应用场景。
2. 中值滤波与均值滤波相比,中值滤波可以更好地去除图像中的噪声同时保留更多的图像细节。
中值滤波算法使用像素邻域的中值来替换该像素的灰度值。
中值滤波对于椒盐噪声的去除效果尤为明显,因此常用于医学图像、科学图像等领域。
3. 高斯滤波高斯滤波是一种常用的线性平滑滤波算法,通过计算像素周围邻域的加权平均值来替换该像素的灰度值。
高斯滤波算法在滤波过程中,使用了一个以该像素为中心的二维高斯函数作为权重,使得距离该像素越近的邻域像素具有更大的权重。
高斯滤波可以有效平滑图像,同时保留边缘信息。
4. Roberts算子Roberts算子是一种边缘检测算法,可以用于提取图像中的边缘信息。
Roberts 算子分为水平和垂直两个方向,通过计算像素与其对角线相邻像素之间的差值来确定边缘的存在。
Roberts算子简单、快速,并且对噪声具有一定的鲁棒性。
5. Sobel算子Sobel算子是一种著名的梯度算子,用于边缘检测和图像增强。
Sobel算子不仅可以检测边缘,还可以确定边缘的方向。
Sobel算子通过计算像素和其周围邻域像素的加权差值来确定边缘的强度,进而提取图像中的边缘信息。
6. Laplacian算子Laplacian算子是一种常见的二阶微分算子,用于图像锐化和边缘检测。
Laplacian算子通过计算像素周围邻域像素的二阶导数来检测边缘。
Laplacian算子可以增强图像中的细节信息,但也容易受到噪声的影响。
tia博途中10种常用模拟滤波算法

尊敬的读者:在数字信号处理中,滤波是一种常见的处理方式,用于去除信号中的噪声或者从混合信号中分离出所需的成分。
模拟滤波算法是滤波中的一种重要技术,它通过对连续时间信号进行处理,来实现对信号频率的调节和清晰化。
在tia博途中,有10种常用的模拟滤波算法,它们分别是:1. 巴特沃斯滤波器(Butterworth Filter):巴特沃斯滤波器是一种最常用的滤波器类型之一,它具有平坦的幅频响应和无相位失真。
这种滤波器在广泛的频率范围内都能获得较为稳定的性能,因此在通信系统和音频处理中被广泛使用。
2. 切比雪夫滤波器(Chebyshev Filter):切比雪夫滤波器以其在通带和阻带上的波纹特性而闻名,它能够在给定的频率范围内实现较大的通带衰减和较小的阻带波纹,适用于对频率精度要求较高的场合。
3. 椭圆滤波器(Elliptic Filter):椭圆滤波器是一种具有最为严格的通带和阻带波纹限制的滤波器,它可以实现更高的通带衰减和更小的阻带波纹,但相应的设计复杂度也较高。
4. 梅尔滤波器(Mel Filter):梅尔滤波器是一种在语音信号处理中广泛应用的滤波器类型,它模拟了人耳对频率的感知特性,能够有效地提取语音信号的特征参数。
5. 卡尔曼滤波器(Kalman Filter):卡尔曼滤波器是一种递归滤波器,它可以根据动态系统的状态方程和观测方程,实现对系统状态的估计和预测,被广泛应用于导航、控制和信号处理领域。
6. 自适应滤波器(Adaptive Filter):自适应滤波器是一种能够根据信号特性动态调整滤波参数的滤波器,它能够有效地抑制噪声和干扰,提高信号的质量和可靠性。
7. 小波滤波器(Wavelet Filter):小波滤波器是利用小波变换进行信号处理的滤波器,它具有多尺度分析能力和良好的时频局部化特性,适用于非平稳信号和时变系统的分析和处理。
8. 快速傅里叶变换滤波器(FFT Filter):快速傅里叶变换滤波器是利用快速傅里叶变换算法对信号进行频域分析和滤波的一种方法,它具有高效的计算性能和良好的频率分辨率。
数据处理中的几种常用数字滤波算法

数据处理中的几种常用数字滤波算法下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!在数据处理中,数字滤波算法是一种常用的技术,用于去除信号中的噪音和干扰,从而得到更加准确和可靠的数据。
数据处理中的几种常用数字滤波算法

数据处理中的几种常用数字滤波算法
在数据处理中,常用的数字滤波算法有以下几种:
1. 移动平均滤波(Moving Average Filter):将一组连续的数据取
平均值作为滤波结果。
该算法简单易实现,可以有效消除噪声,但会引入
一定的延迟。
2. 中值滤波(Median Filter):将一组连续的数据排序,并取中间
值作为滤波结果。
该算法适用于去除周期性干扰或脉冲噪声,但对于快速
变化的信号可能无法有效滤除。
3. 加权移动平均滤波(Weighted Moving Average Filter):给予
不同的数据点不同的权重,并将加权平均值作为滤波结果。
该算法可以根
据需要调整不同数据点的权重,适用于对不同频率成分有不同抑制要求的
情况。
4. 递推平滑滤波(Recursive Smoothing Filter):根据当前输入
数据与上一次滤波结果的关系,通过递推公式计算得到滤波结果。
递推平
滑滤波可以实现实时滤波,但对于快速变化的信号可能会引入较大的误差。
5. 卡尔曼滤波(Kalman Filter):适用于估计具有线性动力学特性
的系统状态,并结合观测值进行滤波。
卡尔曼滤波算法综合考虑了系统模
型和观测模型的不确定性,因此能够提供较好的估计结果。
这些数字滤波算法在实际应用中可以根据需求进行选择和组合,以实
现对信号的有效滤波和噪声抑制。
数字信号处理中常见滤波算法详解

数字信号处理中常见滤波算法详解数字信号处理(Digital Signal Processing,DSP)中的滤波算法是处理信号的重要手段之一。
滤波算法可以对信号进行去除噪声、增强信号特征等操作,广泛应用于通信、音频处理、图像处理等领域。
本文将详细介绍数字信号处理中常见的滤波算法,包括FIR滤波器、IIR滤波器、傅里叶变换和小波变换等。
首先,我们来介绍FIR滤波器(Finite Impulse Response Filter)。
FIR滤波器是一种线性相位滤波器,其特点是零相位延迟响应。
FIR滤波器可以通过离散时间域的卷积运算来实现,其滤波系数在有限长时间内保持不变。
常见的FIR滤波器设计方法包括窗函数法、频率采样法等。
其中,窗函数法通过选择适当的窗函数和截断长度来设计滤波器,常见的窗函数有矩形窗、汉宁窗、汉明窗等。
频率采样法则通过在频率域上采样若干离散点并计算出滤波器的频率响应,然后通过反变换得到滤波器的时域响应。
FIR滤波器具有易于实现、稳定性好等优点,在数字信号处理中得到广泛应用。
其次,我们来介绍IIR滤波器(Infinite Impulse Response Filter)。
与FIR滤波器不同,IIR滤波器的系统函数中包含了反馈回路,因此其响应不仅依赖于当前输入样本,还依赖于历史输入样本和输出样本。
IIR滤波器与FIR滤波器相比,具有更高的滤波效率,但也存在着稳定性较差、相位畸变等问题。
常见的IIR滤波器设计方法有脉冲响应不变法、双线性变换法等。
脉冲响应不变法通过将连续时间域的系统函数变换为离散时间域的差分方程来实现,而双线性变换则通过将连续时间域的系统函数变换为离散时间域的差分方程,并在频率响应上进行双线性变换。
IIR滤波器在音频处理、图像增强等领域得到了广泛应用。
傅里叶变换也是数字信号处理中常用的滤波算法。
傅里叶变换将时域信号转换为频域信号,可以实现将信号中的不同频率成分分离出来的目的。
10种简单的数字滤波算法

10种简单的数字滤波算法(C语言源程序) 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad();1、限副滤波/* A值可根据实际情况调整value为有效值,new_value为当前采样值滤波程序返回有效的实际值*/#define A 10char value;char filter(){char new_value;new_value = get_ad();if ( ( new_value - value > A ) || ( value - new_value > A )return value;return new_value;}2、中位值滤波法/* N值可根据实际情况调整排序采用冒泡法*/#define N 11char filter(){char value_buf[N];char count,i,j,temp;for ( count=0;count<N;count++){value_buf[count] = get_ad();delay();}for (j=0;j<N-1;j++){for (i=0;i<N-j;i++){if ( value_buf[i]>value_buf[i+1] ){temp = value_buf[i];value_buf[i] = value_buf[i+1];value_buf[i+1] = temp;}}}return value_buf[(N-1)/2];}3、算术平均滤波法/**/#define N 12char filter(){int sum = 0;for ( count=0;count<N;count++){sum + = get_ad();delay();}return (char)(sum/N);}4、递推平均滤波法(又称滑动平均滤波法)/**/#define N 12char value_buf[N];char i=0;char filter(){char count;int sum=0;value_buf[i++] = get_ad();if ( i == N ) i = 0;for ( count=0;count<N,count++)sum = value_buf[count];return (char)(sum/N);}5、中位值平均滤波法(又称防脉冲干扰平均滤波法)/**/#define N 12char filter(){char count,i,j;char value_buf[N];int sum=0;for (count=0;count<N;count++){value_buf[count] = get_ad();delay();}for (j=0;j<N-1;j++){for (i=0;i<N-j;i++){if ( value_buf[i]>value_buf[i+1] ){temp = value_buf[i];value_buf[i] = value_buf[i+1];value_buf[i+1] = temp;}}}for(count=1;count<N-1;count++)sum += value[count];return (char)(sum/(N-2));}6、限幅平均滤波法/**/略参考子程序1、37、一阶滞后滤波法/* 为加快程序处理速度假定基数为100,a=0~100 */#define a 50char value;char filter(){char new_value;new_value = get_ad();return (100-a)*value + a*new_value;}8、加权递推平均滤波法/* coe数组为加权系数表,存在程序存储区。
adc滤波的10种经典算法

adc滤波的10种经典算法ADC(模数转换器)滤波算法是将采样得到的模拟信号进行数字化处理时常用的方法。
滤波的目的是去除噪声和不必要的频率成分,以提高信号质量。
下面列举了10种经典的ADC滤波算法:1. 均值滤波器:将一组采样值取平均值,用于平滑信号,减小噪声的影响。
该算法简单且易于实现,但对于快速变化的信号可能会引入较大的误差。
2. 中值滤波器:将一组采样值排序,取中间值作为输出值。
中值滤波器能够有效地去除脉冲噪声,对于非线性噪声具有良好的去除效果。
3. 限幅滤波器:将采样值限制在一定范围内,超出范围的值替换为最大或最小值。
该滤波器适用于信号中存在脉冲噪声的情况,能够有效去除异常值。
4. 低通滤波器:只允许低频信号通过,抑制高频信号。
常用的低通滤波器包括巴特沃斯滤波器、布脱沃斯滤波器等。
低通滤波器可应用于去除高频噪声,平滑信号。
5. 高通滤波器:只允许高频信号通过,抑制低频信号。
高通滤波器可用于去除低频噪声,突出高频信号。
6. 带通滤波器:只允许一定频率范围内的信号通过,抑制其他频率的信号。
带通滤波器可用于突出某个频段的信号。
7. 自适应滤波器:根据输入信号的特点自动调整滤波参数,适应不同的信号环境。
自适应滤波器能够实时调整滤波效果,适应信号的变化。
8. 卡尔曼滤波器:利用系统的状态方程和观测方程,通过最小化预测误差和观测误差的加权和,实现对信号的滤波。
卡尔曼滤波器适用于线性系统,能够对系统状态进行较准确的估计。
9. 无限脉冲响应(IIR)滤波器:在滤波过程中利用反馈,具有较窄的通带和较宽的阻带。
IIR滤波器具有较好的频率响应特性,但容易引入稳定性问题。
10. 有限脉冲响应(FIR)滤波器:滤波过程中不利用反馈,仅利用输入信号和滤波器的系数进行计算。
FIR滤波器具有较好的稳定性和线性相位特性,适用于需要精确频率响应的应用。
这些经典的ADC滤波算法在不同的应用场景中有着各自的优势和适用性。
在实际应用中,需要根据信号的特点和要求选择合适的滤波算法,以达到最佳的滤波效果。
10种常见的数字信号处理算法解析

10种常见的数字信号处理算法解析数字信号处理算法是数字信号处理领域的核心技术,它能够将连续型信号转化为离散型信号,从而实现信号的数字化处理和传输。
本文将介绍10种常见的数字信号处理算法,并分别从理论原理、算法步骤和典型应用三个方面进行解析。
一、傅里叶变换傅里叶变换是一种将时域信号转换为频域信号的算法。
其原理是分解信号中的不同频率分量,使得信号频域分析更方便。
傅里叶变换的算法步骤包括信号采样、离散化、加窗、FFT变换、频谱分析等。
傅里叶变换广泛应用于通信、音频处理、图像处理等领域。
二、小波变换小波变换是一种将时域信号分解为多个小波信号的算法。
其原理是利用小波基函数将信号分解成不同频率和时间范围的小波信号。
小波变换的算法步骤包括信号采样、小波变换、重构等。
小波变换广泛应用于信号压缩、图像处理、语音信号处理等领域。
三、滤波器设计滤波器设计是一种根据需要设计出不同类型的滤波器的算法。
其原理是利用滤波器对信号进行滤波处理,达到对信号不同频率分量的取舍。
滤波器设计的算法步骤包括滤波器类型选择、设计要求分析、滤波器设计、滤波器性能评估等。
滤波器设计广泛应用于信号处理和通信系统中。
四、自适应滤波自适应滤波是一种能够自主根据需要调整滤波器参数的算法。
其原理是通过采样原始信号,用自适应滤波器对信号进行滤波处理,以达到信号降噪的目的。
自适应滤波的算法步骤包括信号采样、自适应算法选择、滤波器参数估计、滤波器性能评估等。
自适应滤波广泛应用于信号处理和降噪领域。
五、功率谱密度估计功率谱密度估计是一种用于估计信号功率谱密度的算法。
其原理是利用信号的离散傅里叶变换,对信号功率谱密度进行估计。
功率谱密度估计的算法步骤包括信号采样、离散傅里叶变换、功率谱密度估计等。
功率谱密度估计广泛应用于信号处理、通信、声学等领域。
六、数字滤波数字滤波是一种对数字信号进行滤波处理的算法。
其原理是利用数字滤波器对信号进行滤波处理,以取舍信号中不同频率分量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10种简单的数字滤波算法(C语言源程序) 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad();1、限副滤波/* A值可根据实际情况调整value为有效值,new_value为当前采样值滤波程序返回有效的实际值*/#define A 10char value;char filter(){char new_value;new_value = get_ad();if ( ( new_value - value > A ) || ( value - new_value > A )return value;return new_value;}2、中位值滤波法/* N值可根据实际情况调整排序采用冒泡法*/#define N 11char filter(){char value_buf[N];char count,i,j,temp;for ( count=0;count<N;count++){value_buf[count] = get_ad();delay();}for (j=0;j<N-1;j++){for (i=0;i<N-j;i++){if ( value_buf[i]>value_buf[i+1] ){temp = value_buf[i];value_buf[i] = value_buf[i+1];value_buf[i+1] = temp;}}}return value_buf[(N-1)/2];}3、算术平均滤波法/**/#define N 12char filter(){int sum = 0;for ( count=0;count<N;count++){sum + = get_ad();delay();}return (char)(sum/N);}4、递推平均滤波法(又称滑动平均滤波法)/**/#define N 12char value_buf[N];char i=0;char filter(){char count;int sum=0;value_buf[i++] = get_ad();if ( i == N ) i = 0;for ( count=0;count<N,count++)sum = value_buf[count];return (char)(sum/N);}5、中位值平均滤波法(又称防脉冲干扰平均滤波法)/**/#define N 12char filter(){char count,i,j;char value_buf[N];int sum=0;for (count=0;count<N;count++){value_buf[count] = get_ad();delay();}for (j=0;j<N-1;j++){for (i=0;i<N-j;i++){if ( value_buf[i]>value_buf[i+1] ){temp = value_buf[i];value_buf[i] = value_buf[i+1];value_buf[i+1] = temp;}}}for(count=1;count<N-1;count++)sum += value[count];return (char)(sum/(N-2));}6、限幅平均滤波法/**/略参考子程序1、37、一阶滞后滤波法/* 为加快程序处理速度假定基数为100,a=0~100 */#define a 50char value;char filter(){char new_value;new_value = get_ad();return (100-a)*value + a*new_value;}8、加权递推平均滤波法/* coe数组为加权系数表,存在程序存储区。
*/#define N 12char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12; char filter(){char count;char value_buf[N];int sum=0;for (count=0,count<N;count++){value_buf[count] = get_ad();delay();}for (count=0,count<N;count++)sum += value_buf[count]*coe[count]; return (char)(sum/sum_coe);}9、消抖滤波法#define N 12char filter(){char count=0;char new_value;new_value = get_ad();while (value !=new_value);{count++;if (count>=N) return new_value;delay();new_value = get_ad();}return value;}10、限幅消抖滤波法/**/一个非常适合单片机的滤波算法一个非常适合单片机的滤波算法(内附匠人分析)2011-01-08 09:17匠人按:今天在论坛里看到一位网友发了个滤波算法。
开始以为是一种新算法,后来仔细分析,发现原来是一阶滤波(低通滤波)的变形。
原文及匠人的分析附录如下:-------------------------------------------------以下为原文-------------------连接:/icview--1-1.html单片机大多资源小,算法占用的资源越小越好,现在介绍就是一个占用很小资源的算法,这个算法是本人在进行扫描仪设计,实现灰度转二值时实现动态阈值,当时为了跟踪灰度等级的变化,需要一个灰度积分跟踪电路,开始使用一个电容积分电路,用灰度信号对电容充电,放电时以该电容电压的比例进行,实现对输入信号的跟踪,但用电容的电路设计比较复杂。
过后发现这种比例放电的思想用软件实现非常简单,且具有积分、微分的作用。
具体公式如下:SUM=SUM-SUM/n+S其中:S为采样值,SUM为保存值,n是放电比例、最好选2的幂次数,单片机移位即可,不需要做除法,跟随后得到的值为SUM/n,SUM注意不溢出,预留的容量为采样数最大值的n倍,初始化时如果是跟踪一段时间后使用,可以是任何值,否则可以用采样值乘n初始化。
使用值为SUM/n(下文中SA),实现SUM/n对S的跟踪。
还有一个关键是计算周期T,即多长时间进行一次。
一、积分作用:1.平滑滤波(滑动平均滤波)由公式中可以看出,每次采样、计算后,当前采样的影响对SUM/n只有1/n,而且采到的值随次数的增加影响越来越小直至没有,相关性逐渐减弱,而且是连续相关。
如果计算周期与采样周期相同,使用计算后的值对干扰有n倍的抑制,即积分的平滑滤波作用,如1ms采样一次,同时运算一次,则使用值SA=SUM/n为抑制干扰的结果,且同样是1ms给出一个结果,使用两个变量实现平滑滤波,并且是即时使用的,与采样几次平均的平滑不同。
2.动态阈值在很多应用中需要动态阈值,比如触摸按键的键阈值门限,血压计的心率检出,前面提到的灰度转二值黑白图像等(灰度转二值因为扫描速度2.5Mbyte/S,不能使用软件运算,但可以使用可编程逻辑实现)。
动态阈值是对信号积分后得到的低频变化再与基本门限相加在触摸按键中增加动态阈值可以提高其适应性和可靠性。
关键是根据按键反应时间和按键间隔确定按键积分参数,跟踪速度,n、T 越大跟踪的越慢,积分效果越好。
3.锁相作用:把上边的积分运算,用于对时间上周期的信号,例如根据过零触发信号锁定交流电源周期,使用两次T时间不同,其它相同的运算,由于T不同,跟踪速度不同,当两次运算的结果相等时可以确认为锁定,这时得到的是准确的电源周期值,而相位偏差也很小。
二、微分作用:公式中的SA趋近采样值S,如果S是线性的,SA的值是可控滞后于S,那么运算的间隔时间T不同,得到的跟踪曲线的滞后特性不同,这种滞后特性的差和间隔时间就是微分特性,表示曲线的变化规律。
如电热水壶,温度的变化相当于采样时间是还相当慢的,局部可以作为线性变化来处理。
下边以设计电热水壶的过程来说明微分作用。
电热水壶出口一直使用蒸汽开关这种需要交专利费的方式。
不使用蒸汽开关检测压力只能使用热敏器件检测温度。
温度检测的环境要求:1.海拔高度不同的地区水开的温度不同。
2.热敏器件的误差较大,必须克服,否则可生产性不足。
3.环境温度不同,电源电压不同,装水量不同。
由要求1、2决定检测温度不能判别水开与否,需要检测温度的变化率,但温度变化率的判别又和要求3相关,下边曲线图为热水器的加热曲线。
蓝线为即时温度,橙色为一次运算后的曲线。
图中加热过程中间添加了冷水,曲线有一段下降,过后的加热过程两个曲线有个差异滞后,同一个时间的两个曲线差表示了加热效率的变化,其中最大的加热效率体现了环境温度不同,电源电压不同,装水量不同的综合效果。
由于滞后的时间可以通过计算周期T来调整,知道滞后时间又有相减的差,这就是微分效应,加热过程整个就是效率的变化过程。
我们可以通过1秒钟计算一次,2秒钟计算一次,加上原始数据得到三个曲线,效率的变化一目了然。
第一次的水开检测使用效率的方法,同时也会得到水开时的温度检测值,微分特性本身是可以预知变化趋势的,如果1秒钟计算一次,用当前检测值减去这次计算的结果,这个差与当前值相加,就可以做为当前1秒后的结果,也就是预知1秒后加热的检测值,结合第一次得到的水开温度检测值,以后的水开检测就有两个判断条件。
----------------------------------------------以下为匠人的分析-----------------------------拨开迷雾看真相,作者的这个算法,本质上,就是一阶滤波(低通滤波)。
引用作者原来的公式SUM=SUM-SUM/n+S首先点破一下,等号前面的SUM代表的是本次运算结果,而等号后面的SUM 代表的是上次运算结果。
且看匠人如何推导:设:SUM=ASUM/n=B=本次滤波结果1/n=a (一阶滤波系数)S=本次新采样值则:A=nBB=A/n另外:A、B 代表本次值A’、B’ 代表上次值作者原公式逐步推导:原始:SUM=SUM-SUM/n+S第1步:A=A’ –A’/n +S第2步:nB=nB’ –B’ +S第3步:B= (nB’ –B’ +S)/n第4步:B=B’ –B’/n +S/n第5步:B=(1- 1/n)B’ + (1/n)*S第6步:B= (1-a)B’+ a *S推导到最后一步,是不是很眼熟啦?呵呵,这就是经典的一阶滤波(低通滤波)的标准公式了。