TA的每日心情 | 难过 2020-4-23 15:10 |
---|
签到天数: 37 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位大神,我有一个疑问。fir的输出序列长度按道理是输入序列的长度+滤波器的阶数。可最近看了一个代码,它的输出序列长度冒似与输入序列长度相同,恳请指点一下。
. {$ p# V6 z, D k0 A滤波函数:
& w7 J9 F. }3 S: i6 O# k, F#define NUM_TAPS 48
, F! J/ B; X N7 R/ P#define NUM_DATA 80
5 }4 V5 a% S3 r# h: n/ ]7 w% \
& x" L4 n6 P) f( A, `! W% B% u: Q r: S5 x. F: L& I
void floatPointFir(float *x, float *h, short order, float *y, float *w)
) z3 }9 O9 l! o, n- p{
4 V- v R; n8 h2 }. G$ F short i;/ R. X N! z+ s/ Q* W. V
float sum;
# O5 \7 @5 [7 Q w[0] = *x++; // Get the current data to delay line
) R u+ E* d2 A0 m8 B for (sum=0, i=0; i<order; i++) // FIR filter processing! @5 W% J9 l& `3 d0 K8 b
{
: ?$ E# T& n: {+ B sum += h * w;1 F7 R/ x" f+ _$ k& O: ^
}, }+ o- c) [& ]4 `* ^, N
*y++ = sum; // Save filter output
4 b2 ?0 v+ b% d& V# v for (i=order-1; i>0; i--) // Update data delay line3 V) M) [: g2 S* Q1 s" x
{) r; ~- j* @/ E( Y- [6 F: R3 L
w = w[i-1] ;
& B0 q: ~9 u9 K- G0 B7 j$ K. _: v }
4 O" G3 O/ y: K}8 A. N$ H5 I, H! V$ Y/ l
T3 A7 d0 Q# T( }- e- k
5 n# ?6 t; X i5 a% t* E' \7 v测试代码:9 i- O: }/ \1 \& T t" ]
float w[NUM_TAPS];
& H x& L7 i5 g. ?void main()
( ] H9 q2 [# E{
7 p. r: V4 V0 t4 i3 [3 A# I FILE *fpIn,*fpOut;
1 F" | c6 x. s7 ?0 U: x: ?4 ~ short i;0 F" K: H. S5 r# ]. `
char temp[2];
! c2 R8 |7 O7 l! Y/ {/ c float x, // Input data; a# O7 [ Q# Q7 a" X1 ]
y; // Output data
* T- h/ J$ l5 Z/ R 1 g4 L5 H% ]% b: a ~6 a
fpIn = fopen("..\\data\\input.pcm", "rb"); 3 V" U! v) j9 M W6 j; |- c
fpOut = fopen("..\\data\\output.pcm", "wb");, u3 X8 q$ `" U& O( Q
if (fpIn == NULL)
4 I- [4 ]6 X, e6 |! ]" @) R. H N {, Q9 p4 J e' S3 m5 z
printf("Can't open input file\n");
' K, r: n. ?- v S exit(0);
8 E3 L h4 C5 N$ \# Y0 r }3 Z+ M& Q1 v$ a) @6 M# p; q
) ?6 ~* Z, |/ \* l: v) q0 i
// Initialize for filtering process
% |# l3 r/ l) b4 v1 Z1 E3 _ for (i=0; i<NUM_TAPS; i++)
1 _. J1 H) b5 z# z0 B; Z {1 H+ ^; g% [9 C# `4 V, U7 e
w = 0.0;
4 n6 w! a* [; e r7 e }
1 x2 W2 {$ Z- N // Begin filtering the data
8 r4 P% e3 O+ r( L while (fread(&temp, sizeof(char), 2, fpIn) == 2)
1 L( l( `% |, T; @( i0 c+ T/ l {
9 \; e0 h1 }" t x = (float)((temp[1]<<8)|(temp[0]&0xff));
( _0 \" t1 v# \# } // Filter the data x and save output y Z0 A5 z% X" i2 _' z3 d4 b
floatPointFir(&x, firCoefFloatingPoint, NUM_TAPS, &y, w);
+ I1 i3 I& h+ g temp[0] = (char)((short)y&0xff);; M. z7 v& [% D0 i0 [
temp[1] = (char)(((short)y>>8)&0xff);
0 ]/ ^ R# l3 e9 f% a W: Q( W fwrite(&temp, sizeof(char), 2, fpOut);
a% W. N0 ^% _' a5 V4 X; c ^ }5 \5 I* i+ D" i5 |, k9 p
fclose(fpIn);) ?) w4 t- s* f/ w% A
fclose(fpOut);
. n u1 Q9 V* q4 x8 K} z7 e* C, m; b2 v4 D! d% d! Z4 l
; q: d) i s. B. D/ Z
- u* A C0 \2 [* u' w3 K |
|