From 0a9e0301e1e8a5e5cc00951bd532041b0c852dc4 Mon Sep 17 00:00:00 2001 From: Imants Pulkstenis Date: Sun, 20 Oct 2019 23:04:38 +0300 Subject: [PATCH] experimenting with FFT algorithms --- matlab/myfft.m | 324 ++++++++++++++++++++++++++++++------------------- 1 file changed, 196 insertions(+), 128 deletions(-) diff --git a/matlab/myfft.m b/matlab/myfft.m index 42239ab..6a27e3a 100644 --- a/matlab/myfft.m +++ b/matlab/myfft.m @@ -1,10 +1,11 @@ %% FFT algoritm +clear; % clear all data from memmory start_time = 0; -number_of_samples = 16; +number_of_samples = 8; end_time = number_of_samples - 1; n = linspace(start_time, end_time , number_of_samples ); -f1 = 5; +f1 = 1; a1 = 0.2; f2 = 2; @@ -12,7 +13,7 @@ a2 = 00; f3 = 1; a3 = 00; -comp1 = a1 * sin( f1 *2*pi*n/number_of_samples); +comp1 = a1 * cos( f1 *2*pi*n/number_of_samples); comp2 = a2 * sin( f2 *2*pi*n/number_of_samples); comp3 = a3 * sin( f3 *2*pi*n/number_of_samples); @@ -61,165 +62,232 @@ end % First stage of FFT -s_1_2 = zeros(1,number_of_samples); stage = zeros(bits,number_of_samples); - for i=1:number_of_samples - if rem(i-1,2) == 0 % odd or even - stage(1,i) = data(rev_bit_dec(i)) + data(rev_bit_dec(i+1)); - else - stage(1,i) = data(rev_bit_dec(i)) - data(rev_bit_dec(i-1)); - end + stage(1,i) = data((i)); + end -% s_1_2(1) = data(rev_bit_dec(1)) + data(rev_bit_dec(2)); -% s_1_2(2) = data(rev_bit_dec(2)) - data(rev_bit_dec(1)); -% -% s_1_2(3) = data(rev_bit_dec(3)) + data(rev_bit_dec(4)); -% s_1_2(4) = data(rev_bit_dec(4)) - data(rev_bit_dec(3)); -% -% s_1_2(5) = data(rev_bit_dec(5)) + data(rev_bit_dec(6)); -% s_1_2(6) = data(rev_bit_dec(6)) - data(rev_bit_dec(5)); -% -% s_1_2(7) = data(rev_bit_dec(7)) + data(rev_bit_dec(8)); -% s_1_2(8) = data(rev_bit_dec(8)) - data(rev_bit_dec(7)); -% -% s_1_2(9) = data(rev_bit_dec(9)) + data(rev_bit_dec(10)); -% s_1_2(10) = data(rev_bit_dec(10)) - data(rev_bit_dec(9)); -% -% s_1_2(11) = data(rev_bit_dec(11)) + data(rev_bit_dec(12)); -% s_1_2(12) = data(rev_bit_dec(12)) - data(rev_bit_dec(11)); -% -% s_1_2(13) = data(rev_bit_dec(13)) + data(rev_bit_dec(14)); -% s_1_2(14) = data(rev_bit_dec(14)) - data(rev_bit_dec(13)); -% -% s_1_2(15) = data(rev_bit_dec(15)) + data(rev_bit_dec(16)); -% s_1_2(16) = data(rev_bit_dec(16)) - data(rev_bit_dec(15)); -% s_1_2(1) = data(1) + data(5); -% s_1_2(2) = data(5) - data(1); +stage(2,1) = stage(1,1) + stage(1,2); +stage(2,2) = stage(1,1) - stage(1,2) ; + +stage(2,3) = (stage(1,3) + stage(1,4)) * exp(-j * 0 * 2 * pi/ 4 ); +stage(2,4) = (stage(1,3) - stage(1,4)) * exp(-j * 1 * 2 * pi/ 4 ); + +stage(2,5) = stage(1,5) + stage(1,6); +stage(2,6) = stage(1,5) - stage(1,6); + +stage(2,7) = (stage(1,7) + stage(1,8)) * exp(-j * 0 * 2 * pi/ 4 ); +stage(2,8) = (stage(1,7) - stage(1,8)) * exp(-j * 1 * 2 * pi/ 4 ); + +% stage(2,9) = stage(1,9) + stage(1,10); +% stage(2,10) = stage(1,9) - stage(1,10); % -% s_1_2(3) = data(3) + data(7); -% s_1_2(4) = data(7) - data(3); +% stage(2,11) = (stage(1,11) + stage(1,12)) * exp(-j * 0 * 2 * pi/ 4 ); +% stage(2,12) = (stage(1,11) - stage(1,12)) * exp(-j * 1 * 2 * pi/ 4 ); % -% s_1_2(5) = data(2) + data(6); -% s_1_2(6) = data(6) - data(2); +% stage(2,13) = stage(1,13) + stage(1,14); +% stage(2,14) = stage(1,13) - stage(1,14); % -% s_1_2(7) = data(4) + data(8); -% s_1_2(8) = data(8) - data(4); +% stage(2,15) = (stage(1,15) + stage(1,16)) * exp(-j * 0 * 2 * pi/ 4 ); +% stage(2,16) = (stage(1,15) - stage(1,16)) * exp(-j * 1 * 2 * pi/ 4 ); + +% stage(2,17) = stage(1,17) + stage(1,18); +% stage(2,18) = stage(1,17) - stage(1,18)) * exp(-j * 1 * 2 * pi/ 4 ); +% +% stage(2,19) = stage(1,19) + stage(1,20); +% stage(2,20) = stage(1,19) - stage(1,20)) * exp(-j * 1 * 2 * pi/ 4 ); +% +% stage(2,21) = stage(1,21) + stage(1,22); +% stage(2,22) = stage(1,21) - stage(1,22); +% +% stage(2,23) = stage(1,23) + stage(1,24); +% stage(2,24) = stage(1,23) - stage(1,24); +% +% stage(2,25) = stage(1,25) + stage(1,26); +% stage(2,26) = stage(1,25) - stage(1,26); +% +% stage(2,27) = stage(1,27) + stage(1,28); +% stage(2,28) = stage(1,27) - stage(1,28); +% +% stage(2,29) = stage(1,29) + stage(1,30); +% stage(2,30) = stage(1,29) - stage(1,30); +% +% stage(2,31) = stage(1,31) + stage(1,32); +% stage(2,32) = stage(1,31) - stage(1,32); + -% s_1_2, % stage, % Second stage -s_2_3 = zeros(1,number_of_samples); -s_2_3(1) = s_1_2(1) + W(1) * s_1_2(3); -s_2_3(2) = s_1_2(2) + W(3) * s_1_2(4); -s_2_3(3) = s_1_2(3) + W(5) * s_1_2(1); -s_2_3(4) = s_1_2(4) + W(7) * s_1_2(2); +stage(2,1) = stage(1,1) + stage(1,3); +stage(2,2) = stage(1,2) + stage(1,4); +stage(2,3) = stage(1,1) - stage(1,3); +stage(2,4) = stage(1,2) - stage(1,4); -s_2_3(5) = s_1_2(5) + W(1) * s_1_2(7); -s_2_3(6) = s_1_2(6) + W(3) * s_1_2(8); -s_2_3(7) = s_1_2(7) + W(5) * s_1_2(5); -s_2_3(8) = s_1_2(8) + W(7) * s_1_2(6); +stage(2,5) = (stage(1,5) + stage(1,7)) * exp(-j * 0 * 2 * pi/ 8 ); +stage(2,6) = (stage(1,6) + stage(1,8)) * exp(-j * 1 * 2 * pi/ 8 ); +stage(2,7) = (stage(1,5) - stage(1,7)) * exp(-j * 2 * 2 * pi/ 8 ); +stage(2,8) = (stage(1,6) - stage(1,8)) * exp(-j * 3 * 2 * pi/ 8 ); +% stage(2,9) = stage(1,9) + stage(1,11); +% stage(2,10) = stage(1,10) + stage(1,12); +% stage(2,11) = stage(1,9) - stage(1,11); +% stage(2,12) = stage(1,10) - stage(1,12); +% +% stage(2,13) = (stage(1,13) + stage(1,15)) * exp(-j * 0 * 2 * pi/ 8 ); +% stage(2,14) = (stage(1,14) + stage(1,16)) * exp(-j * 1 * 2 * pi/ 8 ); +% stage(2,15) = (stage(1,13) - stage(1,15)) * exp(-j * 2 * 2 * pi/ 8 ); +% stage(2,16) = (stage(1,14) - stage(1,16)) * exp(-j * 3 * 2 * pi/ 8 ); -W1 = zeros(1,4); % complex -for i = 1 : 4 - W1(i) = exp(-j * (i-1) * 2 * pi/ 4 ); -end - -stage(2,1) = stage(1,1) + W1(1) * stage(1,3); -stage(2,2) = stage(1,2) + W1(2) * stage(1,4); -stage(2,3) = stage(1,3) - W1(1) * stage(1,1); -stage(2,4) = stage(1,4) - W1(2) * stage(1,2); - -stage(2,5) = stage(1,5) + W1(1) * stage(1,7); -stage(2,6) = stage(1,6) + W1(2) * stage(1,8); -stage(2,7) = stage(1,7) - W1(1) * stage(1,5); -stage(2,8) = stage(1,8) - W1(2) * stage(1,6); - -stage(2,9) = stage(1,9) + W1(1) * stage(1,11); -stage(2,10) = stage(1,10) + W1(2) * stage(1,12); -stage(2,11) = stage(1,11) - W1(1) * stage(1,9); -stage(2,12) = stage(1,12) - W1(2) * stage(1,10); - -stage(2,13) = stage(1,13) + W1(1) * stage(1,15); -stage(2,14) = stage(1,14) + W1(2) * stage(1,16); -stage(2,15) = stage(1,15) - W1(1) * stage(1,13); -stage(2,16) = stage(1,16) - W1(2) * stage(1,14); +% stage(2,17) = stage(1,17) + 1 * stage(1,19); +% stage(2,18) = stage(1,18) + 1 * stage(1,20); +% stage(2,19) = stage(1,19) - W1(1) * stage(1,17); +% stage(2,20) = stage(1,20) - W1(2) * stage(1,18); +% +% stage(2,21) = stage(1,21) + 1 * stage(1,23); +% stage(2,22) = stage(1,22) + 1 * stage(1,24); +% stage(2,23) = stage(1,23) - W1(1) * stage(1,21); +% stage(2,24) = stage(1,24) - W1(2) * stage(1,22); +% +% stage(2,25) = stage(1,25) + 1 * stage(1,27); +% stage(2,26) = stage(1,26) + 1 * stage(1,28); +% stage(2,27) = stage(1,27) - W1(1) * stage(1,25); +% stage(2,28) = stage(1,28) - W1(2) * stage(1,26); +% +% stage(2,29) = stage(1,29) + 1 * stage(1,31); +% stage(2,30) = stage(1,30) + 1 * stage(1,32); +% stage(2,31) = stage(1,31) - W1(1) * stage(1,29); +% stage(2,32) = stage(1,32) - W1(2) * stage(1,30); % theard stage -s_3_4 = zeros(1,number_of_samples); -s_3_4(1) = s_2_3(1) + W(1) * s_2_3(5); -s_3_4(2) = s_2_3(2) + W(2) * s_2_3(6); +stage(3,1) = stage(2,1) + stage(2,5); +stage(3,2) = stage(2,2) + stage(2,6); +stage(3,3) = stage(2,3) + stage(2,7); +stage(3,4) = stage(2,4) + stage(2,8); +stage(3,5) = stage(2,1) - stage(2,5); +stage(3,6) = stage(2,2) - stage(2,6); +stage(3,7) = stage(2,3) - stage(2,7); +stage(3,8) = stage(2,4) - stage(2,8); -s_3_4(3) = s_2_3(3) + W(3) * s_2_3(7); -s_3_4(4) = s_2_3(4) + W(4) * s_2_3(8); +% stage(3,9) = (stage(2,9) + stage(2,13)) * exp(-j * 0 * 2 * pi/ 16 ); +% stage(3,10) = (stage(2,10) + stage(2,14)) * exp(-j * 1 * 2 * pi/ 16 ); +% stage(3,11) = (stage(2,11) + stage(2,15)) * exp(-j * 2 * 2 * pi/ 16 ); +% stage(3,12) = (stage(2,12) + stage(2,16)) * exp(-j * 3 * 2 * pi/ 16 ); +% stage(3,13) = (stage(2,9) - stage(2,13)) * exp(-j * 4 * 2 * pi/ 16 ); +% stage(3,14) = (stage(2,10) - stage(2,14)) * exp(-j * 5 * 2 * pi/ 16 ); +% stage(3,15) = (stage(2,11) - stage(2,15)) * exp(-j * 6 * 2 * pi/ 16 ); +% stage(3,16) = (stage(2,12) - stage(2,16)) * exp(-j * 7 * 2 * pi/ 16 ); -s_3_4(5) = s_2_3(5) + W(5) * s_2_3(1); -s_3_4(6) = s_2_3(6) + W(6) * s_2_3(2); -s_3_4(7) = s_2_3(7) + W(7) * s_2_3(3); -s_3_4(8) = s_2_3(8) + W(8) * s_2_3(4); - -W2 = zeros(1,8); % complex -for i = 1 : 8 - W2(i) = exp(-j * (i-1) * 2 * pi/ 8 ); -end - -stage(3,1) = stage(2,1) + W2(1) * stage(2,5); -stage(3,2) = stage(2,2) + W2(2) * stage(2,6); -stage(3,3) = stage(2,3) + W2(3) * stage(2,7); -stage(3,4) = stage(2,4) + W2(4) * stage(2,8); -stage(3,5) = stage(2,5) - W2(1) * stage(2,1); -stage(3,6) = stage(2,6) - W2(2) * stage(2,2); -stage(3,7) = stage(2,7) - W2(3) * stage(2,3); -stage(3,8) = stage(2,8) - W2(4) * stage(2,4); - -stage(3,9) = stage(2,9) + W2(1) * stage(2,13); -stage(3,10) = stage(2,10) + W2(2) * stage(2,14); -stage(3,11) = stage(2,11) + W2(3) * stage(2,15); -stage(3,12) = stage(2,12) + W2(4) * stage(2,16); -stage(3,13) = stage(2,13) - W2(1) * stage(2,9); -stage(3,14) = stage(2,14) - W2(2) * stage(2,10); -stage(3,15) = stage(2,15) - W2(3) * stage(2,11); -stage(3,16) = stage(2,16) - W2(4) * stage(2,12); +% stage(3,17) = stage(2,17) + W2(1) * stage(2,21); +% stage(3,18) = stage(2,18) + W2(2) * stage(2,22); +% stage(3,19) = stage(2,19) + W2(3) * stage(2,23); +% stage(3,20) = stage(2,20) + W2(4) * stage(2,24); +% stage(3,21) = stage(2,21) - W2(1) * stage(2,17); +% stage(3,22) = stage(2,22) - W2(2) * stage(2,18); +% stage(3,23) = stage(2,23) - W2(3) * stage(2,19); +% stage(3,24) = stage(2,24) - W2(4) * stage(2,20); +% +% stage(3,25) = stage(2,25) + W2(1) * stage(2,29); +% stage(3,26) = stage(2,26) + W2(2) * stage(2,30); +% stage(3,27) = stage(2,27) + W2(3) * stage(2,31); +% stage(3,28) = stage(2,28) + W2(4) * stage(2,32); +% stage(3,29) = stage(2,29) - W2(1) * stage(2,25); +% stage(3,30) = stage(2,30) - W2(2) * stage(2,26); +% stage(3,31) = stage(2,31) - W2(3) * stage(2,27); +% stage(3,32) = stage(2,32) - W2(4) * stage(2,28); % Fourt stage -W3 = zeros(1,16); % complex -for i = 1 : 16 - W3(i) = exp(-j * (i-1) * 2 * pi/ 16 ); -end +% +% stage(4,1) = stage(3,1) + stage(3,9); +% stage(4,2) = stage(3,2) + stage(3,10); +% stage(4,3) = stage(3,3) + stage(3,11); +% stage(4,4) = stage(3,4) + stage(3,12); +% stage(4,5) = stage(3,5) + stage(3,13); +% stage(4,6) = stage(3,6) + stage(3,14); +% stage(4,7) = stage(3,7) + stage(3,15); +% stage(4,8) = stage(3,8) + stage(3,16); +% stage(4,9) = stage(3,1) - stage(3,9); +% stage(4,10) = stage(3,2) - stage(3,10); +% stage(4,11) = stage(3,3) - stage(3,11); +% stage(4,12) = stage(3,4) - stage(3,12); +% stage(4,13) = stage(3,5) - stage(3,13); +% stage(4,14) = stage(3,6) - stage(3,14); +% stage(4,15) = stage(3,7) - stage(3,15); +% stage(4,16) = stage(3,8) - stage(3,16); + +% stage(4,17) = stage(3,17) + W3(1) * stage(3,25); +% stage(4,18) = stage(3,18) + W3(2) * stage(3,26); +% stage(4,19) = stage(3,19) + W3(3) * stage(3,27); +% stage(4,20) = stage(3,20) + W3(4) * stage(3,28); +% stage(4,21) = stage(3,21) + W3(5) * stage(3,29); +% stage(4,22) = stage(3,22) + W3(6) * stage(3,30); +% stage(4,23) = stage(3,23) + W3(7) * stage(3,31); +% stage(4,24) = stage(3,24) + W3(8) * stage(3,32); +% stage(4,25) = stage(3,25) - W3(1) * stage(3,17); +% stage(4,26) = stage(3,26) - W3(2) * stage(3,18); +% stage(4,27) = stage(3,27) - W3(3) * stage(3,19); +% stage(4,28) = stage(3,28) - W3(4) * stage(3,20); +% stage(4,29) = stage(3,29) - W3(5) * stage(3,21); +% stage(4,30) = stage(3,30) - W3(6) * stage(3,22); +% stage(4,31) = stage(3,31) - W3(7) * stage(3,23); +% stage(4,32) = stage(3,32) - W3(8) * stage(3,24); + +% Fifth stage + +% W4 = zeros(1,32); % complex +% for i = 1 : 32 +% W4(i) = exp(-j * (i-1) * 2 * pi/ 32 ); +% end +% +% stage(5,1) = stage(4,1) + W4(1) * stage(4,17); +% stage(5,2) = stage(4,2) + W4(2) * stage(4,18); +% stage(5,3) = stage(4,3) + W4(3) * stage(4,19); +% stage(5,4) = stage(4,4) + W4(4) * stage(4,20); +% stage(5,5) = stage(4,5) + W4(5) * stage(4,21); +% stage(5,6) = stage(4,6) + W4(6) * stage(4,22); +% stage(5,7) = stage(4,7) + W4(7) * stage(4,23); +% stage(5,8) = stage(4,8) + W4(8) * stage(4,24); +% stage(5,9) = stage(4,9) + W4(9) * stage(4,25); +% stage(5,10) = stage(4,10) + W4(10) * stage(4,26); +% stage(5,11) = stage(4,11) + W4(11) * stage(4,27); +% stage(5,12) = stage(4,12) + W4(12) * stage(4,28); +% stage(5,13) = stage(4,13) + W4(13) * stage(4,29); +% stage(5,14) = stage(4,14) + W4(14) * stage(4,30); +% stage(5,15) = stage(4,15) + W4(15) * stage(4,31); +% stage(5,16) = stage(4,16) + W4(16) * stage(4,32); +% stage(5,17) = stage(4,17) - W4(1) * stage(4,1); +% stage(5,18) = stage(4,18) - W4(2) * stage(4,2); +% stage(5,19) = stage(4,19) - W4(3) * stage(4,3); +% stage(5,20) = stage(4,20) - W4(4) * stage(4,4); +% stage(5,21) = stage(4,21) - W4(5) * stage(4,5); +% stage(5,22) = stage(4,22) - W4(6) * stage(4,6); +% stage(5,23) = stage(4,23) - W4(7) * stage(4,7); +% stage(5,24) = stage(4,24) - W4(8) * stage(4,8); +% stage(5,25) = stage(4,25) - W4(9) * stage(4,9); +% stage(5,26) = stage(4,26) - W4(10) * stage(4,10); +% stage(5,27) = stage(4,27) - W4(11) * stage(4,11); +% stage(5,28) = stage(4,28) - W4(12) * stage(4,12); +% stage(5,29) = stage(4,29) - W4(13) * stage(4,13); +% stage(5,30) = stage(4,30) - W4(14) * stage(4,14); +% stage(5,31) = stage(4,31) - W4(15) * stage(4,15); +% stage(5,32) = stage(4,32) - W4(16) * stage(4,16); + -stage(4,1) = stage(3,1) + W3(1) * stage(3,9); -stage(4,2) = stage(3,2) + W3(2) * stage(3,10); -stage(4,3) = stage(3,3) + W3(3) * stage(3,11); -stage(4,4) = stage(3,4) + W3(4) * stage(3,12); -stage(4,5) = stage(3,5) + W3(5) * stage(3,13); -stage(4,6) = stage(3,6) + W3(6) * stage(3,14); -stage(4,7) = stage(3,7) + W3(7) * stage(3,15); -stage(4,8) = stage(3,8) + W3(8) * stage(3,16); -stage(4,9) = stage(3,9) - W3(1) * stage(3,1); -stage(4,10) = stage(3,10) - W3(2) * stage(3,2); -stage(4,11) = stage(3,11) - W3(3) * stage(3,3); -stage(4,12) = stage(3,12) - W3(4) * stage(3,4); -stage(4,13) = stage(3,13) - W3(5) * stage(3,5); -stage(4,14) = stage(3,14) - W3(6) * stage(3,6); -stage(4,15) = stage(3,15) - W3(7) * stage(3,7); -stage(4,16) = stage(3,16) - W3(8) * stage(3,8); figure(4) -stem(n, abs( stage(4,:) ) ) +stem(n, abs( stage(bits,:) ) )