- 用于对复数信号(I+jQ)做滤波;
- 滤波器为实数系数,奇数位数最佳;
- 对标Matlab的conv(x,y,'valid')。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DATA_LEN 7
#define FILTER_LEN 3
typedef struct Complex_Double_Struct
{
double real;
double imag;
}COMPLEX_DOUBLE_STRUCT;
typedef struct Data_Struct
{
unsigned int data_length;
COMPLEX_DOUBLE_STRUCT data[DATA_LEN];
}DATA_STRUCT;
typedef struct Filter_Struct
{
unsigned int filter_length;
double filter_coef[FILTER_LEN];
}FILTER_STRUCT;
int Filter_Operation(const DATA_STRUCT *data_in,DATA_STRUCT *data_out,const FILTER_STRUCT *filter);
int main()
{
DATA_STRUCT data_in;
DATA_STRUCT data_out;
FILTER_STRUCT filter;
memset((void*)&data_out,0,sizeof(data_out));
data_in.data_length=DATA_LEN;
data_in.data[0].real=1.0;
data_in.data[0].imag=2.0;
data_in.data[1].real=1.0;
data_in.data[1].imag=-2.0;
data_in.data[2].real=-1.0;
data_in.data[2].imag=1.0;
data_in.data[3].real=-1.0;
data_in.data[3].imag=4.0;
data_in.data[4].real=1.0;
data_in.data[4].imag=0.0;
data_in.data[5].real=2.0;
data_in.data[5].imag=2.0;
data_in.data[6].real=4.0;
data_in.data[6].imag=2.0;
filter.filter_length=FILTER_LEN;
filter.filter_coef[0]=0.1;
filter.filter_coef[1]=0.8;
filter.filter_coef[2]=0.1;
Filter_Operation(&data_in,&data_out,&filter);
return 0;
}
int Filter_Operation(const DATA_STRUCT *data_in,DATA_STRUCT *data_out,const FILTER_STRUCT *filter)
{
unsigned int i=0;
unsigned int j=0;
COMPLEX_DOUBLE_STRUCT data_tmp;
for(i=0;i<=(data_in->data_length)-(filter->filter_length);++i)
{
data_tmp.real=0;
data_tmp.imag=0;
for(j=i;j<i+filter->filter_length;++j)
{
data_tmp.real+=data_in->data[j].real*filter->filter_coef[j-i];
data_tmp.imag+=data_in->data[j].imag*filter->filter_coef[j-i];
}
data_out->data[i].real=data_tmp.real;
data_out->data[i].imag=data_tmp.imag;
}
data_out->data_length=data_in->data_length-filter->filter_length;
return 0;
}
matlab 对标结果: