TA的每日心情 | 难过 2020-4-23 15:10 |
|---|
签到天数: 37 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位大神,我有一个疑问。fir的输出序列长度按道理是输入序列的长度+滤波器的阶数。可最近看了一个代码,它的输出序列长度冒似与输入序列长度相同,恳请指点一下。, S: C. h9 r. F( N7 a* F
滤波函数:
+ V. t& w9 y& U/ |0 n* k#define NUM_TAPS 485 H0 ^( i) v. N3 N. {9 n4 J; k
#define NUM_DATA 806 P0 F$ F5 c" n
& ]7 l! R* W1 S# G
6 n9 @- X' h% j: mvoid floatPointFir(float *x, float *h, short order, float *y, float *w)
M1 A' v6 ~7 M2 o{
! c, ^3 ]* C- M# i! E short i;2 R# {+ \8 g8 ?
float sum;
7 m/ J" ^6 w" X w[0] = *x++; // Get the current data to delay line
7 R d4 l% w3 M( W6 R for (sum=0, i=0; i<order; i++) // FIR filter processing; {4 {! D( e" d* M2 f1 Q2 I7 a
{
4 s# n: Z% K7 P- p sum += h * w;2 V& I" J5 ~* G* K0 V- ~: i5 H( o
} h& g5 l' j$ {2 U/ z2 B
*y++ = sum; // Save filter output
! q9 B' ~: A# N1 f+ [6 @8 r for (i=order-1; i>0; i--) // Update data delay line0 u; Y l6 D, T0 u2 _! z2 j. H- y, g
{
1 F P! v6 ?$ `4 T7 v9 @' X: r9 U/ g; y w = w[i-1] ;8 V7 F6 x' h; _& x* w: g: W- A
}
: h% u* L6 J3 o* l}8 _5 n$ g) q \0 | S8 {3 j
# d' c# i- U0 y2 b! v. e4 s
3 `- v H' I0 b1 t5 q测试代码:
* t* ]& J8 Y% j- dfloat w[NUM_TAPS];
- O% u& i8 j0 Rvoid main()4 G5 k& f; L) o
{
( W" r3 p1 i$ A% g2 K FILE *fpIn,*fpOut;$ S: b) ?7 b& [% b- o
short i;4 C- \9 i. d' t2 h
char temp[2];
8 M) k9 {1 e! u% o& u float x, // Input data
$ m* _* |3 t2 I8 k4 [ y; // Output data* D3 V2 z/ l+ y0 v: s) e
& o5 r/ A, ?7 m8 i5 p+ s) B fpIn = fopen("..\\data\\input.pcm", "rb"); % }+ i' J( k! d2 `/ ?6 h O
fpOut = fopen("..\\data\\output.pcm", "wb");1 u* ^5 u; T5 E! q+ P ^( w
if (fpIn == NULL)6 j2 T) \ R6 I& H- _) f0 g& g
{6 o! x( c3 a; Q! \, _1 W
printf("Can't open input file\n"); x ~# Z; v' I" N0 K) s
exit(0);7 J6 L, X: T1 `% `: |
}
! M& r; f' {- X 0 T+ T0 S% P& y3 W) t; H. Y
// Initialize for filtering process
1 ]4 C, S1 h* R, \ for (i=0; i<NUM_TAPS; i++)! p) y+ u7 |3 F3 J+ w
{
6 [+ r/ e6 C9 @3 Q; o# D w = 0.0;
1 _8 e# V1 e1 X3 X2 y r S% B+ V }
& ]. M" {7 a# |/ e. [ // Begin filtering the data& @4 R8 f" x ^5 V' W
while (fread(&temp, sizeof(char), 2, fpIn) == 2)/ e4 ~8 B) _; n
{
& u: Y2 Q+ e1 v& o2 F( p x = (float)((temp[1]<<8)|(temp[0]&0xff));+ a; m; ]* o1 c8 f2 J5 _
// Filter the data x and save output y
, O+ ?4 ]. P' q9 u floatPointFir(&x, firCoefFloatingPoint, NUM_TAPS, &y, w);: B; `; w1 U& c
temp[0] = (char)((short)y&0xff);, q0 p% M. N/ q+ o+ D
temp[1] = (char)(((short)y>>8)&0xff);
' f& W1 O& M, t3 l0 B+ p( w fwrite(&temp, sizeof(char), 2, fpOut);, d/ W% _8 o8 i, u
}
$ ~, @8 N- w" g8 @9 ~& n! P& w fclose(fpIn);6 C O; f; k/ L; R. ~& a' r
fclose(fpOut);
1 _( K( [5 ^: y6 N0 n}
+ A# ]$ W, Q0 f2 m3 |! S
2 N( g! g/ U& e, A
. m6 d% z: m1 ]7 ?0 s. { |
|