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# a
void 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 processing
8 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 v
void 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