TA的每日心情 | 难过 2020-4-23 15:10 |
---|
签到天数: 37 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位大神,我有一个疑问。fir的输出序列长度按道理是输入序列的长度+滤波器的阶数。可最近看了一个代码,它的输出序列长度冒似与输入序列长度相同,恳请指点一下。 }% K) N( K, X* f9 o# C1 t6 z! D
滤波函数:
* B9 Z, f4 b' ~' \% S9 i& ~#define NUM_TAPS 48, t5 e G; }1 P( c( P0 F' U8 w
#define NUM_DATA 80
/ j* a+ `4 Z8 a# y# \+ N: n$ I# R" o5 Y
7 ?4 b2 G1 a& e% Y' U* i
void floatPointFir(float *x, float *h, short order, float *y, float *w)/ _! p& _6 M/ w5 X. m- }3 A
{0 o' k( } ^) N1 f2 r0 c
short i;
8 p# |- X) |) V: E float sum;
5 b5 w3 ]# A) l% q1 `% M5 @) c4 ? w[0] = *x++; // Get the current data to delay line
& y( \: l& l* n for (sum=0, i=0; i<order; i++) // FIR filter processing. @6 h: b& `1 e
{
0 Z2 a. b1 q& Y9 J sum += h * w;
( a* b0 v" Q) M& R. Q. t1 m! } }
/ N8 }+ l$ o: ^ *y++ = sum; // Save filter output
9 r+ M D9 k0 l) k( q for (i=order-1; i>0; i--) // Update data delay line) l ?3 p# {% _4 S9 S, B/ C$ {
{3 l) [8 C0 @! u3 W
w = w[i-1] ;* _. e4 V. G) K) h
}) z8 g3 ]; U1 V. ~4 V, a; l9 w
}
2 f0 O1 J9 s3 H4 L- {8 E! u* P
- W% Q5 t; G8 J. W8 P" z! T
" \3 O0 g Y" ^测试代码:
2 D1 y6 j* R% W Cfloat w[NUM_TAPS];, I" ^- B" A; T3 f! {/ w
void main()3 ?& ~: n7 A5 s, ?: k4 p* l
{8 Z1 ]" i$ A4 |+ k7 ~
FILE *fpIn,*fpOut;+ V3 B0 [ W' K0 r
short i;0 t1 a5 Y4 s% N0 `. g
char temp[2];, H" U4 r2 R) U! f0 X, ^- U# Z) X
float x, // Input data
& K9 o5 O7 q1 |8 r9 @ y; // Output data
/ t. V; n8 |5 K" Z, Q6 |/ I
; p2 s- O# D& [/ @ fpIn = fopen("..\\data\\input.pcm", "rb"); . I- V/ L' F) E/ a6 Z
fpOut = fopen("..\\data\\output.pcm", "wb");
1 @9 ?1 E( E- l4 S! E if (fpIn == NULL)/ k, q. |% ^5 M9 A. R
{! J' ~* \. K U* H$ @7 G
printf("Can't open input file\n");
7 W) h$ S/ b% ^, G exit(0);3 q4 ^! d% x8 y/ z3 y( S( |
}1 T4 s' w2 |0 k* `5 I
2 \7 o- G/ f2 D" h9 p; s; o // Initialize for filtering process
3 a. K: ~% e+ n, D) Q( A% B for (i=0; i<NUM_TAPS; i++)
& v3 j+ b8 n- x* C {' I7 a+ K0 I: z8 t$ S
w = 0.0;
) c$ z& [* V7 u# h; P5 p }; m6 [8 s2 v8 c" O, n
// Begin filtering the data% O& v( F3 s9 K" d% n
while (fread(&temp, sizeof(char), 2, fpIn) == 2)
! _9 z; ~+ _) _% C! h. X { e4 D8 d, |1 m4 w1 y h" t1 W
x = (float)((temp[1]<<8)|(temp[0]&0xff));
. u3 E- D- v* R7 x // Filter the data x and save output y t: X6 d/ y9 Q+ J9 k8 Y
floatPointFir(&x, firCoefFloatingPoint, NUM_TAPS, &y, w);
$ `/ z: h, P% B. _$ A& s temp[0] = (char)((short)y&0xff);
; M/ m0 D% q6 a& F$ q1 c temp[1] = (char)(((short)y>>8)&0xff);
, f$ x* W, i* ?# C+ q fwrite(&temp, sizeof(char), 2, fpOut);- Q$ [$ @( [" t
}
. h! w3 ~7 F2 h `( k& K fclose(fpIn);7 H' W! F- c. c* \7 o# z j
fclose(fpOut);
) @; W. C! X0 ? `}
, y4 Z$ a' m& j7 M! Z4 E7 ~4 A: E! j0 O' o6 O. ?! V% o8 M( X( V% c* d+ \
" J& V' m& W( f7 x( X" m+ N
|
|