频率采样法设计FIR滤波器【基于C语言】

    之前做了有个通信系统的仿真,实现的功能大概就是,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及周围频率的信号了,该滤波器的性能良好。

       由于本人的文字功底有限,知识有限,难免有些语句不优美,有些地方有原理性错误,欢迎在座的各位大佬指摘。关于该通信系统的其他模块,今后有时间,也会继续写上。 

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨狼007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值