基於DSP的C語言來實現FIR濾波器


 首先,FIR濾波器的輸出公式為:

                                                  (具體的話可以查看數字信號處理書籍,都忘得差不多了。。。)

 

假設:輸入的信號是x(n) = sin(2*pi*f1*n/fs) + sin(2*pi*f2*n/fs)  

      所設計的濾波器是一個低通FIR濾波器,使用的是hamming窗,階數為10

則可以使用MATLAB 的濾波器設計工具來設計濾波器:

然后可以通過設計濾波器,生成C頭文件來獲取所需要的數值:

 

 

FIR濾波器的C程序如下:

#include <stdio.h>
#include <math.h>             

#define pi    3.1415
#define N     11                      //N為濾波器的階數+1
#define LEN   512

int inputdata[LEN];                   //假設數據的長度為512
int outputdata[LEN];

long int yn;                                //yn為int的話,在運算中數據可能會溢出,從而濾波失敗

const int B[N] = {166, 0, -1374, 0, 9453, 16279, 9453, 0, -1374, 0,  166}    //FIR濾波器的參數,由MATLAB生成
void main()
{
	int f1,f2,fs,i,j;
        int  *a;
	
        f1=100;    //頻率分量1(Hz)
	f2=300;    //頻率分量2(Hz)
	fs=800;    //采樣頻率(Hz)

	
	
	for(i=0;n<LEN;n++)
	{
            inputdata[n]=sin(2*pi*f1*n/fs) + sin(2*pi*f2*n/fs);    //產生信號
        }
		
	for(j=0;j<LEN;j++)             //根據公式來進行濾波
	{
		a=&inputdata[j];
		yn=0;
		
                for(i=0;i<N;i++)
		{
                     yn=yn+B[i]*(*a++);
                }	
			
		outputdata[j]=yn>>16;     //濾波后信號
	}
	
	while(1);
}
                 

 

在CCS環境下運行,並且通過Graph來觀察inputdata和outputdata的時域和頻域圖(這里就不上圖了,在學校的實驗課上測試過了。。。)

其CMD文件為:

-e start
MEMORY  {
        PAGE 0:
	         	PARAM:  org = 3000h    len = 4000h
        PAGE 1:
                        DARAM:  org = 100h    len=4000h
        } 
                                      
SECTIONS{
         .text 	        : >       PARAM   PAGE 0 
         stack          : >       DARAM   PAGE 1
         filter_vars	: >       DARAM   PAGE 1
        .bss  	 	: >       DARAM   PAGE 1
        .data 	 	: >       DARAM   PAGE 1
        }

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM