EDA365电子论坛网

标题: 实时fir滤波器的输出长度是否和输入长度一样长? [打印本页]

作者: freebigfish    时间: 2019-11-8 17:20
标题: 实时fir滤波器的输出长度是否和输入长度一样长?
各位大神,我有一个疑问。fir的输出序列长度按道理是输入序列的长度+滤波器的阶数。可最近看了一个代码,它的输出序列长度冒似与输入序列长度相同,恳请指点一下。
& I0 F4 Q9 S( ]% s' K6 m# R滤波函数:
; B  [5 W& R0 S0 D#define  NUM_TAPS   48# C2 r) r. B3 |0 o1 Y, ]% [
#define  NUM_DATA   80
5 C) ~% D' j9 u$ G, h) B1 B$ R5 X; E$ `4 Z4 ?& d" Y: O4 t1 Y) y6 w

( \4 M( f  m6 m2 c# m# avoid floatPointFir(float *x, float *h, short order, float *y, float *w)
1 b) b) B; R/ u5 r! M{
/ S+ k' y( z* z8 R% Z0 Y1 p/ m    short i;
: M" U* O. \5 p1 W- P    float sum;
, \: {( a/ t8 F% W+ G# S w[0] = *x++;                        // Get the current data to delay line
+ s" e6 \5 G% T9 ?5 u4 a! E for (sum=0, i=0; i<order; i++)      // FIR filter processing8 X2 k4 @' N9 v* m0 D
{
7 Y1 l& s" c0 e: r# s& v2 t  sum += h * w;6 K7 O0 U* ^0 D$ c
}
- \, @4 z; t4 d. o- m *y++ = sum;                         // Save filter output
# h) j# O3 [% e2 j- `, t7 _ for (i=order-1; i>0; i--)           // Update data delay line$ {. r& r# Z6 w3 I0 z" f
{
+ I6 B2 K$ e7 u+ g5 B5 F2 D  w = w[i-1] ;" S* A8 o; I( g, [2 D7 q% C
}
/ X- j* S$ q. q3 f* N) A, o}4 I- u2 B0 ^8 A' X) x
- @0 k4 V# u9 _' o& z

/ O8 x2 o( Y& v  R9 I测试代码:
$ s1 _4 W* Z1 Z" \float w[NUM_TAPS];
" l% n; P; z, w2 vvoid main()
6 W2 F. A' W  c+ Y, t{
# a( ~- ~- l7 y: M; u& V    FILE  *fpIn,*fpOut;
' d9 W* {7 ^# t+ x$ j- B    short i;
# r2 |8 g" A( R. c    char  temp[2];
; j- s( H' D+ a    float x,  // Input data/ S. K* G4 E2 D6 J5 {) Z
          y;  // Output data
% E0 z0 I( ]8 V' Z7 n$ K+ O2 V7 m  
6 Y8 `; D& z" c/ H( D/ c: Z    fpIn = fopen("..\\data\\input.pcm", "rb");
. K# O6 M7 c$ {. @    fpOut = fopen("..\\data\\output.pcm", "wb");
3 O5 |+ d8 l: ]& O3 r% E7 \    if (fpIn == NULL)
0 l% {3 @& m: q9 h8 w( \) ]    {# h( K. N; o) ]: o% N- p' Q; o4 x
        printf("Can't open input file\n");
" W% I4 x- j+ H: q        exit(0);
! [- c) O( \; u; ~# u* q6 `* F    }- N3 e1 r: j  S7 m- o+ Y0 z6 }

( h* Y" E. f% _# X9 g: P1 p* Z    // Initialize for filtering process
4 k. D, Q5 j, l1 _" ~, V    for (i=0; i<NUM_TAPS; i++)6 Y: s* G& N( ~6 h& Q# F* f
    {
9 [% [; d" v/ d: W        w = 0.0;
8 A! l+ P( a5 @  ?    }
& w/ a3 S0 ]& |2 F* x    // Begin filtering the data) N6 t/ h9 ~) ]& _' K; z2 l! n
    while (fread(&temp, sizeof(char), 2, fpIn) == 2)) u9 H! k% p3 v4 S9 D1 D
    {
: Q% A0 q4 E3 h        x = (float)((temp[1]<<8)|(temp[0]&0xff));% F/ d! d7 j+ Y: c* d' `/ [
        // Filter the data x and save output y
$ g/ \' z2 z5 @9 {        floatPointFir(&x, firCoefFloatingPoint, NUM_TAPS, &y, w);3 S; p! D% h* u( P# L. ^8 @, x
        temp[0] = (char)((short)y&0xff);
% x) ~9 F/ S: L7 {8 x        temp[1] = (char)(((short)y>>8)&0xff);
% A8 w! M: V1 F9 P! g! m: ]$ V        fwrite(&temp, sizeof(char), 2, fpOut);
- y, [: R3 m; ?! u; o    }9 y" V5 M. q8 g
    fclose(fpIn);
( G! [( M/ c) O, m; q3 Z0 _" a  R    fclose(fpOut);0 c, M2 ~7 X  G" s1 n. M# [
}
# \( J- Q/ e( G, t5 ?0 w
( P( I' Z5 G2 O0 m8 Z3 {
2 ^3 J9 C/ v' f( f& K0 t

作者: helendcany    时间: 2019-11-21 13:38
路过。
作者: freebigfish    时间: 2019-11-25 09:10
怎么看不到回复啊
作者: freebigfish    时间: 2019-12-4 09:03
大神们都忙,不屑一顾




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2