数字滤波C程序
数字滤波程序

分2个版本:VisualBasic和C语言===VB====Dim a(30) As DoubleDim b(10) As DoublePrivate Sub Command1_Click()Text2.Text = ""For i = 1 To 10b(i) = (a(3 * i - 2) + a(3 * i - 1) + a(3 * i)) / 3Text2.Text = Text2.Text & vbCrLf & Format(b(i), "#0.0")Next iEnd SubPrivate Sub Swap( _ByRef a1 As Double, ByRef a2 As Double)Dim t As Doublet = a1: a1 = a2: a2 = tEnd SubPrivate Sub Command2_Click()Dim x As Double, y As Double, z As DoubleText2.Text = ""For i = 1 To 10x = a(3 * i - 2): y = a(3 * i - 1): z = a(3 * i)If x > y Then Swap x, yIf y > z Then Swap y, zIf x > y Then Swap x, yText2.Text = Text2.Text & Format(y, "#0.0") & vbCrLfNext iEnd SubPrivate Sub Command3_Click()Dim M As DoubleM = 4For i = 1 To 9If Abs(b(i + 1) - b(i)) > M Thenb(i + 1) = b(i)End IfNext iText2.Text = ""For i = 1 To 10Text2.Text = Text2.Text & i & ":" & Format(b(i), "#0.0") & vbCrLf Next iEnd SubPrivate Sub Command4_Click()Text1.Text = ""For i = 1 To 10Text1.Text = Text1.Text & i & ":" & Format(b(i), "#0.00") & vbCrLfNext iEnd SubPrivate Sub Form_Load()For i = 1 To 30a(i) = 20 + Rnd * 3 * IIf(Rnd > 0.5, 1, -1)Next iText1.Text = ""For i = 1 To 30Text1.Text = Text1.Text & vbCrLf & i & ":" & Format(a(i), "#0.0") Next iEnd Sub======VB=====以下是C语言版本,F1 是平均值滤波,F2是中位值滤波,F3是阈值滤波====C=====void f1(double a[],double b[],int N){int i,j,k;double s;for (i=0,j=0;i<30;i+=N){for (s=0,k=0;k<N;k++) s+=a[i+k];b[j++]=s/N;for (k=0;k<N;k++) printf("%6.0f",a[i+k]);printf(":%6.0f\n",b[j-1]);}printf("\n");}double Max(double x,double y) { return x>y?x:y; }double Min(double x,double y) { return x<y?x:y; }void f2(double a[],double b[],int N){int i,j,k;double s;for (i=0,j=0;i<30;i+=N){for (s=0,k=0;k<N;k++) s+=a[i+k];b[j++]=s - Max(Max(a[i],a[i+1]),a[i+2])- Min(Min(a[i],a[i+1]),a[i+2]);for (k=0;k<N;k++) printf("%6.0f",a[i+k]);printf(":%6.0f\n",b[j-1]);}printf("\n");}void f3(double a[],double b[],int M){int i,j,k;double s;b[0]=a[0];printf("%6.0f -> %6.0f\n",a[0],b[0]);for (i=1;i<30;i++){if (a[i]-b[i-1]<=M)b[i]=a[i];elseb[i]=b[i-1];printf("%6.0f -> %6.0f\n",a[i],b[i]); }printf("\n");}main(){double a[30]={12,11,14,13,15,16,17,15,18, 16,15,17,19,20,18,21,23,20,24,22,21,19,18,20,17,18,16,15,13,14};double b[30];int N=3;double M=2;printf("F1\n"); f1(a,b,N);printf("F2\n"); f2(a,b,N);printf("F3\n"); f3(a,b,M);}。
dc filter c语言代码

