TA的每日心情 | 难过 2020-4-23 15:10 |
---|
签到天数: 37 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位大神,我有一个疑问。fir的输出序列长度按道理是输入序列的长度+滤波器的阶数。可最近看了一个代码,它的输出序列长度冒似与输入序列长度相同,恳请指点一下。
- T( q* d9 `9 n( ^滤波函数:4 k5 b# S' ~, ]
#define NUM_TAPS 48+ F" {6 I3 s/ E/ {" ~) |
#define NUM_DATA 805 V8 _( x5 |/ h& L- z
8 g, G4 F3 @$ y0 a6 ?
" q8 w/ g# `) z" Dvoid floatPointFir(float *x, float *h, short order, float *y, float *w)7 }" W3 E: H# h! W! ?5 G) {4 `
{
3 ?1 F, U* ~1 e' J* j7 w5 f6 V2 O short i;
' y9 x8 v+ h+ C2 Z. y float sum;
" J( T8 p& e- T5 U8 X1 o. x w[0] = *x++; // Get the current data to delay line
1 V: n3 k, T8 ^ for (sum=0, i=0; i<order; i++) // FIR filter processing
: j7 S; y8 ]3 G# W b' j( u/ M0 ^ {
- |& q, i. M' Q" @ sum += h * w;; d. S- m5 I5 d5 l& g; p! M7 j
}
( |$ \+ d! t" h5 _& e9 F *y++ = sum; // Save filter output: |' `$ J* Y1 `
for (i=order-1; i>0; i--) // Update data delay line# f% I2 a% f, s5 O, U$ Q
{) n& K4 c0 p0 S# T2 {9 U
w = w[i-1] ;" c3 c8 z' v* }
}+ ]9 u0 d9 w' S8 O1 ^( z' {
}- g) l# W* T- e( n" T7 z
* k) n L( X9 X, \/ u6 @6 t
) a2 Z, q) ~% c* ~% Z4 \: f测试代码:
4 [4 z( x; f7 O7 J! j# h1 qfloat w[NUM_TAPS]; Q' w/ E# }( {2 ]) O9 [
void main(), } C9 q4 A4 v, v
{
& C# g/ {6 T2 S! Z B# ` FILE *fpIn,*fpOut;
, i/ [& ]" @7 e short i;
8 S* e5 P/ e& b. G g char temp[2];
- V3 J) }3 _! ~) I; j& p float x, // Input data
6 G5 A$ p ?' t/ ? y; // Output data! x1 ?/ J& n3 d& A0 U. G
* D& t( f& U- T4 A; K
fpIn = fopen("..\\data\\input.pcm", "rb");
7 f: k7 n8 O. \ fpOut = fopen("..\\data\\output.pcm", "wb");
: f3 p2 D/ e* t3 M5 F7 n* P if (fpIn == NULL)
8 E6 ~* Q3 Q3 h( f0 b6 f {
4 ^ U" O! q, i, U# d printf("Can't open input file\n");
' G9 a3 ]' q9 h exit(0);5 s9 C, I$ q7 G% k1 \0 {. W
}( x/ D& D: }! |+ J U$ ~# J
+ Z& c; {3 }0 }& U3 _6 R7 u // Initialize for filtering process6 D) N- z6 N' O, u+ A- b& [* o
for (i=0; i<NUM_TAPS; i++)1 `. Z6 M7 j* a& A" e6 ~0 m& O8 f
{/ F% P5 [# A3 |0 f& `/ B6 A
w = 0.0;1 v2 f% a+ {2 u* b$ I* x1 I6 N
}9 y% z4 C& R1 C- q& Z2 |& c
// Begin filtering the data
3 O0 @& b- \8 C l# { while (fread(&temp, sizeof(char), 2, fpIn) == 2)* H- z# f8 |# _1 ]6 m/ ?: y
{% Q( p) G! z4 Y/ R
x = (float)((temp[1]<<8)|(temp[0]&0xff));5 T3 j7 Y9 y) v5 Q1 o8 i" F
// Filter the data x and save output y
5 _0 v: N2 L4 D/ r6 j `( m; M floatPointFir(&x, firCoefFloatingPoint, NUM_TAPS, &y, w);
4 ^( ]7 X! \$ Y R- i1 e6 | temp[0] = (char)((short)y&0xff);
4 ~& s4 j* l: O, M/ {/ _* { temp[1] = (char)(((short)y>>8)&0xff);: D- M& D4 N, e% X: B: M% l8 k7 c/ [
fwrite(&temp, sizeof(char), 2, fpOut);5 w4 @. E2 g! ^" p
}: N, F% q# i) X! k, i, `" L5 g
fclose(fpIn);
6 l0 P U. ]' j6 `* L8 l fclose(fpOut);8 b7 |. E: h, n, W F
}& j5 G5 y4 f/ d( s7 H B
C2 l2 @0 `' p3 V5 E: S( |9 j. R* Y( u* G
|
|