TA的每日心情 | 难过 2020-4-23 15:10 |
---|
签到天数: 37 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位大神,我有一个疑问。fir的输出序列长度按道理是输入序列的长度+滤波器的阶数。可最近看了一个代码,它的输出序列长度冒似与输入序列长度相同,恳请指点一下。& l! @) P0 P. [6 {; T) ]( ^- P
滤波函数:1 H) k3 H9 W; O- s) `0 {
#define NUM_TAPS 48
: q1 Q0 y3 `% E5 N4 }#define NUM_DATA 80
6 j- Z2 R: G; k) {3 u) G) d h
2 R" H: v% c# j% Q1 M. @9 ~2 X& i7 F2 i8 K6 T6 ~
void floatPointFir(float *x, float *h, short order, float *y, float *w)' M3 O5 r- F7 z$ j! \. i
{- O! w, e5 ^4 G& X
short i;9 f7 v2 q+ H! z6 S
float sum;" ?6 G. K9 C' a f! p
w[0] = *x++; // Get the current data to delay line
+ \7 d; Z, f7 V4 C; ~ for (sum=0, i=0; i<order; i++) // FIR filter processing" d; u) b4 Z7 K u/ f0 m3 J: H
{$ P" L9 y% [$ c. `5 v$ k
sum += h * w;) v% f1 @ u1 a9 V
}
( w7 o) {2 b0 Z. L- {0 ^ z *y++ = sum; // Save filter output i) d( I7 A' P+ Z
for (i=order-1; i>0; i--) // Update data delay line
! Z# i! H6 g# k2 H) c {. N2 L! g: {7 [0 I2 a/ ~
w = w[i-1] ;
+ v. I! d' H) }2 Y7 { N: ~1 q }
; m8 E: L {8 s) j6 }6 F" S}
, ^1 z8 T( I2 f" { O1 w% y- M+ q$ n! w; q2 [
% t6 P& d8 f5 w' W q+ d2 r
测试代码:/ v0 `1 o7 d1 @9 K6 n
float w[NUM_TAPS];
Q' Y" h \9 Q; a9 P; n3 Vvoid main()
8 | p1 Y3 s' r3 {+ }( h{0 L% V$ z: h8 H+ W/ f
FILE *fpIn,*fpOut;
' r* z2 f' ]3 Z short i;: e: j% J" x: ~- \ R
char temp[2];$ r% c& b' I, h5 ? p; R2 F5 ?
float x, // Input data R- d i5 L3 W2 r9 S) b
y; // Output data7 b& m$ F0 l R
9 {5 h+ b6 G5 g) P8 E0 S* _
fpIn = fopen("..\\data\\input.pcm", "rb"); 4 \+ @7 d i2 A( Z1 G
fpOut = fopen("..\\data\\output.pcm", "wb");2 s' g: C% {* n: j8 d% k% r
if (fpIn == NULL)% o. s1 m( B3 O: u/ h6 h" Q
{
& K- Q. c+ B% j' P" t' p8 @* }9 G printf("Can't open input file\n");
9 A! B. [4 Q3 ^$ i- o3 i exit(0);9 t+ [9 B9 a0 w7 Q" L, F1 a
}- R# G7 p8 u- j
) R& B. B8 B1 K3 Q4 I; p9 W3 f
// Initialize for filtering process
! {; N' ?6 U$ n) y" M for (i=0; i<NUM_TAPS; i++)- L. Z/ b1 T2 D( E$ ~- @
{# T4 D% \+ K& [. a1 s( z
w = 0.0;
& H. y+ T. y! H! B, G }
, S3 {/ d7 u- d2 v! e/ E // Begin filtering the data
: M/ D2 r8 h( ]0 I$ A" W3 _* \ while (fread(&temp, sizeof(char), 2, fpIn) == 2)( B3 `) s& Z% \
{6 _) V. C' W c" [
x = (float)((temp[1]<<8)|(temp[0]&0xff));0 J2 F5 A+ }4 I: E; m
// Filter the data x and save output y
/ d4 Y" O4 H& W! @ floatPointFir(&x, firCoefFloatingPoint, NUM_TAPS, &y, w);- c' r+ {$ S, w+ b( n9 o$ K( T
temp[0] = (char)((short)y&0xff);
+ _. @# b3 P( D$ y7 w( K. c temp[1] = (char)(((short)y>>8)&0xff);6 O. e$ ?: H' v! W/ [3 ?% T
fwrite(&temp, sizeof(char), 2, fpOut);
0 s% M* j; P* b0 B( w9 t1 i }5 t7 G1 Z& S, y: W: M
fclose(fpIn);
1 Z8 n. N0 z' r% K7 I! j$ h fclose(fpOut);* X( {6 K! C7 G& ]2 i; I
}7 y1 {. X5 ~! Z. S, R$ t
" ]% i- I+ {0 `: h; q6 j; K# ^. t1 c: n6 h/ A+ j
|
|