TA的每日心情 | 难过 2020-4-23 15:10 |
---|
签到天数: 37 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位大神,我有一个疑问。fir的输出序列长度按道理是输入序列的长度+滤波器的阶数。可最近看了一个代码,它的输出序列长度冒似与输入序列长度相同,恳请指点一下。
. p# }0 _! w) G滤波函数:
" G; e6 Z8 h% l S" ^: X, z$ d6 j#define NUM_TAPS 48# C( k* \0 W5 k: e5 S
#define NUM_DATA 80) H4 u* }3 W( m8 @8 m. A; A, f
/ Y/ e1 c5 T3 s9 E5 J
$ C9 Q1 c- }) F" b+ kvoid floatPointFir(float *x, float *h, short order, float *y, float *w)
# I2 f9 Y) i0 H{
/ {& E0 { q$ z8 I short i;1 \6 }5 y' a+ W
float sum;
6 Q/ `' F- W; R' b w[0] = *x++; // Get the current data to delay line
& M0 D8 p$ ~/ V6 Y: N8 L for (sum=0, i=0; i<order; i++) // FIR filter processing
1 D; O3 g4 P O8 |7 ^ {% f9 @7 e; H8 T* P# l* `$ K$ }
sum += h * w;/ R- @) `( \9 E
}: N1 E) k4 ?# m( k- n4 f
*y++ = sum; // Save filter output
& U$ b! B6 F ] for (i=order-1; i>0; i--) // Update data delay line
0 }6 s [ p7 f {( x3 j$ a M: T! K: N0 L: x- u
w = w[i-1] ;- j( p" j' e" v+ B
}
; q H/ O; y5 Z4 |9 U}8 d: q" _ ?+ p8 Q& g2 m9 \. P
( w R2 P1 h0 L. O9 i" F7 l0 _: b! L/ q* A( S+ f# q
测试代码: y: C8 M4 B8 X9 ~, g
float w[NUM_TAPS];8 ?! w( W; l" a+ L0 j) N
void main()4 D: t+ ] Y0 ?. E% b: k& X* D
{8 _ T# y2 q4 J o; z
FILE *fpIn,*fpOut;% x6 |2 F0 a8 `' W7 F: B
short i;5 Z1 F' i/ m& I: Z: G F
char temp[2];- ^3 [ A0 y( [- z2 j3 H5 U
float x, // Input data T! q: E% I# w2 S8 P( D" L$ ^/ S- o
y; // Output data
' M) Q# A6 j: } 2 L( X2 s& g% u& K3 m' E
fpIn = fopen("..\\data\\input.pcm", "rb");
. H* ~$ M# ]9 ~5 x9 Z7 [0 G7 _: ] fpOut = fopen("..\\data\\output.pcm", "wb");
& Z# H! t& K e( X" e d/ s' r if (fpIn == NULL)
, R' B+ [' Q7 N+ w {
8 g/ {& j7 y3 q; e9 }' C6 |/ } printf("Can't open input file\n");
9 @5 r. ^3 U. ]: e9 h8 B exit(0);
! ` s8 q$ }, O& i; B }; A+ R* b. r7 j) M
* q8 M8 Q4 Z8 w0 \1 _
// Initialize for filtering process
* L) z& u5 m. Z+ F8 b for (i=0; i<NUM_TAPS; i++)' ?3 E# v3 j7 d; }7 F) O+ L# S
{5 k7 h ~/ f3 C/ K s9 p: q% m
w = 0.0;
& \2 k2 x5 T2 j b+ _. N9 K }: a. u0 [9 ]3 z V4 C
// Begin filtering the data6 ]$ a) a1 {% u$ z
while (fread(&temp, sizeof(char), 2, fpIn) == 2)9 E9 H( y2 K' B* H: w5 y
{/ C7 ~/ V4 M: L) r
x = (float)((temp[1]<<8)|(temp[0]&0xff));
, Q [5 B' d- l/ B1 w" y4 x // Filter the data x and save output y( A$ T" O6 X+ P+ @( w
floatPointFir(&x, firCoefFloatingPoint, NUM_TAPS, &y, w);8 J5 h4 ^3 s6 s2 y( ]
temp[0] = (char)((short)y&0xff);9 i; r$ v2 A* a% p
temp[1] = (char)(((short)y>>8)&0xff);/ ?1 r2 }3 H( f$ L; {0 [# C u
fwrite(&temp, sizeof(char), 2, fpOut);
E* n$ p$ g7 V* u6 W6 b" u }3 |, S. ~% m5 e6 A& _5 Q0 e! ]$ C
fclose(fpIn);; d7 g' C' `5 Q" J8 `
fclose(fpOut);0 j5 s. P0 i+ O
}5 f# O; H M4 t9 P" Z4 W
0 d( z& _! @) T/ F7 n' ~
- r t' D5 E0 W* ~2 o% T) {
|
|