信号滤波器。请完成平滑滤波和中值滤波后分别输出结果数据。
有一组数据(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’= 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");
}