Nhân chập vòng

Một phần của tài liệu Giáo trình thực tập chuyên đề phân tích và xử lý tín hiệu số (DSP) (Trang 30 - 34)

BÀI 5: BIẾN ĐỔI DFT VÀ FFT

5.1.3.2 Nhân chập vòng

Nếu X[k] và H[k] là 2 DFT của hai dãy có cùng chiều dài N x[n] va h[n] thì DFT N điểm của dãy nhân chập vòng giữa x[n] và h[n] sẽ là X[k]H[k]

function y=circonvt(x1,x2,N)

if length(x1)>N

error('N phai lon hon hoac bang x1')

end

if length(x2)>N

error('N phai lon hon hoac bang x2')

end x1=[x1 zeros(1,N-length(x1))]; x2=[x2 zeros(1,N-length(x2))]; m=[0:1:N-1]; x2=x2(mod(-m,N)+1); H=zeros(N,N); for n=1:1:N H(n,:)=circshift(x2,n-1,N); end y=x1*H';

Ví dụ: Thực hiện nhân chập vòng cho hai tín hiệu x[n]=[1 2 2], h[n]=[1 2 3 4]. So sánh với nhân chập

thẳng. Chương trình x=[1 2 2]; x=[1 2 3 4]; y=circonvt(x,,4) y1=conv(x,h) Kết quả y = 15 12 9 14 y1 = 1 4 9 14 14 8 5.2 Biến đổi FFT

Trên thực tế, chúng ta thường gặp trường hợp thực hiện DFT với các dãy có chiều dài khác xa nhau, một dãy trong phép DFT quá dài sẽ dần đến vượt quá dung lượng của bộ nhớ và thời gian tính toán cho phép. Để có được mẫu đầu tiên của kết quả phải đợi kết thúc tất cả quá trình tính toán. Nhờ tính thuận lợi của tính chất đối xứng hình học và tính tuần hoàn của các hệ số mũ trong công thức của DFT ta có thể giảm số lượng phép nhân cần thiết trong tính toán từ N2 xuống Nlog2N với N là số mũ cơ số 2. Đối với các dãy có N không phải là cơ số mũ của 2 thì ta có thể thêm các giá trị 0 để đạt đến kết quả.

Để phát triển các thuật toán DFt có khả năng tính toán cao, người ta thường chia nhỏ liên tiếp sự phức tạp DFT N điểm thànhc ác DFT cấp nhỏ hơn và đưa ra một loạt thuật toán có tính hiệu quả được gọi là tập các thuật toán biến đổi Fourier nhanh FFT

Trong Matlab, để tính FFT ta sử dụng hàm fft và FFT ngược là ifft. Hàm này cũng có 2 cách thực hiện:  fft(x) cho DFT X[k] của x(n), cả hai dãy có cùng độ dài

fft(x,M) tính DFT M điểm của dãy x(n) có chiều dài N. Nếu M>N thì dãy x(n) phải được điền

thêm M-N giá trị 0 trước khi tính DFT

Nhân chập nhanh

Có thể dùng thuật toán FFT để thực hiện việc nhân chập giữa 2 dãy x[n] có chiều dài Nx và dãy h[n] có chiều dài Nh. Nếu số điểm tính FFT chọn là N=2m với m=log2(Nx+Nh-1) lấy phần nguyên lớn hơn m (hàm ceiling) thì thuật toán này gọi là nhân chập nhanh. Với thuật toán này thì phép nhân chập thẳng giửa 2 dãy x[n] và h[n] khi N lớn được thực hiện rất nhanh nhờ FFT N điểm và một IFFT N điểm và một phép nhân N điểm.

Hàm conv (dùng hàm filter) để tính nhân chập rất hiệu quả khi N<50. Đối với N lớn hơn, ta dùng FFT để thực hiện việc tính toán nhanh hơn.

Ví dụ: So sánh thời gian thực hiện của 2 phép tính nhân chập. Cho x1[n] là các số ngẫu nhiên phân bố

đều L điểm trong khoảng [0 1], x2[n] là chuỗi phân bố Gauss L điểm với giá trị trung bình =0, phương sai bằng 1. Xác định thời gian thực hiện trung bình với 1≤L≤1000.

Chương trình

conv_time = zeros(1,1000); fft_time = zeros(1,1000);

for N = 1:1000 tc = 0; tf=0; L = 2*N-1; nu = round((log10(L)/log10(2))+0.45); L = 2^nu; for I=1:100 h = randn(1,N); x = rand(1,N);

t0 = clock; y1 = conv(h,x); t1=etime(clock,t0); tc = tc+t1;

t0 = clock; y2 = ifft(fft(h,L).*fft(x,L)); t2=etime(clock,t0); tf = tf+t2; end conv_time(N)=tc/100; fft_time(N)=tf/100; end n = 1:1000; subplot(1,1,1); plot(n(25:1000),conv_time(25:1000),n(25:1000),fft_time(25:1000)) save times.txtconv_timefft_time-ascii-tabs

load times.txt-ascii; conv_time=times(1,:); hsconv_time=times(2,:); n = 1:1000; subplot(1,1,1);

5.3 Bài tập

1. Cho hàm x[n] =cos(0.48πn)+cos(0.52πn) a) Tìm và vẽ DFT của x[n] với N=10

b) Lặp lại câu a với N=100

2. Biến đổi chương trình ví dụ của bài tích chấp vòng để cho ra kết quả giống tích chập thẳng. 3. Tính FFT và phân tích phổ của hàm cho ở câu 1 với N=16, số điểm tính FFT là 128 điểm.

Một phần của tài liệu Giáo trình thực tập chuyên đề phân tích và xử lý tín hiệu số (DSP) (Trang 30 - 34)

Tải bản đầy đủ (DOC)

(54 trang)
w