頻率採樣法設計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;
			}
		}

       代碼很好理解,就是通帶內值爲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及周圍頻率的信號了,該濾波器的性能良好。

       由於本人的文字功底有限,知識有限,難免有些語句不優美,有些地方有原理性錯誤,歡迎在座的各位大佬指摘。關於該通信系統的其他模塊,今後有時間,也會繼續寫上。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章