TA的每日心情 | 难过 2020-4-23 15:10 |
---|
签到天数: 37 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
各位大神,我有一个疑问。fir的输出序列长度按道理是输入序列的长度+滤波器的阶数。可最近看了一个代码,它的输出序列长度冒似与输入序列长度相同,恳请指点一下。( P9 Z/ }# u y. ]
滤波函数:" L8 f% a, O( E
#define NUM_TAPS 48% W- e% E1 I- w0 n
#define NUM_DATA 80
( b: u$ Z3 f6 X% ^
3 C& W3 c( E& u1 H. T/ N$ {; _
& q6 {( T, Y- B3 Jvoid floatPointFir(float *x, float *h, short order, float *y, float *w)
1 c) Y) z( U8 k8 B{
8 L' \+ @8 x* F/ p short i;
7 X2 L% s0 B; B float sum;4 `( s. T, [' D; N+ I0 d. S
w[0] = *x++; // Get the current data to delay line1 y8 a5 v; K& E& A! t. q' m4 I
for (sum=0, i=0; i<order; i++) // FIR filter processing- V* Y( q7 u3 V1 Q% ?# j- j
{
, T# S R2 }+ q8 e" | sum += h * w;
4 @# p! c1 T% [; |: k: w& D% W }: ?: y0 Z/ f/ t2 d9 u7 s( r
*y++ = sum; // Save filter output
^$ i# K- Z8 _7 Z I4 v for (i=order-1; i>0; i--) // Update data delay line
9 ~% v; G2 _" X+ v* s. ~9 m {% @0 H6 O; n+ @- l, z0 x
w = w[i-1] ;
8 n1 e2 R: Z7 M% a1 U: U }
, Y+ f' r2 M: @/ T& i' }6 J4 h}+ b5 W! l9 E7 w" r
' V% ~, d. Z7 q8 [. F% c, ]3 P
N* i! G: h) _8 L3 t5 h# d; P. E测试代码:% i; A+ L1 A, n
float w[NUM_TAPS];
4 b3 `1 a' r- b" Qvoid main()1 T+ w) U C- m% {) b
{
/ d3 t3 y7 @ b' G4 W! d FILE *fpIn,*fpOut;
! [; W8 v1 }% x( [( I9 b4 q short i;* m1 o' T: U: h$ W1 I% i
char temp[2];
! S2 H1 S7 p2 A! w$ c1 {& v0 H float x, // Input data
* G1 K8 S/ |6 r B y; // Output data4 j* C5 S% P& O* M
# S% U* F( F; R0 ]: k) K
fpIn = fopen("..\\data\\input.pcm", "rb"); 1 J( ]. y4 B/ y3 G# v: G4 `2 \5 p
fpOut = fopen("..\\data\\output.pcm", "wb");4 `$ Z& [: E5 y# `1 G
if (fpIn == NULL)
. |. U8 R7 D2 M) W! x1 M {: F5 Z% k' Z8 g! ^$ w/ q
printf("Can't open input file\n");, G# \' C' M- b# u0 r4 U$ U. _
exit(0);
! G2 ?; ]5 \8 G }, Q, {3 |% ?" E9 C V
S" c! A# _+ L0 K1 A8 ^' ]
// Initialize for filtering process
1 d( m( i/ l$ ?3 ?9 ~ for (i=0; i<NUM_TAPS; i++)9 r- O, s3 z5 {5 y& S, C
{: F9 D# `& _2 T3 R0 Q1 Y& r
w = 0.0;
! v. Z* o& d: `6 O }
& C6 w- h2 R( f( B* V+ y$ J9 h1 t // Begin filtering the data8 v5 l1 N( W# [1 L, \3 G
while (fread(&temp, sizeof(char), 2, fpIn) == 2), ^, X: o- z$ W
{
9 s& p% s7 Y0 |" O- ~* d6 U0 [& X x = (float)((temp[1]<<8)|(temp[0]&0xff));
+ |# ?" m$ A, e // Filter the data x and save output y+ _3 L+ o8 U8 i4 |/ i
floatPointFir(&x, firCoefFloatingPoint, NUM_TAPS, &y, w);$ `( |; D( ~* q" ]
temp[0] = (char)((short)y&0xff);2 ]0 F' D1 b" M, K) _( e
temp[1] = (char)(((short)y>>8)&0xff);
9 v) }3 R+ c5 f. l' x fwrite(&temp, sizeof(char), 2, fpOut);# v* X; V$ Q* _1 U& c
}$ b# j b. s0 o8 h+ i( \ I
fclose(fpIn);
- G R! j1 E B" B& ^! R fclose(fpOut);
4 f) W" z8 ?; z}4 @2 e, k. V5 O _
- j, E; J. t& t8 P
, Z9 \. ]) c) H6 q; Q, _" F |
|