TA的每日心情 | 难过 2020-4-23 15:10 |
---|
签到天数: 37 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位大神,我有一个疑问。fir的输出序列长度按道理是输入序列的长度+滤波器的阶数。可最近看了一个代码,它的输出序列长度冒似与输入序列长度相同,恳请指点一下。
9 h- _6 w8 r9 T3 K1 N$ ^滤波函数:
0 N% r& k6 q0 } F#define NUM_TAPS 48
% d( b. Q }" N+ p6 I8 K# O9 S- N#define NUM_DATA 80
* R* V. u6 Y( Y+ m
! _8 c8 x. l- K8 V8 x ?1 w3 c: W6 y! {* w5 r. w! Q5 y
void floatPointFir(float *x, float *h, short order, float *y, float *w)- S1 A2 ^- L) |9 f' ]# X3 V
{
+ Q4 k# H6 J( m1 \/ F short i;
3 f: `6 `* W0 ^+ {; F float sum;' M9 Q+ C- O. }: p. \4 ^
w[0] = *x++; // Get the current data to delay line$ ]. J0 Y1 L$ h2 e- p: w( k
for (sum=0, i=0; i<order; i++) // FIR filter processing
2 b+ }* \) z+ ~7 a D# E {& h+ c L8 b3 ~8 L! k) P4 x7 p
sum += h * w;
0 t1 \9 ? U7 U }
0 A. H1 f7 v' W4 p+ ]0 s4 o8 j *y++ = sum; // Save filter output/ x0 a" T! z9 d4 g; j" _9 U
for (i=order-1; i>0; i--) // Update data delay line
* f7 P7 r% ?& z) n {/ C4 f: B/ n. R+ k
w = w[i-1] ;7 d1 ^. @, b7 K8 w( c) R3 T
}2 K# p: r% N" D. i
}% z b4 v4 F9 A* J& @4 g
' B) H- k: U: k6 [( u
" l I6 q5 r9 B. R3 S1 ]9 m+ J测试代码:
! Y2 A, P. `. z. Afloat w[NUM_TAPS]; Z: I) D! p- ~0 M v* q/ O2 x' J
void main()
7 ~( K1 e- b# i7 a* e! W$ p; j{
6 @, f7 S3 I- G3 N( |" N FILE *fpIn,*fpOut;# H6 ^# s- y1 A' U( x' _! y
short i;+ e1 v9 ?9 C6 Y
char temp[2];
4 |! h2 ?1 Z5 W! f2 `$ _ float x, // Input data
1 m6 t4 m! O- [3 x9 r4 f0 ^. c; T y; // Output data* b7 Z& ~* `' b G6 K! z+ {
/ a I& ?. [2 L fpIn = fopen("..\\data\\input.pcm", "rb");
+ J# D2 x7 }$ M" @$ b4 W' @# p( t fpOut = fopen("..\\data\\output.pcm", "wb");
5 a6 x8 U& [2 H4 B; _1 a9 F if (fpIn == NULL)
; E& O4 {, N) Y {! ], x" c( W' @; y8 j7 f
printf("Can't open input file\n");
) m1 h( p) ~/ N# j exit(0);
; A* X5 g& c6 B. l1 x; k }
+ {4 y3 m8 A; T; J
) s: e+ X; [' ^1 ]. d/ v4 A // Initialize for filtering process( g9 A+ u+ Y) z0 e
for (i=0; i<NUM_TAPS; i++)
1 W F1 h& C' q& Q8 s0 l, s {
. |& P3 {9 s. p% _. w0 z: B w = 0.0;
I( V }5 \9 Z: K9 l }
; Q" {( ]' t7 }6 ~1 f // Begin filtering the data! q3 L8 y' q/ S2 ~+ s3 y
while (fread(&temp, sizeof(char), 2, fpIn) == 2)
8 D8 ?( W' }. u/ z# P5 q" Y. i {
& w0 E, w; y6 X5 O5 P x = (float)((temp[1]<<8)|(temp[0]&0xff));* l/ ~$ m- ~; Z9 S
// Filter the data x and save output y u" D: G o, K4 q3 ^/ z2 E
floatPointFir(&x, firCoefFloatingPoint, NUM_TAPS, &y, w);; Y. E K, z1 P; c/ l
temp[0] = (char)((short)y&0xff);
" R7 c [) _9 O* s, } temp[1] = (char)(((short)y>>8)&0xff);
% }* L; X) j& h$ D! i H1 a fwrite(&temp, sizeof(char), 2, fpOut);
1 ]+ W6 b2 d6 k6 ~: P, O' n }# s, ]- t Z1 U4 I) v0 | t# c
fclose(fpIn);
+ V3 c1 @+ g9 S) N8 ^4 Z6 B& ^- i& s fclose(fpOut);- Y6 c" ]( Q# [, \( C
}2 I U1 o/ c# M- P6 f) B ?
* x. t# C0 j; ~/ Z! n2 u7 P
# f0 v1 U; [& n& \) z$ n |
|