2013-09-30 280 views
2

我有一個家庭作業在C中實現FIR濾波器,我不知道你是否認爲我正確理解了這個任務。我寫的,我認爲該方案解決了這個問題是:C語言中的FIR濾波器?

#include <stdio.h> 
float FIRfloats[5]; 
void floatFIR(float newsample) 
{ 
    int i; 
    float sum=0; 

    FIRfloats[0]=newsample*0.0299; 
    FIRfloats[1]=FIRfloats[2]*0.4701; 
    FIRfloats[2]=FIRfloats[3]*0.4701; 
    FIRfloats[3]=FIRfloats[4]*0.0299; 

    /* sum */ 
    for(i=0;i<5;i++) 
    { 
    sum=sum+FIRfloats[i]; 
    } 
    printf("Sum: %f\n", sum); 
} 

int main() 
{ 

    float n=0.0f; 
    while (scanf("%f", &n) > 0) 
    { 
    floatFIR(n); 
    } 
    return 0; 
} 

和規格是

一個新的樣本XK到達老樣本被轉移到 權,然後將每個樣本進行縮放之前與 結果YK之前的係數,所有縮放的樣本的總和,計算

係數應該是C0 = 0.0299,C1 = 0.4701,C2 = 0.4701,C3 = 0.0299。

您是否認爲我正確解決了作業?我認爲這似乎太容易了,因此我想知道。

+0

看不到任何移位。你似乎在縮放單個值。當你有足夠的價值時,你應該輸入幾個值然後縮放嗎? – Neil

+1

什麼是FIRfloats [2],FIRfloats [3]和FIRfloats [4]在初始條件下,它是零嗎?這是對的嗎? –

+0

延遲應僅用於輸入,不能與係數相乘。係數應該用在你的sum循環中。 參見圖表:http://en.wikipedia.org/wiki/Finite_impulse_response – bavaza

回答

2

恐怕在問題中提供的實現不會提供正確的結果。

在FIR(有限脈衝響應)與4度係數的輸出系列(Y),用於輸入一系列(x)的過濾器是:

y[t] = c0*x[t] + c1*x[t-1] + c2*x[t-2] + c3*x[t-3] 

因此執行應類似於:

/* add includes (stdio.h and whatever else you'll need...) */ 

float floatFIR(float inVal, float* x, float* coef, int len) 
{ 
    float y = 0.0; 
    for (int i = (len-1) ; i > 0 ; i--) 
    { 
     x[i] = x[i-1]; 
     y = y + (coef[i] * x[i]); 
    } 
    x[0] = inVal; 
    y = y + (coef[0] * x[0]); 
    return y; 
} 

main(int argc, char** argv) 
{ 
    float coef[4] = {0.0299, 0.4701, 0.4701, 0.0299}; 
    float x[4] = {0, 0, 0, 0}; /* or any other initial condition*/ 
    float y; 
    float inVal; 

    while (scanf("%f", &inVal) > 0) 
    { 
     y = floatFIR(inVal, x, coef, 4); 
    } 
    return 0; 

} 

這是在相同的循環移位和乘法(不影響結果 - 只是更有效。) 如果你想嚴格按照規範,你可以像這樣改變floatFir:

float floatFIR(float inVal, float* x, float* coef, int len) 
{ 
    float y = 0.0; 
    for (int i = (len-1) ; i > 0 ; i--) 
    { 
     x[i] = x[i-1]; 
    } 
    x[0] = inVal; 

    for (int i = 0 ; i < len ; i++) 
    { 
     y = y + (coef[i] * x[i]); 
    } 
    return y; 
}