之前做了有个通信系统的仿真,实现的功能大概就是,ASK、FSK、PSK等方式的调制解调,再通过加高斯白噪声模拟真实信道,实现模拟信道中信号的传输,话不多说,先上结果图:
从上到下依次是信号的输入,调制,加噪声,加噪声后的滤波,判决输出,因为这是FSK,所以会有判决是对两个信号电平的判决,这里就不再显示出来,并且中间几个步骤就省略了,今天就想写写这其中滤波器的设计。这里,主要是通过窗函数法和频率采样法进行滤波器的设计的。窗函数法之前接触的比较多,比较熟悉,所以今天,就写写不熟悉的频率采样法,其步骤如下:
<1>根据阻带的衰减,选择过渡带采样点的个数
我设计的这个滤波器,过渡带宽度为100Hz,所以阻带内采样1点就够了
<2>构造希望逼近的频率响应函数
我这个带通滤波器的带宽,初步设定为200Hz,这样频响就构造了,该用程序完成这个频响的采样了:
for (i = 0; i<(a + 1) / 2; i++)
{
if (fs*i / N > Bpfcl && fs*i / N <Bpfch)
{
Hb[i] = 1.0; Hb[N - i - 1] = 1.0;
}
else
{
Hb[i] = 0.0; Hb[N - i - 1] = 0.0;
}
}
for (i = 0; i<N / 2; i++)
{
if (Hb[i] == 1 && Hb[i + 1] == 0)
{
Hb[i + 1] = 0.5; Hb[N - i - 1] = 0.5;
}
else if (Hb[i] == 0 && Hb[i + 1] == 1)
{
Hb[i] = 0.5; Hb[N - i] = 0.5;
}
}
for (i = 0; i<(a + 1) / 2; i++)
{
if (fs*i / N > Bpfcl && fs*i / N <Bpfch)
{
Hb[i] = 1.0; Hb[N - i - 1] = 1.0;
}
else
{
Hb[i] = 0.0; Hb[N - i - 1] = 0.0;
}
}
for (i = 0; i<N / 2; i++)
{
if (Hb[i] == 1 && Hb[i + 1] == 0)
{
Hb[i + 1] = 0.5; Hb[N - i - 1] = 0.5;
}
else if (Hb[i] == 0 && Hb[i + 1] == 1)
{
Hb[i] = 0.5; Hb[N - i] = 0.5;
}
}
代码很好理解,就是通带内值为1,阻带内采一点,值为0.5(这主要了为了减小过渡带衰减),其余地方值为0,这个函数是对称的,所以写一半就好了。
<3>然后就是对上式构造的频率响应函数进行频率内采样了,其公式如下:
H(k)=Hg*exp(-j(N-1)*PI*k/N)
这个公式不解释,课本上的公式而已。
for (i = 0; i<N; i++)
{
HbR[i] = Hb[i] * (float)cos((a - 1) / a*PI*i);
HbI[i] = Hb[i] * (float)sin(-(a - 1) / a*PI*i);
}
这个代码就是上述公式的编程实现了
<4>最后就是对上式进行N点的IDFT,就得到了第一类线性相位FIR数字滤波器的单位脉冲响应函数了,关于IDFT的编程,这里就不再缀余。
传递函数设计完了,接下来就是它和信号时域上进行卷积了【时域上相卷积等于频域上相乘积】。
最后看一下结果吧:
这个就是采样频率8k,中心频率1k,带宽200的带通滤波器的时域及频域图,下面展现一下滤波效果:
这个是加噪声的信号
这个就是滤波之后的信号了,频域图上可以看到,2kHz及附近信号已被滤掉,只剩1kHz及周围频率的信号了,该滤波器的性能良好。
由于本人的文字功底有限,知识有限,难免有些语句不优美,有些地方有原理性错误,欢迎在座的各位大佬指摘。关于该通信系统的其他模块,今后有时间,也会继续写上。