对于上一篇博客中所设计的数字滤波器,设计的目的就是产生滤波器序列和h(n),然后,当输入信号序列为x(n)的时候,输出序列为y(n),实现如下图所示时域处理功能
那么,要实现上面的功能,时域上其实是x(n)和h(n)的线性卷积方法,通过c语言使用双重for循环实现线性卷积方法
//lb2.c
//离散序列线性卷积
#include <stdio.h>
float convolute(double *f,double *g,unsigned int k)
{
unsigned int n=0;
float sum=0;
for(n=0;n!=k;n++)
{
sum+=f[n]*g[k-n];
}
return sum;
}
void main()
{ int i,k;
double f[256]={0};
double g[257]={0};
FILE *fp=fopen("am.dat","r");
for(i=0;i<256;i++)
{
fscanf(fp,"%lf",&f[i]);
}
printf("%lf\n",f[0]);
fclose(fp);
FILE *fp1=fopen("lbq1.dat","r");
for(i=0;i<256;i++)
{
fscanf(fp1,"%lf",&g[i]);
}
printf("%lf\n",g[0]);
fclose(fp1);
float convo=0;
FILE *fp3=fopen("lb2.dat","w");
for(k=0;k<256;k++)
{
convo=convolute(f,g,k);
fprintf(fp3,"%lf\n",convo);
}
fclose(fp);
}
这里假设输入的信号为原始信号序列s=0.5cos(2pi200t),其频率为200hz,设计的低通滤波器序列是允许其通过的,那么使用低通滤波器对该原始信号进行处理,通过gnuplot作图显示原始信号图像为:
经过低通滤波器之后:
理论上来说,200hz信号经过所设计的低通滤波器之后,应该和原始的信号图像一致,但是从上图可以看出经过滤波器之后的信号,相位反转了180°,幅值有细微的变化。
使用该滤波器和滤波方法解调AM调制信号,解调AM信号使用的是相干解调法,当然还可以使用包络检波,相干解调的原理框图如下所示;
对于接受来的信号,需要乘一个与发射端同频同相的载波信号,然后再让信号通过低通滤波器滤除高频载波成分;
原始信号:
原始调制信号图像为:
接收端加入同步载波后
使用低通滤波器对其滤波处理后:
在接收端对原始信号进行滤波处理后,发现恢复出来的信号和原始信号相比有相位偏移,相位想法的现象,当然幅值跟随相位出现相反现象。因为我设计的滤波器是fir滤波器,且设计出来的滤波器有明显的吉布斯效应,低通滤波器设计的不够严谨。