義守大學電機系

授課教師:陳慶瀚

E-mail : pierre@isu.edu.tw   

10. Filtering(濾波)

 

下載signal.cpp

 

1. 以下是訊號濾波的範例程式,採用上一章範例2的資料檔(存檔為signal.txt),驗證下列程式:

#include <iostream.h>

#include <fstream.h>

void main()

{

    ifstream myfile("signal.txt");

    float m[128];

    int i,j;

    for(i=0;i<128;i++)

    {

        myfile>>m[i];

    }

    float f[5]={0.2,0.2,0.2,0.2,0.2};

    float y[128];

    for(i=0;i<128;i++)y[i]=m[i];

    for(i=2;i<128-2;i++)

    {

        y[i]=0;

        for(j=0;j<5;j++)

        {

            y[i]=y[i]+f[j]*m[i+j-2];

        }

    }

    ofstream out("filtering.txt");

    for(i=0;i<128;i++)

    {

        out<<m[i]<<"\t"<<y[i]<<endl;

    }

}

執行本程式,在Excel中把結果繪製成曲線如下:

2. 將上述濾波運算功能移植到Signal物件類別中,作為一個成員函式。

   void Filtering()
   {
      int i,j;
      float f[5]={0.2,0.2,0.2,0.2,0.2};
      float y[128];
      for(i=2;i<128-2;i++)
      {
         y[i]=0;
         for(j=0;j<5;j++)
         {
            y[i]=y[i]+f[j]*m[i+j-2];
         }
      }
      for(i=2;i<128-2;i++)m[i]=y[i];
   }

3. 請修改上述成員函式,將y[128]改成動態記憶體配置型態

 

4.請將濾波器長度改為7,即

   float f[7]={0.14,0.14,0.14,0.14,0.140.140.14};

  修改成員函式對應的相關程式碼,並驗證結果。

 

5. 設計濾波器

#include <iostream.h>

#include <fstream.h>

#include <math.h>

#define pi 3.141592653589793

#define wlc 1.88459

void main()

{

   int i,N=10;

   float f[21];

   ofstream out("filter.txt");

   for(i=-N;i<=N;i++)

   {

    if(i==0) f[i+N]=sin(1E-20*wlc)/(pi*1E-20);

    else f[i+N]=sin(float(i)*wlc)/(pi*float(i));

    cout<<f[i+N]<<endl;

    out<<f[i+N]<<endl;

   }

}

以下是所得濾波器的圖形:

6. 請把第5題執行後得到的濾波器係數複製到成員函式中,取代原本的均值濾波器係數。

 

 


計算機程式

義守大學電機系 陳慶瀚
2004.10. 20更新