TA的每日心情 | 难过 2020-4-23 15:10 |
---|
签到天数: 37 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位大神,我有一个疑问。fir的输出序列长度按道理是输入序列的长度+滤波器的阶数。可最近看了一个代码,它的输出序列长度冒似与输入序列长度相同,恳请指点一下。
- O' \0 e: ]% c滤波函数:7 }: t; R- @1 {% R9 P9 T+ c
#define NUM_TAPS 48
% j4 f/ U* C p: c2 E1 S7 |7 e#define NUM_DATA 80
. [3 f4 n8 m$ O/ ~3 f0 @! W6 D+ W0 I& B c; {; K$ s
. @$ p) q2 B) M, E. {% K4 Mvoid floatPointFir(float *x, float *h, short order, float *y, float *w)
- Z9 c' P* x% b{* M! z, \( d4 Y& W/ G: y" a. I
short i;
" ?" j0 {5 l0 P0 D; g float sum;
. M! \. w& ~5 `- i+ u w[0] = *x++; // Get the current data to delay line
; ~/ s4 g3 I# ^8 N% o0 I for (sum=0, i=0; i<order; i++) // FIR filter processing
0 ~# F. D* y: b* p6 ^ {) _/ \! x; {) f" `2 t7 p
sum += h * w;- A2 }0 K) B" I& E* N* \! p
}4 X5 G) {4 B+ q, I
*y++ = sum; // Save filter output* ?$ \8 @- j% a# K
for (i=order-1; i>0; i--) // Update data delay line. b# | K# W# n, P* |9 Z8 `
{2 ?3 T/ }8 h& A0 |3 }( L+ t
w = w[i-1] ;4 \# M# p8 [' }
}- N) A* c2 v- I$ C' R, J1 a
}8 E4 |3 r* H$ P2 J6 b$ c
3 V) X2 x2 i9 S7 n
! D% P. p8 h6 H# \' `# X2 O8 u% K* M3 N
测试代码:4 e( g6 l8 d$ w( L
float w[NUM_TAPS];
9 B2 e" C2 ~5 ~6 k6 G p9 ?void main()
}1 z% T* g ~1 n- |{
4 } m* d# U. O6 c FILE *fpIn,*fpOut;
+ Q+ d7 x9 G) A: [8 v$ x short i;
2 ]6 y2 v; V) h- s+ r" ^8 x char temp[2];5 M' w( p* y A) W
float x, // Input data+ A* |9 y! q" C! Y3 |5 E, _
y; // Output data
+ q7 g7 E" o! h$ R7 F 1 A' S, t% N8 D; k3 Y; S% L
fpIn = fopen("..\\data\\input.pcm", "rb");
6 I% d, t) Y* ` fpOut = fopen("..\\data\\output.pcm", "wb");
" S1 X/ {& M0 E+ B& s2 K& d if (fpIn == NULL)
- x& B+ ]5 t3 w2 D9 k& v' Q* j) t6 f {7 A2 @' M1 i3 w- f+ e. c
printf("Can't open input file\n");
/ j, `9 R- s; S# y, J4 ]. z exit(0);
9 N3 G3 {6 u7 i f; Q. N& }. N }& E" y, n* W9 p7 Y4 R3 }
$ Q& P! ~& X3 o+ r7 [
// Initialize for filtering process
8 p4 e; g3 U& K, M* [. I$ Q" l for (i=0; i<NUM_TAPS; i++)* G6 h: ]1 V* v. b! h! O1 I
{$ a, O2 C" E6 u D: B O& | j+ R
w = 0.0;% ^4 n% F! H1 O# o
}
2 a7 l* _: H# @# L5 a+ n // Begin filtering the data! |% a1 E6 Q' x6 p2 n( @1 R$ g
while (fread(&temp, sizeof(char), 2, fpIn) == 2)+ d4 \" C9 P% Y, S. t& v
{
; H. S4 }+ y* @! L8 p; _ x = (float)((temp[1]<<8)|(temp[0]&0xff));
, [/ f7 ^4 E0 l6 j* d4 r // Filter the data x and save output y' ]& A0 p/ i' r& c1 a
floatPointFir(&x, firCoefFloatingPoint, NUM_TAPS, &y, w);
$ E' P! b* G3 r) {/ Y: g6 y* a temp[0] = (char)((short)y&0xff);
4 _) J# N" A- Y1 f+ O temp[1] = (char)(((short)y>>8)&0xff);
! n! z W; I6 q2 B8 j3 I. ? fwrite(&temp, sizeof(char), 2, fpOut);
3 u) ^* R% q5 J" l7 m" a1 z% | }
$ t% p. O" i* T& E0 B! U6 r fclose(fpIn);; g; I0 B+ `1 \: r
fclose(fpOut);
' f" Z+ U* u A8 t}' u/ |( s7 g* L+ }& j4 N+ j
) W: m2 K( U+ z' g2 q& q
- T0 O o4 N8 }( S( `/ e |
|