TA的每日心情 | 难过 2020-4-23 15:10 |
---|
签到天数: 37 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位大神,我有一个疑问。fir的输出序列长度按道理是输入序列的长度+滤波器的阶数。可最近看了一个代码,它的输出序列长度冒似与输入序列长度相同,恳请指点一下。' J( q; x8 @( O$ y( |
滤波函数:
8 [0 z0 }( ]; d- K9 C#define NUM_TAPS 485 M2 H, N2 V1 @$ _9 f$ d
#define NUM_DATA 80& ~1 l" w* t6 u( h$ Q) y0 y
7 Y9 A* Z" u; x
. N T- r0 F/ ?0 D9 lvoid floatPointFir(float *x, float *h, short order, float *y, float *w)# ?9 b0 U, c2 n- k$ i) W
{, L: s+ P+ _& J: p+ \ d; c
short i;* Q5 y1 b& m/ z+ G) _' r. U* s
float sum;- y% J; E! }' Z9 }* f3 h, s$ s
w[0] = *x++; // Get the current data to delay line
+ r7 D* [4 W. R9 t: ?8 f* A for (sum=0, i=0; i<order; i++) // FIR filter processing1 v( l# Y8 x1 H1 L/ u0 T
{
# F! S* N# j4 y0 l* c+ m sum += h * w;
- v4 k% o! `0 d2 s }2 g/ p5 {8 e6 B6 O* A7 f
*y++ = sum; // Save filter output1 _4 ?5 |, K9 W! O6 O
for (i=order-1; i>0; i--) // Update data delay line
0 L) Z! D0 \- S5 s# r {
' B, x" G/ h: u w = w[i-1] ;
, J$ s. n+ S. G7 m% b }6 r t+ T) Z. f/ V5 f
}
+ R5 S" g' B3 x- p( J. i
6 X w0 y2 n3 x# f7 n; W4 O3 S! H) ^* r
测试代码:5 C& p% [$ U1 T
float w[NUM_TAPS];4 y9 K) p- s+ @" L# S3 K% u
void main()
/ L4 e( j, v0 o9 ^7 p, r! s{
* Z- W# m6 @; M+ T: o' L FILE *fpIn,*fpOut;
8 c" M$ \ ~) ~ short i;
+ {8 E3 F) X8 n6 F char temp[2];' ^: z* U. f$ I( F% {- k2 P
float x, // Input data3 E: ^; c3 N( z8 ~- }! `
y; // Output data+ N0 W, l7 ~* G' t5 A
4 v' h- x# Y6 a4 i" h8 ] fpIn = fopen("..\\data\\input.pcm", "rb"); + B, P; G& U( _9 O3 t7 i
fpOut = fopen("..\\data\\output.pcm", "wb");
% T$ e, V# F& u: t+ O if (fpIn == NULL)8 c0 ]# ?2 r- \$ I+ X
{
; x; f' Y8 D$ C- _ printf("Can't open input file\n");; M% ]* G# Q; u2 f* [9 z
exit(0);& D5 p& A8 X% |6 ]' Z! f5 T
}: U# D$ t' C/ w5 N6 b* i
) j1 m& v" t. Y6 M5 ~' N( Y; ~* @ // Initialize for filtering process6 m: v2 Z" Z, t; @ z9 g$ T# {
for (i=0; i<NUM_TAPS; i++)' G2 r" Q6 E7 _$ n+ W5 P
{
" x3 |) s$ t, ^' [* ] w = 0.0;
$ {: C# F1 Q. S0 `& H, ] }
- D. O; N0 A0 V* }) d // Begin filtering the data4 r! {, p5 T) o' S9 J
while (fread(&temp, sizeof(char), 2, fpIn) == 2)8 V; W/ l- s' i6 ?! f
{9 I4 g* k, A6 ~ b$ f* `
x = (float)((temp[1]<<8)|(temp[0]&0xff));
# U: t8 N: s$ V // Filter the data x and save output y6 t6 U9 g, a- Y2 |
floatPointFir(&x, firCoefFloatingPoint, NUM_TAPS, &y, w);
" y, N, N+ O. t: o1 e) b @ temp[0] = (char)((short)y&0xff);
7 W4 U0 E5 p' }8 v4 V, Z temp[1] = (char)(((short)y>>8)&0xff);
9 j/ O# u' L- U { fwrite(&temp, sizeof(char), 2, fpOut);
) \% }- Y4 G/ r }- `& U+ n" ~. }/ ]% s. r
fclose(fpIn);
$ _, [: P7 \9 p+ c0 x fclose(fpOut);" G. z' Z- t4 ~ F1 Q6 a: m2 e1 c
}, R* B! @* @7 Y# Y# B! m+ g2 f) F
9 L4 n x7 a( s1 }" e* }, Y; g6 Z6 r+ }) e
|
|