入门:C语言完成算平均数

信号滤波器。请完成平滑滤波和中值滤波后分别输出结果数据。

有一组数据(1.8,1.5,1.1,0.5,0.9,1.1,1.4,1.8,2.3,2.8,2.4,2.1,1.6,1.4,1.1)
请对该数据进行如下的滤波操作。(滤波后的结果要放在新数组里,想想为什么?)

  • 窗口宽度为3的均值平滑滤波:
    Xi’={X(i-1)+X(i)+X(i+1)}/3
    两端的数据可以保持不变。

*窗口宽度为3的中值滤波:
Xi’= median {X(i-1),X(i),X(i+1)}
median 表示三个值的中间值(不是最大、也不是最小值)。两端的数据可以保持不变。


double medium(double num1,double num2,double num3) //中位数
{
    double array1[3]={num1,num2,num3},a,med;
    int i,j;
    for (i=0;i<2;i++){
        for (j=0;j<2-i;j++){
            if (array1[j]>array1[j+1]){
                a=array1[j];
                array1[j]=array1[j+1];
                array1[j+1]=a;
            }
        }
    }
    med=array1[1];
    return med;
}
int main()
{
    double init[]={1.8,1.5,1.1,0.5,0.9,1.1,1.4,1.8,2.3,2.8,2.4,2.1,1.6,1.4,1.1};
    int length=sizeof(init)/sizeof(init[0]),i;
    double process1[length],process2[length];
    for (i=0;i<length;i++){
        if (i==0 || i==length-1){
            process1[i]=init[i];
            process2[i]=init[i];
        }
        else{
            process1[i]=(init[i-1]+init[i]+init[i+1])/3;
            process2[i]=medium(init[i-1],init[i],init[i+1]);
        }
    }
    printf("均值平滑滤波为:");
    for (i=0;i<length;i++){
        printf("%.2f",process1[i]);
        if (i!=length-1){
            printf(",");
        }
        else{
            printf("\n");
        }
    }
    printf("中值滤波为:");
    for (i=0;i<length;i++){
        printf("%.2f",process2[i]);
        if (i!=length-1){
            printf(",");
        }
    }
    return 0;
}

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<assert.h>
double meanValue(double*array,int index,int n){
    double sum=0;
    int i=0;
    for(i=index;i<index+n;i++){
        sum+=array[i];
    }
    return sum/n;
}
// 均值
double*meanBlur(double*srcArray,int n,int ksize){
    double*newArray= (double*)malloc(sizeof(double)*n);
    if((ksize%2==0||ksize<3)){
        fprintf(stderr,"ksize should be odd num and greater than 2");
        abort();
    }
    int border = (int)(ksize/2);
    int i=0;
    for(i=0;i<n;i++){
        newArray[i]=srcArray[i];
    }
    for(i=border;i<n;i+=ksize){
        newArray[i] = meanValue(srcArray,i-border,ksize);
    }
    return newArray;
}
double medianValue(double*array,int index,int n){
   double*a=(double*)malloc(sizeof(double)*n);
   int i=0,j=0;
   double tmp=0;
   for(i=0;i<n;i++) a[i] = array[index+i];
   int mark = 0;
   //排序
   for(i=0;i<n-1;i++){
       mark=0;
       for(j=n-1;j>i;j--){
           if(a[j-1]>a[j]){
                tmp=a[j-1];a[j-1]=a[j];a[j]=tmp;
                mark=1;
           }
       }
       if(!mark) break;
   }
   return a[n/2];
}
// 中值滤波
double*medianBlur(double*srcArray,int n,int ksize){
    double*newArray= (double*)malloc(sizeof(double)*n);
    if((ksize%2==0||ksize<3)){
        fprintf(stderr,"ksize should be odd num and greater than 2");
        abort();
    }
    int i=0;
    for(i=0;i<n;i++){
        newArray[i]=srcArray[i];
    }
    int border = (int)(ksize/2);
    for(i=border;i<n;i+=ksize){
        newArray[i] = medianValue(srcArray,i-border,ksize);
    }
    return newArray;
}
int main(){
    // 1.8,1.5,1.1,0.5,0.9,1.1,1.4,1.8,2.3,2.8,2.4,2.1,1.6,1.4,1.1 可以看出均值滤波效果
    // double array[]={1.8,1.5,1.1,0.5,0.9,1.1,1.4,1.8,2.3,2.8,2.4,2.1,1.6,1.4,1.1};
    double array[]={1.5,1.1,0.5,0.9,1.1,1.4,1.8,2.3,2.8,2.4,2.1,1.6,1.4,1.1,1.8};
    int n = sizeof(array)/sizeof(double);
    // double*newArray=meanBlur(array,n,3);
    //1.5,1.1,0.5,0.9,1.1,1.4,1.8,2.3,2.8,2.4,2.1,1.6,1.4,1.1,1.8 这个可以看出中值滤波效果
    double*newArray=medianBlur(array,n,3);
    int i=0;
    for(i=0;i<n;i++){
        printf("%lf ",array[i]);
    }
    printf("\n");
    for(i=0;i<n;i++){
        printf("%lf ",newArray[i]);
    }
    printf("\n");
    system("pause");
}

img


修改数组为1.5,1.1,0.5,0.9,1.1,1.4,1.8,2.3,2.8,2.4,2.1,1.6,1.4,1.1,1.8
中值滤波结果就明显了

img