- c实现数字信号通过低通滤波器
对前面采集的数字信号进行相干解调的过程中,使用到一个滤波器数组和接收信号数组的线性卷积的过程。
//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,j;
double f[256]={0};
double g[257]={0};
float convo=0;
FILE *fp1=fopen("lbq1.dat","r");
for(i=0;i<256;i++)
{
fscanf(fp1,"%lf",&g[i]);
}
fclose(fp1);
FILE *fp=fopen("am.dat","r");
FILE *fp3=fopen("lb2.dat","w");
for(j=1;j<10240;j++)
{
if(j<=256)
{
for(i=0;i<j;i++)
{
fscanf(fp,"%lf",&f[i]);
}
convo=convolute(f,g,j-1);
fprintf(fp3,"%lf\n",convo);
}
else
{
fseek(fp,(j-256)*8L,SEEK_SET);
for(i=0;i<256;i++)
{
fscanf(fp,"%lf",&f[i]);
}
convo=convolute(f,g,256);
fprintf(fp3,"%lf\n",convo);
}
}
fclose(fp);
fclose(fp3);
}
使用文件写入将低筒滤波器的数据写入到一个数组中待用,也即对应上图中的h(0)…h(n-1)序列的数值。
对于接收到的数据序列,此处数值为51200个点,想要滤波,预先设置好一个数组f,大小为256个数,在数据点小于257点时,每次读入数据到f数组中,实现卷积算法后输出对应的一个点,即是滤波后的数据点。对于大于256个数后,对原始数据文件里面的数据使用的方法是类似入队出队的算法,此处使用的是根据读取的数据的规律,使用文件指针函数fseed()定义数据文件的位置,每次读取256个点,与滤波器的数据序列进行卷积计算出滤波后的数值。程序算法流程图如下:
关于上面使用到的fseek函数,每次定义其指针地址的位置,实现类似数据入队出队的功能(fseek(fp,(j-256)*8L,SEEK_SET);偏离首地址的字节数为(j-256)*8L;
- 实现对AM信号解调
AM信号解调:
对AM信号进行相干解调时候,首先对数据加入一个同步载波,再将其经过低通滤波器;相当于上面数组f读取的是接收信号乘上同步载波后的数据。采样10240个点后滤波,通过gnuplot将滤波后的图形画出来:
对DSB信号的解调也是使用相干解调的方法来实现,采取对接收到的信号进行同步载波相乘后进过滤波器滤波,解调出来的信号图形如下:
原始信号为:
可见解调还原出了原始信号,但是由于滤波器设计的短板,所以不可能无误差的还原出原始信号,解调出来的信号在幅值和初相上有一定程度的失真。