信号的解调方式
解调是从携带信息的已调信号中恢复消息的过程。在各种信息传输或处理系统中,发送端用所欲传送的消息对载波进行调制,产生携带这一消息的信号。接收端必须恢复所传送的消息才能加以利用,这就是解调。
相干解调
接收机接收到的信号为已调信号,该信号通过解调器再次与一个载波信号相乘,
解调后的信号包含一个低频信号和一个高频成分,用一个低通滤波器把高频成分滤掉,就得到了要传递的基带信号以上这个解调过程就是相干解调。
包络检波
非相干解调也称为包络检波,包络检波就是直接从已调波的幅度中恢复出原调制信号。不需要相干载波。AM信号一般都采用包络检波。
FIR低通滤波器设计
在信号处理中,滤波器的设计是非常重要的一个环节,滤波器分两大类,一种是模拟(ANALOG)滤波器,另外一种是数字(DIGITAL)滤波器。模拟(ANALOG)滤波器是由模拟电路构成,而数字(DIGITAL)滤波器是由数字处理集成电路模块(DSP)和相应的软件构成。
数字(DIGITAL)滤波器是可编程的,所以相对于模拟(ANALOG)滤波器有很多优点。其中最大的优点是通过改变程序或改变程序变量就可设计出不同特点的滤波器,而且数字滤波器可以精确的处理低频率信号。
FIR滤波器是非递归型滤波器的简称,又叫有限长单位冲激响应滤波器。带有常系数的FIR滤波器是一种LTI(线性时不变)数字滤波器。冲激响应是有限的意味着在滤波器中没有发反馈。
那么滤波器设计的目的就是产生离散的滤波器的序列,h(0)h(1)。。。。h(n)。
设计方法
FIR滤波器的设计方法有很多种,在这里使用传函数法,窗函数法设计的滤波器步骤包括:
(1)根据实际阻带衰减指标,来确定所使用的窗函数。
(2)根据过渡带来计算出N值。
(3)求出理想的hd(n)。
(4)加窗处理。
//lbq1.c
//求出给定频率下的滤波器数字序列
#include <stdio.h>
#include <math.h>
#include <string.h>
#define fs 51200 //定义采样采样频率
#define pi 3.14159265
int low_fliter(double h1[],double w[],double h[],double fH,double fL,int m); //求滤波器序列函数,输出h[n]
int windows_hanning(double fh,double fl,double *w); // 汉宁窗函数,输入通带与阻带截止频率,输出窗函数w
int windows_haming(double fh,double fl,double *w); // 哈明窗函数,输入通带与阻带截止频率,输出窗函数w
double div(double up,double down); //求单位取样响应hl[i]
int main(void)
{
int i,N;
double w[500]={0},h[500]={0},h1[500]={0},z[500]={0};
memset(w,0,200*sizeof(double)); // 使用过的序列清零
memset(h1,0,200*sizeof(double));
N=low_fliter(h1,w,z,200,1000,1); // 调用滤波函数,最后一个参数为 1 时,使用哈明窗
FILE *fp=fopen("lbq1.dat","wb");
for(i=0;i<N;i++)
{
fprintf(fp,"%lf\n",z[i]);
}
fclose(fp);
}
int low_fliter(double h1[],double w[],double h[],double fH,double fL,int m) // 滤波函数
{
int i=0,j,N;
double f1,omega1;
f1=fH+(fL-fH)/2; //求出滤波器的实际截至频率fl
omega1=2*pi*f1/fs; // 求出通带边缘截止数字频率
if(m==0)
N=windows_hanning(fH,fL,w); // 满足m=0 时,调用 汉宁窗
else
N=windows_haming(fH,fL,w); // m!=0 时, 调用 哈明窗
printf("N=%d\n",N);
for(i=0;i<N;i++)
{
// h1[i]=sin(omega1*(i-(N-1)/2))/((i-(N-1)/2)*pi);
h1[i]=div(sin(omega1*(i-(N-1)/2)),(i-(N-1)/2)*pi); //求出脉冲响应;
h[i]=h1[i]*w[i]; // 求出滤波器序列
}
return N;
}
int windows_hanning(double fh,double fl,double *w) //汉宁窗函数
{
int TW,N;
double x;
int i,j;
TW=fl-fh;
x=3.32*fs/TW; //利用公式求出序列长度x 为小数,估计窗函数的长度
N=integer(x); // 利用第一类线性相位滤波器,N为奇数,N为窗函数长度。
for(i=0;i<N;i++)
{
w[i]=0.5+0.5*cos(2*pi*(i-(N-1)/2)/(N-1)); //根据相应的公式生成,窗函数,
}
return N; //返回一个值,窗函数序列长度
}
/*
int windows_rect(double fh,double fl,double *w) //汉宁窗函数
{
int TW,N;
double x;
int i,j;
TW=fl-fh;
x=3.32*fs/TW; //利用公式求出 序列长 x 为小数
N=integer(x); // 调用函数取 序列长为奇数
for(i=0;i<N;i++)
{
w[i]=1; //根据相应的公式生成,窗函数
}
return N; //返回一个值,窗函数序列长度
}
*/
int windows_haming(double fh,double fl,double *w)
{
int TW,N;
double x;
int i,j;
TW=fl-fh;
x=3.44*fs/TW;
N=integer(x);
for(i=0;i<N;i++)
{
w[i]=0.54+0.46*cos(2*pi*(i-(N-1)/2)/(N-1));
}
return N;
}
double div(double up,double down) // 求脉冲响应
{
double x;
if(down==0)
x=0;
else
x=up/down;
printf("%lf\n",x);
return x;
}
int integer(double x) // 取序列长度为奇数的函数
{
int N;
N=(int)x;
if(N%2==0)
{
N=N+1;
}
else
{
N=N+2; // 否则就是原值加2
}
return N;
}
将生成的滤波器序列通过gnuplot做出滤波器的时域图像:
将滤波器序列进行fft变换得到频谱图:
从上图可以看出通带存在纹波,这也就是所谓的吉布斯效应。产生这个现象的根本原因就是截断相当于在时域乘以一个矩形框,矩形框的频响有边瓣效应, 无论什么窗函数都有边瓣。