Tải bản đầy đủ (.pdf) (10 trang)

Biến đổi fourier rời rạc part 2 pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (325.04 KB, 10 trang )


85

(n)FW (n)F (n)F
37
-4n
163623
(6.35)
(n)FW - (n)F 2)(nF
37
-4n
163623
(6.36)
ở đây
F n f k W
nk
k
30 30 2
0
1
( ) ( )



(6.37)
F n f k W
nk
k
31 31 2
0
3


( ) ( )



(6.38)
, vv.

Các biểu thức từ (6.29) đến (6.36) cho kết quả trong bớc thứ ba của thuật
toán và biểu diễn trong lu đồ hình 6.4.Mỗi phần tử từ F
30
(n) đến F
37
(n) có
thể chia tiếp thành hai phần tử nữa và bớc này tạo thành sơ đồ cuối cùng
(bớc đầu tiên) trong lu đồ.





















0

1

2

3

0

1

2

3

0

1

2

3

0


1

2

3


0

1

2

3

4

5

6

7

0

1

2


3

4

5

6

7


0

F
20
(n)

2

F
21
(n)
4

6

F
22
(n)


0

F
23
(n)

4

2

6

F
10
(n)

F
11
(n)

X(k)
X(k)

W
-
2n

Hệ số xoay
n=0 đến 3


86


H×nh 6.3 Bíc thø hai sau bíc cuèi cïng trong thuËt to¸n FFT.

87

























Hình 6.4 Bớc đầu tiên của lu đồ FFT.
Hình 6.5 giới thiệu sơ đồ thuật toán FFT cho N = 16. Chú ý rằng do yêu
cầu ban đầu của chơng trình mà dãy vào đợc sắp xếp lại và chứa ở X(k), ví
dụ
x(q) X(k)

k = 0 đến 15
Bạn sẽ chú ý trên sơ đồ rằng q là giá trị bit của k.
Cho N = 2
4
= 16 chúng ta phải có bốn bớc trong lu đồ. Trong mỗi bớc
cần phải có tám bớm. Trong mỗi bớm chỉ có một phép nhân phức, hai
phép cộng hoặc trừ phức. Tổng số phép nhân phức là 8/2 . 4. Tổng quát cho
N = 2
r
số phép nhân phức là (N/2) . r = (N/2 ) log
2
N và số phép cộng là
Nlog
2
N. Chú ý, thực tế số phép nhân sẽ giảm xuống một ít, vì trong bớc
đầu tiên hệ số xoay W
0
= 1 và trong các bớc còn lại chúng ta cũng có các
bớm với hệ số xoay = 1.
0

0

0


0

0

0

0




















0


1

0

1

0

1

0

1

0

1

0

1

0

1

0

1


0

1


0

F
30
(n)

F
31
(n)
F
32
(n)

F
33
(n)
F
34
(n)
F
35
(n)

F
36

(n)
F
37
(n)

X(k)

X(k)
Dãy

đầu
vào
đã
đợc
sắp
xếp
lại

88
Xem xét trờng hợp N = 1024 = 2
10
. Số phép nhân cần dùng cho FFT là
(N/2).10 = 1024 5 = 5120 so với 1 triệu phép nhân cho tính trực tiếp biến
đổi DFT, đây là phơng pháp tiết kiệm thực sự cho tính toán.
Bây giờ, chúng ta sẽ vạch ra thuật toán FFT. Đó không đơn thuần chỉ là
sự phát triển một chơng trình từ lu đồ. Tuy nhiên, chúng ta có thể nghiên
cứu lu đồ và vạch ra các bớc có thể dùng để phát triển một chơng trình.
Từ lu đồ của hình 6.5 chúng ta có thể viết:

Bớc thứ nhất. Trong bớc này ta có tám bớm với trọng lợng (hệ số

xoay) W
0
= 1. Chúng ta có thể viết (xem hình 6.6)

for (j=0 đến 15 với bớc tăng 2)
{
T=X(j+1);
X(j+1)=X(j) - T;
X(j)=X(j) + T;
}

Bớc thứ hai. Chúng ta có:
1.Bốn bớm với trọng lợng bằng 1.

for (j=0 đến 15 với bớc tăng 4)
{
T=X(j);
X(j+2)=X(j) - T;
X(j)=X(j) + T;
}
2. Bốn bớm với trọng lợng W
4
= W(3). Chú ý rằng chúng ta coi rằng
các hệ số xoay W, W
2
, , W
7
đã đợc tính và đợc chứa trong W(0), W(1),
W(6).


for (j=0 đến 15 với bớc tăng 4)
{
T=X(j)W(3);X(j+2)=X(j) - T;
X(j)=X(j) + T;
}

Bớc thứ ba. Chúng ta có :

89
1. Hai bớm với trọng lợng bằng 1.

for (j=0 đến 15 với bớc tăng 8)
{
T=X(j);
X(j+4)=X(j) - T;
X(j)=X(j) + T;
}


Hình 6.5 Lu đồ thuật toán thuật toán phân chia miền thời gian.
0
1
2
3
4
5
6
7
0
2

4
6
0
2
4
6
0
4
0
4
0
4
0
4
0
0
0
0
0
0
0
0
0
8
4
12
2
10
6
14

1
9
5
13
3
11
7
15
0000
1000
0100
1100
0010
1010
0110
1110
0001
1001
0101
1101
0011
1011
0111
1111
0
8
4
12
2
10

6
14
1
9
5
13
3
11
7
15
0
4
8
12
2
6
12
14
1
5
9
13
3
7
11
15
0
2
4
6

8
10
12
14
1
3
5
7
9
11
13
15
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0000
0001

0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
n=0 n=0 đến 1 n=0 đến 3 n=0 đến 7
n
W
8 n
W
4 n
W
2 n
W

Bậc của dãy vào biểu diễn
dạng nhị phân
Bậc của dãy ra biểu diễn
dạng nhị phân
bớc 0 bớc 1 bớc 2 bớc 3


90
2. Hai bớm với trọng lợng bằng W

(1) = W
2
.

for (j=1 đến 15 với bớc tăng 8)
{
T=X(j)W(1);
X(j+4)=X(j) - T;
X(j)=X(j) + T;
}



3. Hai bớm với trọng lợng bằng W(3) = W
4
.

for (j=2 đến 15 với bớc tăng 8)
{
T=X(j)W(3);
X(j+4)=X(j) - T;
X(j)=X(j) + T;
}


Hình 6.6 (a) Bớm cho thuật toán phân chia miền tần số;(b) Một bớm đơn
giản.

4. Hai bớm với trọng lợng bằng W

(5) = W
6
.

for (j=3 đến 15 với bớc tăng 8)
{
T=X(j)W(5);
X(j+4)=X(j) - T;
F(2n)
F(2n+1)
)(
10
kf
)(
11
kf
(a)
F(2n)
F(2n+1)
)(
10
kf
)(
11
kf
(b)

91

X(j)=X(j) + T;
}


Bớc thứ t và là bớc cuối cùng.

1.Một bớm với trọng lợng bằng 1.

T = X(0)
X(8)= X(0) - T
X(0) = X(8) +T

2. Một bớm với trọng lợng bằng W

(0) = W.


T = X(1)W(0)
X(1+8)= X(1) - T
X(1) = X(1) +T
3. Một bớm với trọng lợng bằng W

(1) = W
2
.


T = X(1)W(1)
X(2+8)= X(0) - T
X(2) = X(2) +T

.
.
.

8. Một bớm với trọng lợng bằng W

(6) = W
7
.

T = X(7)W(6)
X(7+8)= X(7)-T
X(7) = X(7) +T

Các bớc dẫn chúng ta đến thuật toán với N = 16.
Thuật toán
ip=1
kk=8
incr=2
cho iter=0 đến 3 trong các bớc của 1
{
cho j=0 đến 15 trong các bớc của incr

92
{
i = j + ip
T = X(j)
X(i) = X(j) - T
X(j) = X(j) +T
nếu (iter không bằng 0) thì

{
cho k=1 đến ip-1 trong các bớc của 1
{
r = k*kk - 1
cho j=k đến 15 trong các bớc của 15
{
i=j+ip
T=X(i)*W(r)
X(i)=X(j)-1
X(j)=X(j)+T
}
}
}
kk=kk/2
ip= ip*2
inc=inc*2
}

Thuật toán trên có thể dễ dàng mở rộng cho tất cả các trờng hợp của N.
Chỉ có một lĩnh vực còn lại cần phải giải thích là sự sắp xếp lại các dãy dữ
liệu đầu vào. Điều này có thể tạo ra dễ dàng nếu chúng ta tạo ra một bảng
(LUT) L(i), L(i) là các giá trị đảo ngợc bit của i. Nếu dữ liệu đợc đọc từ
một file thì tất cả các việc mà chúng ta phải làm là chuyển địa chỉ vùng của
chúng trong file qua bảng LUT và lu các dữ liệu này trong địa chỉ chứa kết
quả trong dãy đầu vào, X. Bớc này có thể chuyển sang ngôn ngữ C nh
sau:

for (i=0; i<N; i++)
fscanf (fptr, %f , &X[L[i]]);


Kết quả của LUT đợc chuyển thẳng và đợc cung cấp với chơng trình
của thuật toán tính FFT trong Listing 6.1 dới dạng modun con dới tên
bit_reversal( ).

93

Ch¬ng tr×nh 6.1 FFTDT.C FFT 1-D ThËp ph©n trong miÒn thêi
gian.

/***********************************
* Program developed by: *
* M.A.Sid-Ahmed. *
* ver. 1.0 1992. *
* @ 1994 *
*********************************/
/* FFT - Decimation-in-time routine with examplemain
programing proper usage. */

#define pi 3.141592654

#include <stdio.h>
#include <math.h>
#include <alloc.h>
#include <stdlib.h>

void bit_reversal(unsigned int *, int , int);
void WTS(float *, float *, int, int);
void FFT(float *xr, float *xi, float *, float *,
int , int);


void main()
{
int i,k,m,N,n2,sign;
unsigned int *L;
float *wr,*wi,*xr,*xi;
char file_name[14];
FILE *fptr;

printf("\nEnter name of file containing data points-> ");
scanf("%s",file_name);
if((fptr=fopen(file_name,"rb"))==NULL)
{
printf("file %s does not exist.");
exit(1);

94
}
printf("Enter # of data points to be read >");
scanf("%d",&N);
m=(int)(log10((double)N)/log10((double)2.0));
k=1;
for(i=0;i<m;i++)
k<<=1 ;
if (k!=N)
{
printf("n Length of file has to be multiples of 2. ");
exit(1);
}

/* Allocating memory for bit reversal LUT. */

L=(unsigned int *)malloc(N*sizeof(unsigned int));
/* Generate Look-up table for bit reversal. */
bit_reversal(L,m,N);

/* Allocating memory for FFT arrays ( real and imag.) */
xr=(float *)malloc(N*sizeof(float));
xi=(float *)malloc(N*sizeof(float));

/* Setting-up the data in real and imag. arrays.*/
for(i=0;i<N;i++)
{
k=L[i] ;
xr[k]=(float)getc(fptr);
xi[k]=0.0 ;
}
fclose(fptr);
/* Allocating memory for twiddle factors. */
n2=(N>>1)-1;
wr=(float *)malloc(n2*sizeof(float));
wi=(float *)malloc(n2*sizeof(float));

/*Generating LUT for
twiddle factors. */
WTS(wr,wi,N,-1);

×