TA的每日心情 | 难过 2020-4-23 15:10 |
---|
签到天数: 37 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位大神,我有一个疑问。fir的输出序列长度按道理是输入序列的长度+滤波器的阶数。可最近看了一个代码,它的输出序列长度冒似与输入序列长度相同,恳请指点一下。
# ?! K X7 U2 h' N% J- Q1 i& T滤波函数:5 Q+ i& n5 H ^ m; \
#define NUM_TAPS 487 e9 c. e( K9 g7 h* Z: m2 u
#define NUM_DATA 80 ~2 m! d" H/ G, c* u( a' t
8 n% s5 r s' E$ ^" | T p' Z+ A, ^2 e; n, } J
void floatPointFir(float *x, float *h, short order, float *y, float *w)4 y& O* J0 N2 M. A7 V
{4 b+ z) v& S# ^" _
short i;+ p3 H& F/ |/ _8 W9 y2 D5 G8 R: D
float sum;
" h9 k/ L) H# F/ z: i w[0] = *x++; // Get the current data to delay line
$ A3 _1 |' c3 \8 m) n1 e6 y% } for (sum=0, i=0; i<order; i++) // FIR filter processing
+ x5 A S4 {0 } Q+ m, b {
0 n( O; Z! |9 n+ L" z' e sum += h * w;( F }' ]) b7 _
}
& t* e' B0 L3 p$ L. I3 W0 U5 f! g *y++ = sum; // Save filter output
- X: X2 n) q# y* n) g3 Q& X for (i=order-1; i>0; i--) // Update data delay line- A' f$ G) d1 t6 H: [
{
' s" R7 Q$ I( z9 y2 T$ J1 x w = w[i-1] ;
, |+ |! P0 c. E6 w- H9 z' z5 Y }
$ O+ m6 L2 D7 V}# z! b. S5 z/ W7 l1 M2 O# P: `
0 {! _1 ]2 L4 t1 t; M
! i5 ]* ^; m/ h# D4 j测试代码:
2 ?' k- w% T( Y# M4 S1 Y6 |/ U4 ?float w[NUM_TAPS];
0 Z& X$ ]( s) i3 hvoid main()
5 E! f- J9 j c' L9 B/ x" T8 A7 M{5 ~! e( v' r! M7 l- h
FILE *fpIn,*fpOut;
1 Q4 }0 `; y" i( m2 Z0 t short i;
7 d* D* n9 R% l y1 T( ~6 K char temp[2];* r( Z8 H9 t! f
float x, // Input data
& p/ ^& A7 }( ~* X9 ^4 ]5 v y; // Output data5 Y9 j# O7 f) j) b& e
1 [( Y+ I: P9 [# f K4 v
fpIn = fopen("..\\data\\input.pcm", "rb"); 6 A7 }% ]1 g' \# X3 o' Y M
fpOut = fopen("..\\data\\output.pcm", "wb");1 a! {6 E+ `; l7 V- K' @8 `
if (fpIn == NULL)7 @4 g4 V8 X" I1 p
{
8 B- M5 [9 N- n* P" f+ Y! ` printf("Can't open input file\n");
Z8 V& \7 O+ Q2 Q I: ?3 w2 c3 T, }) J exit(0);1 l1 M6 H+ a# y0 b' y- s
}/ [. k0 M( a5 F/ |; h
- I" \8 D t* Z8 x- \
// Initialize for filtering process
7 [# x: O' O1 j% M( F- u for (i=0; i<NUM_TAPS; i++)" r0 K* S5 H% p; I: C
{2 T' h1 M0 c( k9 k4 g% W$ p$ D
w = 0.0;
+ b4 b/ Q5 M+ Q2 Y! F }
6 k8 h+ H" ^- {; N* F' b0 n- Z // Begin filtering the data
5 Q7 m; M0 O* d$ [( H- Z% o while (fread(&temp, sizeof(char), 2, fpIn) == 2)
9 U+ Q% s* J& d% |0 S) [# L+ N- u {
4 y1 U0 w( D# y1 F* b x = (float)((temp[1]<<8)|(temp[0]&0xff));5 K. c3 R9 L! P6 ^, q- p" o
// Filter the data x and save output y
3 @2 Q/ O# i2 a* ]. J6 w floatPointFir(&x, firCoefFloatingPoint, NUM_TAPS, &y, w);
\# W% o, D+ F0 u" u9 u% x temp[0] = (char)((short)y&0xff);
9 X( A8 P+ d# ], ~' l8 [ temp[1] = (char)(((short)y>>8)&0xff);% ^' y& x9 ]$ k r, H+ g& C
fwrite(&temp, sizeof(char), 2, fpOut);
6 E9 h- y& G w+ b, T2 o% h }4 t" m. y+ |; q0 I& o
fclose(fpIn);
" |( W. M+ _# A+ f I- Z7 X fclose(fpOut);
: S' W0 q% u6 q) M7 Y}
8 o j/ m* H* i, r6 q* \/ @) U. S9 y }! s
( p$ u# ]! l8 N8 K1 b
|
|