TA的每日心情 | 难过 2020-4-23 15:10 |
|---|
签到天数: 37 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位大神,我有一个疑问。fir的输出序列长度按道理是输入序列的长度+滤波器的阶数。可最近看了一个代码,它的输出序列长度冒似与输入序列长度相同,恳请指点一下。3 D3 V5 S8 t1 F
滤波函数:, [; v/ @1 z( w+ d# s% z+ M/ H- \; @
#define NUM_TAPS 48
& h! g# u6 S% U( o) E' O5 ~#define NUM_DATA 801 s4 v: ]1 C2 B; v l$ Q
6 `) k' E+ U9 Q9 n, u. n
6 H8 h7 X& _+ L. vvoid floatPointFir(float *x, float *h, short order, float *y, float *w)% {- e; e8 t$ m' R; _$ I
{, n1 a& {& p0 F
short i;) u0 T/ x) y4 t" d1 Y1 w
float sum;
, t Z( ]( c- I2 \1 ~ w[0] = *x++; // Get the current data to delay line% E% t5 u' a' @: f' U5 ]
for (sum=0, i=0; i<order; i++) // FIR filter processing& k8 {9 \; E* t4 I& |; _; }0 x
{; ]0 E, x: g V! k" g
sum += h * w;3 U3 O/ l+ u. u! C5 I. m
}
' Z. C5 d% C$ e- @ *y++ = sum; // Save filter output
7 Z+ p7 X H- R for (i=order-1; i>0; i--) // Update data delay line
+ ]* i, e7 D1 s, e, ~" y9 S {8 Y( j) f# ?8 O
w = w[i-1] ;
& a& K0 t/ o9 T6 N$ B9 f- c- X+ U }# b' Z' \( K: o
} \/ o9 b* x% Y F' w: P
' F: E* G. C" x7 M2 |9 c
$ i' h; d: k/ I7 g) E测试代码:+ V4 q( _1 S) O# s! r( m- N
float w[NUM_TAPS];" _- z$ Z5 E, M# a! `5 j1 c
void main()$ c4 X# }+ V* |& w8 z
{: E! T! l0 q5 B6 P+ q8 @ a
FILE *fpIn,*fpOut;
! U$ M3 H/ q' p( s short i;
) J% o Z& I a& G5 K( m C char temp[2];8 f; U& _3 d5 F
float x, // Input data
- H3 A" C' C& }- D y; // Output data+ }+ ?- v/ l! F$ T- }5 ?* R( q- E
g( G7 Q3 p0 ~, Q
fpIn = fopen("..\\data\\input.pcm", "rb");
& y/ g' b3 v6 o% l fpOut = fopen("..\\data\\output.pcm", "wb");( I1 i# A+ U ]! S7 n
if (fpIn == NULL)$ a) u* m; m$ q
{4 P6 L3 Q8 U3 ~
printf("Can't open input file\n");
- g4 U& N- w' O2 m$ W! Z3 J exit(0);
2 \2 p* I& N6 q# v" q$ t }3 o4 M0 c( q2 q( V, R2 X/ y
/ K! x- J, x. } // Initialize for filtering process! F- J- P! Y2 ] ~$ V* E* c5 i* I
for (i=0; i<NUM_TAPS; i++)
$ y$ i8 D1 r) s4 N4 T {- p% P V8 D$ v7 }3 `! b" i
w = 0.0;0 ~1 r" m5 ?. x1 V
} O2 W1 A1 B* j1 _% m
// Begin filtering the data! C n1 e# B2 ]8 H) c# T& }0 d
while (fread(&temp, sizeof(char), 2, fpIn) == 2)
W. t1 n4 @: G% o( R {$ r4 O0 ]* ]: R9 q
x = (float)((temp[1]<<8)|(temp[0]&0xff));
; A2 Y5 S5 e4 \6 u: ?6 S i, D // Filter the data x and save output y9 D6 n: Y/ p- j" ?( {' G
floatPointFir(&x, firCoefFloatingPoint, NUM_TAPS, &y, w);/ @ W# x1 M% Q& X2 v
temp[0] = (char)((short)y&0xff);% a* l5 Q' E/ o7 E6 Y' ~) m& w
temp[1] = (char)(((short)y>>8)&0xff);( Q; e+ C4 m" g; ~4 S
fwrite(&temp, sizeof(char), 2, fpOut);4 S8 `& `) D! b/ @
}
6 l* j2 C* Q' c/ {1 W3 K fclose(fpIn);
7 B9 T N A7 c& c+ X fclose(fpOut);
" i, x) U% d8 L2 z}) i' Z* w9 R6 J1 h
1 ^" C$ i+ ?9 B+ N( r: A% w+ U' T
! m' m3 W* S0 a6 X4 A! ?7 w
|
|