Giáo trình xử lý ảnh y tế Tập 1a P11 ppt

10 337 0
Giáo trình xử lý ảnh y tế Tập 1a P11 ppt

Đang tải... (xem toàn văn)

Thông tin tài liệu

86 Hình 6.4 Bước đầu tiên của lưu đồ 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 lưu đồ. 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. 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ừ lưu đồ. Tuy nhiên, chúng ta có thể nghiên cứu lưu đồ và vạch ra các bước có thể dùng để phát triển một chương trình. Từ lưu đồ 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) 87 { 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ó : 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; } 88 Hỡnh 6.5 Lu thut toỏn thut toỏn phõn chia min thi gian. 2. Hai bm vi trng lng bng W (1) = W 2 . for (j=1 n 15 vi bc tng 8) { T=X(j)W(1); X(j+4)=X(j) - T; X(j)=X(j) + T; } 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 89 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; 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 F(2n) F(2n+1) )( 10 kf )( 11 kf (a) F(2n) F(2n+1) )( 10 kf )( 11 kf (b) 90 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 { 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 { 91 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à lưu 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( )”. 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 92 #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); } 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)); 93 /* 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); /* Taking FFT. */ FFT(xr, xi, wr, wi, m, N); printf("Enter file name for storing FFT output >"); scanf("%s",file_name); fptr=fopen(file_name,"w"); for(i=0;i<N;i++) fprintf(fptr," %e %e",xr[i], xi[i]); fclose(fptr); } void bit_reversal(unsigned int *L, int m, int N) /* Routine for generating LUT for bit reversal. Note: N=(2 to the power of m). LUT will reside in LI]*/ { 94 unsigned int MASK,C,A,j,k,i; for(k=0;k<N;k++) { MASK=1; C=0; for(i=0,j=m-1;i<m;i++,j ) { A=(k&MASK)>>i; A<<=j ; C|=A; MASK=MASK<<1; } L[k]=C; } } void WTS(float *wr, float *wi, int N, int sign) /* Generating LUT for twiddle factors. Note: sign=-1 for FFT, and sign=1 for IFFT */ { int n2,i ; float theta; n2=(N>>1)-1; /* Generate look-up tables for twiddle factor. */ theta=2.0*pi/((float)N); for(i=0;i<n2;i++) { wr[i]=(float)cos((double)((i+1)*theta)); wi[i]=(float)sin((double)((i+1)*theta)); if(sign==(int)(-1)); wi[i]=-wi[i]; } } /********************************************/ void FFT (float *xr, float *xi, float *wr, float *wi, int m, int N) 95 { /* FFT algorithm, Decimation-in-time algorithm. Note: 1. N=2 to the power of m. 2. The input arrays are assumed to be rearranged in bit-reverse order. You will need to use routine "bitreversal" for that purpose. 3. The twiddle factors are assumed to be stored in LUT's wr[I and wi[j. You will need to use routine LUT for calculating and storing twiddle factors.*/ int ip,k,kk,l,incr,iter,j,i; float Tr,Ti; ip=1; kk=(N>>1); incr=2 ; for(iter=0; iter<m; iter++) { for(j=0; j<N; j+=incr) { i=j+ip; Tr=xr[i]; Ti=xi[i]; xr[i]=xr[j]-Tr; xi[i]=xi[j]-Ti; xr[j]=xr[j]+Tr; xi[j]=xi[j]+Ti; } if(iter!=0) { for(k=1; k<ip; k++) { . 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à lưu 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ư. đổ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ừ lưu đồ. Tuy nhiên, chúng. đồ 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

Ngày đăng: 10/07/2014, 21:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan