TA的每日心情 | 难过 2020-4-23 15:10 |
---|
签到天数: 37 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位大神,我有一个疑问。fir的输出序列长度按道理是输入序列的长度+滤波器的阶数。可最近看了一个代码,它的输出序列长度冒似与输入序列长度相同,恳请指点一下。
3 d7 f% H* V+ q" b3 M滤波函数:! W' S; x9 V5 G4 J, V
#define NUM_TAPS 48
$ t: ^) ^9 }% V h& Y1 F: P#define NUM_DATA 80; p. P* }2 R& G/ L
" f6 p, H6 d! h" U. L& Q* p; g3 X3 `7 |' Z
void floatPointFir(float *x, float *h, short order, float *y, float *w)0 C* U& }1 K* }2 j! _
{" H9 C: Y6 o& |" C& i
short i;3 x V, ^* w0 a% ?8 z. q
float sum;
* R5 R5 \9 K1 U w[0] = *x++; // Get the current data to delay line
0 f7 I7 L0 T9 U& `# \ for (sum=0, i=0; i<order; i++) // FIR filter processing
8 `6 `1 t4 F" z( ~ {
+ o( J! F+ v* v5 S1 t* C sum += h * w; ^; h1 L1 ]1 b
}7 }0 s/ d! T6 I1 z
*y++ = sum; // Save filter output
- G" m% L2 Y2 p7 i3 O, M8 o for (i=order-1; i>0; i--) // Update data delay line
K+ c3 L0 s. R! l( i {
; p$ I8 A0 J5 P9 i" z, ^; k. e w = w[i-1] ;
" S j& |2 q0 ], m }
4 C7 Z9 S6 W" z& k}
% V6 ] O! E- Y& J# S% R g* G
! ~. j g1 A. F" |8 q& H6 q+ ]% S4 {( \
测试代码:
! u" d9 h' W, wfloat w[NUM_TAPS];
4 h# J/ N. e- n5 B/ Z, Kvoid main()
/ Z% [$ W" [4 p" j4 a- w{; m+ y/ w5 V( h9 z' u% o
FILE *fpIn,*fpOut;
' d# k9 w* ` J7 T+ R1 p short i;
$ h X e% Y# J char temp[2];
/ z& z3 g& T+ M: k& C4 }. Y float x, // Input data, X' F, b% a/ W0 [
y; // Output data
, a ~! [) v/ H+ X! Q6 A
2 M1 c( c, b/ O( f5 W! p/ ?/ H } fpIn = fopen("..\\data\\input.pcm", "rb");
4 S6 u) C3 B2 M! j8 N fpOut = fopen("..\\data\\output.pcm", "wb");
6 T" B/ V& @: ?8 y; N$ h if (fpIn == NULL)+ R0 k) H9 {/ R( O9 C
{
) s. P% n/ o8 m2 ]/ F9 H& u$ g# ` printf("Can't open input file\n");: n: ]. x2 ]0 \3 I
exit(0);+ A# g2 G" d4 \ |/ c
}
# D* N! c' ?8 z/ P" t- D ! r6 g2 a3 B O( ^; q
// Initialize for filtering process8 a6 Y! R2 d1 U8 L( a4 q0 F
for (i=0; i<NUM_TAPS; i++)% z% G2 X d. K4 ^7 z3 M
{( G1 T/ I- q& h4 X8 _
w = 0.0;
& @9 M& a( [' p& n }
) t, [* S2 S5 a# U8 \5 \6 j8 m // Begin filtering the data
0 ]6 r- y: b% Y7 W( m% V while (fread(&temp, sizeof(char), 2, fpIn) == 2)
/ ?. M3 q3 c7 f5 k { H2 R+ J9 O: {8 q
x = (float)((temp[1]<<8)|(temp[0]&0xff));
; D% ~* V! ]' [ // Filter the data x and save output y
# b$ D) K' a3 W2 ?) b7 k9 L4 _. G floatPointFir(&x, firCoefFloatingPoint, NUM_TAPS, &y, w);
- g# D0 F H6 e temp[0] = (char)((short)y&0xff);
2 u- X0 ^7 `1 m: ]5 w! i1 \5 M temp[1] = (char)(((short)y>>8)&0xff);5 C: F: h7 M' a
fwrite(&temp, sizeof(char), 2, fpOut);
5 B8 r& C8 [; M/ d }; y0 l/ w5 e! i* P
fclose(fpIn);1 C: p* d/ { u! L8 x9 {
fclose(fpOut);8 p5 |$ Q0 O2 V4 \* e0 W/ l0 b
}9 `" i! d+ t7 L9 Z
* \) i9 c. F& n6 ^ \6 i
* d: @% N4 ?2 G3 R |
|