DC滤波器是一种常用的电路,用于去除信号中的直流分量。
在数字信号处理和通信系统中,DC滤波器通常是使用C语言来编写。
下面我将向大家介绍如何使用C语言编写一个简单的DC滤波器代码。
1. 我们需要定义一个C语言函数来实现DC滤波器的功能。
这个函数的输入参数是一个包含原始信号的数组,输出参数是一个去除了直流分量的新数组。
```cvoid dc_filter(int input[], int output[], int length) {int sum = 0; // 初始化一个变量来保存输入信号的总和for (int i = 0; i < length; i++) {sum += input[i]; // 计算输入信号的总和}int mean = sum / length; // 计算输入信号的均值for (int i = 0; i < length; i++) {output[i] = input[i] - mean; // 去除直流分量}}```2. 在上面的代码中,我们首先定义了一个函数dc_filter,它接受三个参数:input是原始信号的数组,output是去除直流分量后的新数组,length是输入信号的长度。
函数内部首先计算输入信号的总和,然后计算信号的均值,最后通过减去均值实现了信号的直流分量去除。
3. 为了使用这个DC滤波器函数,我们需要在主程序中调用它,并提供原始信号的数组作为输入。
下面是一个简单的示例:```cint m本人n() {int input[] = {1, 2, 3, 4, 5}; // 原始信号数组int length = sizeof(input) / sizeof(input[0]); // 计算数组长度int output[length]; // 定义一个新数组来保存去除直流分量后的信号dc_filter(input, output, length); // 调用dc_filter函数// 输出去除直流分量后的新数组for (int i = 0; i < length; i++) {printf("d ", output[i]);}return 0;}```4. 在上面的示例中,我们首先定义了一个包含原始信号的input数组,然后通过计算数组的长度,并定义一个新数组output来保存去除直流分量后的信号。
10种简单的数字滤波算法(C语言源程序)

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++)< p="">{value_buf[count] = get_ad();delay();for (j=0;j<n-1;j++)< p="">{for (i=0;i<n-j;i++)< p="">{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++)< p=""> {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++)< p="">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++)< p="">{value_buf[count] = get_ad();delay();}for (j=0;j<n-1;j++)< p="">for (i=0;i<n-j;i++)< p="">{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++)< p="">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数组为加权系数表,存在程序存储区。
c语言实现去直流滤波器

c语言实现去直流滤波器C语言实现去直流滤波器通常使用数字信号处理(DSP)技术。
在数字信号处理中,去直流滤波器通常是通过滤波器设计和数字滤波器实现来实现的。
首先,我们需要设计一个合适的数字滤波器来去除直流分量。
常见的数字滤波器包括FIR(有限脉冲响应)滤波器和IIR(无限脉冲响应)滤波器。
FIR滤波器具有线性相位特性,易于设计和稳定,而IIR滤波器则可以实现更高效的滤波器。
接下来,我们可以使用C语言来实现所设计的数字滤波器。
首先,我们需要定义滤波器的系数,然后编写C代码来实现滤波器的差分方程或直接使用现有的数字信号处理库函数来实现滤波器。
下面是一个简单的示例代码,演示了如何使用C语言和FIR滤波器来去除信号的直流分量:c.#include <stdio.h>。
#define N 5 // 滤波器阶数。
float b[N] = {0.2, 0.2, 0.2, 0.2, 0.2}; // 滤波器系数。
float inputSignal[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 输入信号。
float outputSignal[10] = {0}; // 输出信号。
int main() {。
int i, j;for (i = N-1; i < 10; i++) {。
outputSignal[i] = 0;for (j = 0; j < N; j++) {。
outputSignal[i] += b[j] inputSignal[i-j];}。
}。
// 输出滤波后的信号。
for (i = 0; i < 10; i++) {。
printf("%f\n", outputSignal[i]);}。
return 0;}。
在上面的示例中,我们定义了一个5阶的FIR滤波器,然后使用C语言编写了一个简单的滤波器实现。
实际应用中,滤波器的系数需要根据具体的滤波要求进行设计,而且需要考虑到滤波器的稳定性、幅频特性等因素。
FIR数字滤波器设计(窗函数法)C语言实现

FIR数字滤波器设计(窗函数法)C语⾔实现背景介绍:理想滤波器在物理上是不可实现的,其单位脉冲响应是⽆限长、⾮因果的。
窗函数法,就是从时域出发,⽤有限长、因果的单位脉冲响应h(n)去逼近理想滤波器的⽆限长、⾮因果的单位脉冲响应的⽅法。
窗函数法⼜叫傅⾥叶级数法。
更多背景资料,请看数字信号处理(李永全),P175。
⽅法简介:设N-1阶FIR数字滤波器的单位冲击响应为h(n),则传递函数H(z)为:窗函数法的设计步骤如下:1.根据给定的理想频率响应Hd(e^jw),利⽤傅⾥叶反变换,求出单位冲击响应hd(n):2.将hd(n)乘以窗函数w(n),得到所要求的FIR滤波器系数h(n):3.求卷积:使⽤说明⼦函数语句:void firwin(int n, int band, int wn, int fs, double h[], double kaiser=0.0, double fln=0.0, double fhn=0.0);形参说明n:滤波器的阶数band:滤波器的类型,取值1-4,分别为低通、带通、带阻、⾼通滤波器wn:窗函数的类型,取值1-7,分别对应矩形窗、图基窗、三⾓窗、汉宁窗、海明窗、布拉克曼窗和凯塞窗fs:采样频率h:存放滤波器的系数kaiser:beta值fln:带通下边界频率fhn:带通上边界频率源代码void firwin(int n, int band, int wn, int fs, double h[], double kaiser, double fln, double fhn){int i;int n2;int mid;double s;double pi;double wc1;double wc2;double beta;double delay;beta = kaiser;pi = 4.0 * atan(1.0); //pi=PI;if ((n % 2) == 0)/*如果阶数n是偶数*/{n2 = (n / 2) - 1;/**/mid = 1;//}else{n2 = n / 2;//n是奇数,则窗⼝长度为偶数mid = 0;}delay = n / 2.0;wc1 = 2 * pi * fln;wc2 = 2 * pi * fhn;switch (band){case 1:{for (i=0; i<=n2; ++i){s = i - delay;h[i] = (sin(wc1 * s / fs) / (pi * s)) * window(wn, n+1, i, beta);//低通,窗⼝长度=阶数+1,故为n+1h[n - i] = h[i];}if (mid == 1){h[n / 2] = wc1 / pi;//n为偶数时,修正中间值系数}break;}case 2:{for (i=0; i<=n2; i++){s = i - delay;h[i] = (sin(wc2 * s / fs) - sin(wc1 * s / fs)) / (pi * s);//带通h[i] = h[i] * window(wn, n+1, i, beta);h[n-i] = h[i];}if (mid == 1){h[n / 2] = (wc2 - wc1) / pi;}break;}case 3:{for (i=0; i<=n2; ++i){s = i - delay;h[i] = (sin(wc1 * s / fs) + sin(pi * s) - sin(wc2 * s / fs)) / (pi * s);//带阻 h[i] = h[i] * window(wn, n+1, i, beta);h[n - i] = h[i];}if (mid == 1){h[n / 2] = (wc1 + pi - wc2) / pi;}break;}case 4:{for (i=0; i<=n2; i++){s = i - delay;h[i] = (sin(pi * s) - sin(wc1 * s / fs)) / (pi * s);//⾼通h[i] = h[i] * window(wn, n+1, i, beta);h[n-i] = h[i];}if (mid == 1){h[n / 2] = 1.0 - wc1 / pi;}break;}}}//n:窗⼝长度 type:选择窗函数的类型 beta:⽣成凯塞窗的系数static double window(int type, int n, int i, double beta){int k;double pi;double w;pi = 4.0 * atan(1.0); //pi=PI;w = 1.0;switch (type){case 1:{w = 1.0; //矩形窗break;}case 2:{k = (n - 2) / 10;if (i <= k){w = 0.5 * (1.0 - cos(i * pi / (k + 1))); //图基窗}if (i > n-k-2){w = 0.5 * (1.0 - cos((n - i - 1) * pi / (k + 1)));}break;}case 3:{w = 1.0 - fabs(1.0 - 2 * i / (n - 1.0));//三⾓窗break;}case 4:{w = 0.5 * (1.0 - cos( 2 * i * pi / (n - 1)));//汉宁窗break;}case 5:{w = 0.54 - 0.46 * cos(2 * i * pi / (n - 1));//海明窗break;}case 6:{w = 0.42 - 0.5 * cos(2 * i * pi / (n - 1)) + 0.08 * cos(4 * i * pi / (n - 1));//布莱克曼窗 break;}case 7:{w = kaiser(i, n, beta);//凯塞窗break;}}return(w);}static double kaiser(int i, int n, double beta){double a;double w;double a2;double b1;double b2;double beta1;b1 = bessel0(beta);a = 2.0 * i / (double)(n - 1) - 1.0;a2 = a * a;beta1 = beta * sqrt(1.0 - a2);b2 = bessel0(beta1);w = b2 / b1;return(w);}static double bessel0(double x){int i;double d;double y;double d2;double sum;y = x / 2.0;d = 1.0;sum = 1.0;for (i=1; i<=25; i++){d = d * y / i;d2 = d * d;sum = sum + d2;if (d2 < sum*(1.0e-8)){break;}}return(sum);}得到系数之后,与输⼊信号求卷积即可!。
DSP的FIR设计低通滤波C语言编写

DSP的FIR设计低通滤波C语言编写FIR(有限脉冲响应)滤波器是一种常用的数字滤波器,用于数字信号处理中的滤波操作。
FIR滤波器的设计通常包括两个主要步骤:滤波器的规格化和滤波器系数的计算。
滤波器的规格化是指确定滤波器的采样频率,截止频率以及陷波增益等参数。
在设计低通FIR滤波器时,我们需要确定滤波器的截止频率。
假设我们希望设计一个截止频率为Fs/4的低通FIR滤波器,其中Fs是采样频率。
根据滤波器设计的基本原理,我们可以得到滤波器的频率响应公式为:H(k) = (2 * Fs/4 * sin(2 * pi * Fs/4 * k))/(pi * k)其中,k是从0到N-1的整数序列,N是滤波器的长度。
经过频域设计,我们可以通过计算滤波器的频率响应公式来获得滤波器的系数。
接下来,我们将使用C语言编写一个低通FIR滤波器的代码示例。
在这个示例中,我们将实现一个截止频率为Fs/4的低通FIR滤波器,采样频率为Fs。
代码如下:```c#include <stdio.h>#include <stdlib.h>#include <math.h>//定义滤波器的长度#define N 51//定义采样频率//定义滤波器的截止频率#define Fc (Fs/4)//计算滤波器的系数void calculateCoefficients(float* coefficients)float sum = 0;for (int k = 0; k < N; k++)if (k == N/2)coefficients[k] = 2 * Fc/Fs;} elsecoefficients[k] = (sin(2.0 * M_PI * Fc * (k - N/2) / Fs)) / (M_PI * (k - N/2));}sum += coefficients[k];}//归一化滤波器的系数for (int k = 0; k < N; k++)coefficients[k] /= sum;}//应用滤波器void applyFilter(float* input, float* output, float* coefficients, int length)for (int n = 0; n < length; n++)output[n] = 0;for (int k = 0; k < N; k++)if (n - k >= 0)output[n] += input[n - k] * coefficients[k];}}}int mai//定义输入信号和输出信号的长度int length = 100;//为输入信号和输出信号分配内存空间float* input = (float*)malloc(length*sizeof(float));float* output = (float*)malloc(length*sizeof(float));//为滤波器的系数分配内存空间float* coefficients = (float*)malloc(N*sizeof(float));//生成输入信号for (int n = 0; n < length; n++)input[n] = sin(2.0 * M_PI * 1000 * n / Fs);}//计算滤波器的系数calculateCoefficients(coefficients);//应用滤波器applyFilter(input, output, coefficients, length); //打印输出信号for (int n = 0; n < length; n++)printf("%f\n", output[n]);}//释放内存空间free(input);free(output);free(coefficients);return 0;```在上面的代码示例中,我们首先定义了滤波器的长度、采样频率以及截止频率。
IIR数字滤波器设计 上机程序 c语言

一)x1(t)=4sin(100πt) Ts=1.25ms,T=80ms Ωp=2/Ts*tan(wp/2)=519.87rad/s,Ωs=815.24rad/s#include<math.h>#include<stdio.h>void IIRDF(float A[],unsigned long N);void fft(float A[],float B[],unsigned M);main(){float A[1024],B[1024],C[1024],D[1024],F[1024];//A[i],D[i]存储输入序列实部,B[i],F[i]存储输入序列虚部unsigned long N,i ,M;printf("input M=");scanf("%d",&M);N=1<<M;printf("input A[]:");for(i=0;i<N;i++){A[i]=4*sin((100*3.1415926*1.25/1000)*i);D[i]=4*sin((100*3.1415926*1.25/1000)*i);}for(i=0;i<N;i++){B[i]=0;F[i]=0;}printf("x(n):");for(i=0;i<N;i++)printf("x(%d)=%f",i,A[i]); //输出采样序列的值fft(A,B,M); //对输入的离散序列进行FFT,求其频谱for(i=0;i<N;i++)C[i]=sqrt(A[i]*A[i]+B[i]*B[i]); //C[i]为输入离散序列的频谱幅值printf("x(k):");for(i=0;i<N;i++)printf("X[%d]=%f\n",i,C[i]); //输出C[i]for(i=0;i<N;i++)B[i]=0; IIRDF(D,N);//A[i]已被占用,故用D[i]存储的输入序列通过低通滤波器,F[i]同理printf("y(n):"); //通过低通滤波器后的输出序列for(i=0;i<N;i++)printf("y(%d)=%f\n",i,D[i]);fft(D,F,M); //对输出序列进行FFT,求其频谱printf("y(k):");for(i=0;i<N;i++)C[i]=sqrt(D[i]*D[i]+F[i]*F[i]); //C[i]为输出离散序列的频谱幅值for(i=0;i<N;i++)printf("y(%d)=%f\n",i,C[i]); //输出C[i]printf("\n");}void IIRDF(float A[],unsigned long N)/*级联型低通滤波器*/ {unsigned long n ;float x[3]={0,0,0},y1[3]={0,0,0},y2[3]={0,0,0},y[3]={0,0,0}; //y(0)表示y(n),y(1)表示y(n-1),y(2)表示y(n-2)for(n=0;n<N;n++){x[0]=A[n];y1[0]=1.31432*y1[1]-0.71489*y1[2]+0.08338*x[0]+0.16676*x[1]+0.0 8338*x[2];/*第一级*/x[2]=x[1];x[1]=x[0];y2[0]=1.0541*y2[1]-0.37534*y2[2]+0.08338*y1[0]+0.16676*y1[1]+0.0 8338*y1[2];/*第二级*/y1[2]=y1[1];y1[1]=y1[0];y[0]=0.94592*y[1]-0.23422*y[2]+0.08338*y2[0]+0.16676*y2[1]+0.083 38*y2[2];/*第三级*/y2[2]=y2[1];y2[1]=y2[0];y[2]=y[1];y[1]=y[0];A[n]=y[0];}}#define swap(a,b) T=(a); (a)=(b); (b)=Tvoid fft(float A[],float B[],unsigned M)//蝶形运算程序,A存实部,B存虚部,M是级数{unsigned long N,I,J,K,L,LE,LE1,P,Q,R;float Wr,Wi,W1r,W1i,WTr,WTi,theta,Tr,Ti;N=1<<M;J=0;for (I=0;I<N-1;I++){if(J>I){float T;swap(A[I],A[J]);swap(B[I],B[J]);}K=N>>1;while (K>=2&&J>=K){J-=K; K>>=1;}J+=K;}for(L=1;L<=M;L++) //for循环为M级FFT运算{LE=1<<L; // LE=1<<L表示2的L次幂,相当于本级运算的NLE1=LE/2; //LE1=2的L-1次幂,相当于有L-1个Wn Wr=1.0;Wi=0.0;theta=(-1)*3.1415926536/LE1; //theta相当于-2π/N,W1r=cos(theta);W1i=sin(theta);for(R=0;R<LE1;R++)//for循环为每级有2的L-1次运算,R为系数序号,LE1为系数个数{for(P=R;P<N;P+=LE) //for循环为蝶形的群运算{Q=P+LE1;Tr=Wr*A[Q]-Wi*B[Q];Ti=Wr*B[Q]+Wi*A[Q];A[Q]=A[P]-Tr;B[Q]=B[P]-Ti;A[P]+=Tr;B[P]+=Ti;}WTr=Wr;WTi=Wi;Wr=WTr*W1r-WTi*W1i;Wi=WTr*W1i+WTi*W1r;}}return;}。
c语言正弦信号滤波

c语言正弦信号滤波
在C语言中进行正弦信号滤波的实现,可以采用简单的数字滤波算法。
以下是一种常用的滤波器设计方法:
1. 定义一个数组作为输入和输出缓存,用来存储待滤波信号和滤波后的信号。
2. 初始化输入缓存和输出缓存,将它们的值设为0。
3. 定义滤波器的阶数和截止频率。
4. 创建一个函数,用来实现滤波器计算。
函数的输入参数为输入缓存和输出缓存。
5. 在滤波函数中,利用差分方程或者传递函数的方法,根据输入缓存的值计算输出缓存的值。
6. 将输出缓存的值返回给主函数,作为滤波后的信号。
7. 在主函数中,通过正弦函数产生一个输入信号。
8. 将输入信号传递给滤波函数进行滤波处理。
9. 将滤波后的信号打印输出或者进行其他处理。
这是一个简单的C语言滤波器实现的步骤,可以根据具体的滤波需求进行调整和优化。
需要注意的是,在实际应用中,滤波器的设计还需要考虑一些其他的因素,比如采样频率、滤波器的稳定性等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//N 值可根据实际情况调整
char 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; } } } for(count=1;count<(N-1);count++) { sum+=value_buf[count]; delay(); } return (char)(sum/(N-2)); } //去掉第一个和末一个数
数字滤波 C 程序
/***************************** 数字滤波 C 程 *************************/ /////////////////////////////////限副滤波/////////////////// /*滤波程序返回有效的实际值*/ #define A 10 //A 值可根据实际情况调整 char value; //value 为有效值 char filter() { char new_value; //new value 为当前采样值 new value=get_ad(); if ((new_value-value>A)‖(value-new_value> A) return value; return new_value; } /////////////////////////中位值滤波///////////////////////// #define N 11 //N 值可根据实际情况调整 char 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]; //取中间值 } /////////////////////////算术平均滤波//////////////////////
///////////////////移动平均滤波(递推平均滤波)/////////// #define N 12 char 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) } //////////////////////加权平均滤波/////////////////////// #define N 12 char code jq[N]={1,2,3,4,5,6,7,8,9,10,11,12};//加权系数表 char code sum_jq=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]*jq[count]; return (char)(sum/sum_jq); } /////////////////////////低通滤波//////////////////////// #define a 0.25 char value; //value 为已有值 char filter() { char new_value; //new value 为当前采样值 new_value=get_ad(); return (a*new_value+(1-a)*value); }
#define N 12 char filter() { int sum=0; for(count=0;count<N;count++) { sum+=get_ad(); delay(); } return (char)(sum/N); } ///////////////////去极值平均滤波 #define N 11 int sum=0; //////////////////////