From bb79fe87307fc54a7224f02d37cae69d7a91c583 Mon Sep 17 00:00:00 2001 From: Imants Pulkstenis Date: Fri, 27 Dec 2019 17:19:28 +0200 Subject: [PATCH] Updated myfft3 file. Add calculations using fixed point integers and seperatly calculated real and imaginary numbers --- matlab/html/myfft3.html | 659 ++++++++++++++++++++++++++++++++++++++ matlab/html/myfft3.png | Bin 0 -> 2193 bytes matlab/html/myfft3_01.png | Bin 0 -> 26411 bytes matlab/html/myfft3_02.png | Bin 0 -> 21929 bytes matlab/html/myfft3_03.png | Bin 0 -> 13983 bytes matlab/html/myfft3_04.png | Bin 0 -> 14085 bytes matlab/html/myfft3_05.png | Bin 0 -> 15154 bytes matlab/html/myfft3_06.png | Bin 0 -> 14246 bytes matlab/myfft3.m | 223 ++++++++++--- 9 files changed, 832 insertions(+), 50 deletions(-) create mode 100644 matlab/html/myfft3.html create mode 100644 matlab/html/myfft3.png create mode 100644 matlab/html/myfft3_01.png create mode 100644 matlab/html/myfft3_02.png create mode 100644 matlab/html/myfft3_03.png create mode 100644 matlab/html/myfft3_04.png create mode 100644 matlab/html/myfft3_05.png create mode 100644 matlab/html/myfft3_06.png diff --git a/matlab/html/myfft3.html b/matlab/html/myfft3.html new file mode 100644 index 0000000..bb41839 --- /dev/null +++ b/matlab/html/myfft3.html @@ -0,0 +1,659 @@ + + + + + myfft3

Contents

FFT algoritm

clear;                      % clears all previus values from memory
+clc;                        % clear command window
+fs =  44100;                % samplinf freq.
+fftLength=32;               % windowlength
+
+% signal frequencies
+data_length = 8;           % data length in FPGA calculations
+max = 2^(data_length-1) - 1 ;            % max aplitude 2^n  /2
+
+f1 = 1000;
+a1 = max/2;
+
+f2 = 0;
+a2 = max/4;
+
+f3 = 8000;
+a3 = max/2;
+
+% calculating signals
+comp1 = a1 * cos(2*pi*f1*[0:1/fs:1]);
+comp2 = a2 * cos(2*pi*f2*[0:1/fs:1]);
+comp3 = a3 * cos(2*pi*f3*[0:1/fs:1]);
+
+% calculatin vector values for step function
+d1 = ones(1, 24);
+d2 = 0.*ones(1, 1000 );
+
+%data = [ d1 , d2];                  % creates vector with step function
+data = comp1 + comp2 + comp3;      % creates vector from 3 sin functions
+
+figure(1)               % plots separete sin functions
+plot ( comp1, '-');
+hold on;
+plot ( comp2, '-');
+plot ( comp3, '-');
+xlim([1 50])
+title('Separete SIN functions')
+ylabel('magnitude'), xlabel('time')
+hold off;
+
+figure(2)               % plots signal for fft
+plot ( data);
+title('Signal for FFT analysis FFT')
+ylabel('magnitude'), xlabel('time')
+xlim([1 100])
+
+figure(3)               % plots resultinf fft from Matlab functions
+ft =fft(data,fftLength);
+ftMag=abs(ft(1:fftLength/2));
+stem (ftMag)
+title('Linear Magnitude FFT')
+ylabel('magnitude'), xlabel('kHz')
+
+xt = xticks;        % returns the current x-axis tick values as a vector
+fstep = fs/fftLength;       % tick of f axis in f domain
+xtnew = round((xt-1)*fstep/1000, 1) ;   % calculate new tick in kHz
+xticklabels(xtnew)      % set new tick labels
+
+% figure(4)               % plots resultinf fft(in dB)  from Matlab functions
+% ft =fft(data,fftLength);
+% ftMag=abs(ft(1:fftLength/2));
+% plot (20*log10(ftMag))
+% title('dB Magnitude')
+% ylabel('dB'), xlabel('kHz')
+%
+% xt = xticks;        % returns the current x-axis tick values as a vector
+% fstep = fs/fftLength;       % tick of f axis in f domain
+% xtnew = round((xt-1)*fstep/1000, 1) ;   % calculate new tick in kHz
+% xticklabels(xtnew)      % set new tick labels
+

Data preparation for FFT

% reverse bit calulation
+bits = length(dec2bin( fftLength - 1 ));    % how many bits in binary number
+rev_bit_dec = zeros(1,fftLength);           % create vektor size of fftlength
+
+for n=1:fftLength
+    bin_num = dec2bin(n-1 , bits);          % converting to binary number
+    rev_bit = [];                           % create empty vector
+    for k=bits:-1:1
+       rev_bit = [rev_bit , bin_num(k)];
+    end
+    rev_bit_dec(n) = bin2dec(rev_bit) ;     % add 1 to match Matlab numbering
+end
+
+%  creating array
+%  create empty array to store values in reverse bit order
+stage = zeros(bits + 1,fftLength);
+
+for n=1:fftLength
+     stage(1,n)  =  data(rev_bit_dec(n)+1);
+end
+
+% Calculating W twiddling factor for all stages
+for n = 1 : fftLength/2
+    W(n)  = exp(-1i * (n-1) * 2 * pi/ fftLength );
+end
+
+% convert to fixed point mumber -> sfi(v,w,f) returns a signed fixed-point object with value v, word length w, and fraction length f.
+Wr = sfi(real(W),data_length,data_length-2);
+Wi = sfi(imag(W),data_length,data_length-2);
+
+st_real = sfi(real(stage) , data_length + 3 , 0);
+st_imag = sfi(imag(stage) , data_length + 3 , 0);
+% temp values for multiplaying with W twiddling factor
+st_real_tmp = sfi(real(zeros(bits + 1,fftLength)) , data_length + 3 , 0);
+st_imag_tmp = sfi(imag(zeros(bits + 1,fftLength)) , data_length + 3 , 0);
+

First stage

for n = 1 : 2^1 : fftLength
+    % Even
+    stage(2,n)    = stage(1,n) + stage(1,n+1);
+    % Odd
+    stage(2,n+1)  = stage(1,n) - stage(1,n+1);
+end
+
+% calculations using separate real and imaginary numbers
+for n = 1 : 2^1 : fftLength
+    % Even
+    st_real(2,n)    = st_real(1,n) + st_real(1,n+1);
+    % imag is 0
+    % Odd
+    st_real(2,n+1)  = st_real(1,n) - st_real(1,n+1);
+    % imag is 0
+end
+

Second stage

% Calculating W twiddling factor
+for n = 1 : 2
+    Wn(n)  = exp(-1i * (n-1) * 2 * pi/ 4 );
+end
+
+% calculate next stage values
+for n = 1 : 2^2 : fftLength
+    % Even pair
+        stage(3,n+0)   = stage(2,n+0) + Wn(1)*stage(2,n+2);
+        stage(3,n+1)   = stage(2,n+1) + Wn(2)*stage(2,n+3);
+    % Odd par
+        stage(3,n+2)   = stage(2,n+0) - Wn(1)*stage(2,n+2);
+        stage(3,n+3)   = stage(2,n+1) - Wn(2)*stage(2,n+3);
+end
+
+% calculations using separate real and imaginary numbers
+for n = 1 : 2^2 : fftLength
+    % Even pair
+        st_real(3,n+0)   = st_real(2,n+0) + st_real(2,n+2);
+        % imag is 0
+        st_real(3,n+1)   = st_real(2,n+1) ;         % real is 0
+        st_imag(3,n+1)   = -1 * st_real(2,n+3);     % mult -j
+    % Odd par
+        st_real(3,n+2)   = st_real(2,n+0) - st_real(2,n+2);
+        % imag is 0
+        st_real(3,n+3)   = st_real(2,n+1) ;         % real is 0
+        st_imag(3,n+3)   = st_real(2,n+3);          % mult -j
+end
+

Therd stage

% Calculating W twiddling factor
+for n = 1 : 4
+    Wn(n)  = exp(-1i * (n-1) * 2 * pi/ 8 );
+end
+
+% calculate next stage values
+for n = 1 : 2^3 : fftLength
+    for k = 0 : 3
+        % Even pair
+        stage(4,n+k)   = stage(3,n+k) + Wn(k+1)*stage(3,n+k+4);
+        % Odd par
+        stage(4,n+k+4) = stage(3,n+k) - Wn(k+1)*stage(3,n+k+4);
+    end
+end
+
+% calculations using separate real and imaginary numbers
+for n = 1 : 2^3 : fftLength
+    for k = 0 : 3
+        st_real_tmp(3,n+k+4) = ( Wr(k*4+1) * st_real(3,n+k+4) ) - (  Wi(k*4+1) * st_imag(3,n+k+4) );
+        st_imag_tmp(3,n+k+4) = ( Wi(k*4+1) * st_real(3,n+k+4) ) + (  Wr(k*4+1) * st_imag(3,n+k+4) );
+    end
+end
+for n = 1 : 2^3 : fftLength
+    for k = 0 : 3
+        % Even pair
+        st_real(4,n+k)   = st_real(3,n+k) + st_real_tmp(3,n+k+4);
+        st_imag(4,n+k)   = st_imag(3,n+k) + st_imag_tmp(3,n+k+4);
+        % Odd par
+        st_real(4,n+k+4) = st_real(3,n+k) - st_real_tmp(3,n+k+4);
+        st_imag(4,n+k+4) = st_imag(3,n+k) - st_imag_tmp(3,n+k+4);
+    end
+end
+

4th stage

% Calculating W twiddling factor
+for n = 1 : 8
+    Wn(n)  = exp(-1i * (n-1) * 2 * pi/ 16 );
+end
+
+% calculate next stage values
+for n = 1 : 2^4 : fftLength
+    for k = 0 : 7
+        % Even pair
+        stage(5,n+k)    = stage(4,n+k) + Wn(k+1)*stage(4,n+k+8);
+        % Odd par
+        stage(5,n+k+8)  = stage(4,n+k) - Wn(k+1)*stage(4,n+k+8);
+    end
+end
+
+% calculations using separate real and imaginary numbers
+for n = 1 : 2^4 : fftLength
+    for k = 0 : 7
+         st_real_tmp(4,n+k+8) = ( Wr(k*2+1) * st_real(4,n+k+8) ) - (  Wi(k*2+1) * st_imag(4,n+k+8) );
+         st_imag_tmp(4,n+k+8) = ( Wi(k*2+1) * st_real(4,n+k+8) ) + (  Wr(k*2+1) * st_imag(4,n+k+8) );
+    end
+end
+for n = 1 : 2^4 : fftLength
+    for k = 0 : 7
+        % Even pair
+        st_real(5,n+k)    = st_real(4,n+k) + st_real_tmp(4,n+k+8);
+        st_imag(5,n+k)    = st_imag(4,n+k) + st_imag_tmp(4,n+k+8);
+        % Odd par
+        st_real(5,n+k+8)  = st_real(4,n+k) - st_real_tmp(4,n+k+8);
+        st_imag(5,n+k+8)  = st_imag(4,n+k) - st_imag_tmp(4,n+k+8);
+    end
+end
+

5th stage

% Calculating W twiddling factor
+for n = 1 : 16
+    Wn(n)  = exp(-1i * (n-1) * 2 * pi/ 32 );
+end
+
+% calculate next stage values
+for n = 1 : 2^5 : fftLength
+    for k = 0 : 15
+        % Even pair
+        stage(6,n+k)    = stage(5,n+k) + Wn(k+1)*stage(5,n+k+16);
+        % Odd par
+        stage(6,n+k+16)  = stage(5,n+k) - Wn(k+1)*stage(5,n+k+16);
+    end
+end
+
+% calculations using separate real and imaginary numbers
+for n = 1 : 2^5 : fftLength
+    for k = 0 : 15
+         st_real_tmp(5,n+k+16) = ( Wr(k*1+1) * st_real(5,n+k+16) ) - (  Wi(k*1+1) * st_imag(5,n+k+16) );
+         st_imag_tmp(5,n+k+16) = ( Wi(k*1+1) * st_real(5,n+k+16) ) + (  Wr(k*1+1) * st_imag(5,n+k+16) );
+    end
+end
+for n = 1 : 2^5 : fftLength
+    for k = 0 : 15
+        % Even pair
+        st_real(6,n+k)    = st_real(5,n+k) + st_real_tmp(5,n+k+16);
+        st_imag(6,n+k)    = st_imag(5,n+k) + st_imag_tmp(5,n+k+16);
+        % Odd par
+        st_real(6,n+k+16)  = st_real(5,n+k) - st_real_tmp(5,n+k+16);
+        st_imag(6,n+k+16)  = st_imag(5,n+k) - st_imag_tmp(5,n+k+16);
+    end
+end
+

Ploting out

slowly plot result

figure(5)
+for n = 1 : bits +1
+    %plot( abs( real_n(i, :) + j.*imag_n(i,  :) ) );
+    stem( abs( stage(n,1:fftLength/2) ) );
+%     pause(1);
+end
+xt = xticks;        % returns the current x-axis tick values as a vector
+fstep = fs/fftLength;       % tick of f axis in f domain
+xtnew = round((xt-1)*fstep/1000, 1) ;   % calculate new tick in kHz
+xticklabels(xtnew)      % set new tick labels
+title('FFT using custom function')
+ylabel('magnitude'), xlabel('kHz')
+
+figure(6)
+for n = 1 : bits +1
+    %plot( abs( real_n(i, :) + j.*imag_n(i,  :) ) );
+    temp = st_real + 1i * st_imag;
+    stem( abs( temp(n,1:fftLength/2) ) );
+%      pause(1);
+end
+xt = xticks;        % returns the current x-axis tick values as a vector
+fstep = fs/fftLength;       % tick of f axis in f domain
+xtnew = round((xt-1)*fstep/1000, 1) ;   % calculate new tick in kHz
+xticklabels(xtnew)      % set new tick labels
+title('FFT using custom function real/imag separate')
+ylabel('magnitude'), xlabel('kHz')
+
+figure(7)
+dif2 = 100* abs(temp(bits +1,1:fftLength/2) - ft(1:fftLength/2))./abs(ft(1:fftLength/2)) ;
+plot(dif2, 'blue')
+title('Difference in calculations')
+xt = xticks;        % returns the current x-axis tick values as a vector
+fstep = fs/fftLength;       % tick of f axis in f domain
+xtnew = round((xt-1)*fstep/1000, 1) ;   % calculate new tick in kHz
+xticklabels(xtnew)      % set new tick labels
+ylabel('percents, %'), xlabel('kHz')
+
\ No newline at end of file diff --git a/matlab/html/myfft3.png b/matlab/html/myfft3.png new file mode 100644 index 0000000000000000000000000000000000000000..50ec05eb5092079cf787bf9d543b1d4b90136fe9 GIT binary patch literal 2193 zcmV;C2yXX@P)00>1%L_t(&f$dvcPZL`ke%H)&IviSP3#BbXK{>=I*}B>4g@3_YW8#he zBmRVm|G-2Nqil?#Mgy`-Q8uR!OA+j}otDmd&H66dk3&11c6y)?zUQiW-*tMr)_Yio zL4**v!k{`mfDVIcN2BZO>kA7D6B84$SPUWb`0-S|AV*1i|HUDT*S?vd`yZ80Pis*AE^%NTpJmrbVMsmSrVLVi?Bb@i0uwhK<^> z{@=cR8;{4gx3?*Za=Bc4dwZc!Xl!h3b92+<@$BsEJbU)+`Sa(qv$M0avmTG<>C>k# zUc3-RF`v&<6!qxQqq(`cR4OIQ^2EeMAP|VfVy0AKEw97Q=ZTZB-xDt7!oefl&wIGD|5qtR%kHjzm1JYOl_-`@|1 z!lM5JF{g!!QiP;5e>KP6)~6a(#V$l}#NU9tMNKO8MU2-th2nrF?gHcV=d$ zQeNuD9T!Aroy=FD7T_Pz-lArzyw9fuazK602$L`13qZ({wQ>ZNtFM3E3

Ag}?u9q$0-P z_uCb?9Q+Ff7#M&CPAU`y`upt)Tn_%}G>nabBss2_%|gY-`V8#&Z)|KNlSx4kOtWhK za6ZW8!0UydKOI-hWB|a-X0z1_*hRQ-IE*n41OgW!{!PNkK+#80Mi7o7XV;r2n+-2Pf7@ZuC5woEG9OQNX*U6U7XBc(@H*kXb67)c2LnU zYB+ze>lK-t+x5DADq9_i!Y9|B%T&~jZ zt}X{ru%`0|Oa781y?OJd{_(XNM@J_K?8pcl9o1VglYyF!+d`jACNaj92i2Xz@#F(Q zPY)y#XS6oU!7yq!Zeiq+NJJ0>mSq!(1j8`J>xWLkG~x6O07578PY7&nK{^dnQ&4$J zKnNU%FPr?uV*VM1$z(EyVE}+(7#L&HxjSN21)uMXBoYB#2StIeUm+TWd-p(=VQZ_r z;<585gxE}>wSDNiju7H`p67X%WgE7I_wPZ|8mn4@C_-5l5)8u967288-Mb~z2!$XV zhA&^>^fVU=rA2`da-BAzv#{WgG4Aj0Z$9T$RTv$GA3vIEL=ehPFI+D8>o2%=?ToOi z3ua~@9)}-4N@kx<1IyNK-@^V8LI(#2&F8%FINZ4d2!X2B*o50amMu;%EYEW&3Z|z4 zW7yw^g9DIdxPHBM`xg97(oy#2 z&)mwKs50!p_O%^LfKC z(&@CLSfFX(^OZZTNCf`*$MN9okFM*4X_}%~_5Q<-|M>X0*X#BB{f=V6+8T_ElnW7p zP{?sE&}8mV1VvGnk4Q>d`dFt*fY(Ovj@|JOs1|_Jvw@FhN&oE^;+*-VQ2rzWO8tD z(DMBQ#;~*m-Q7?qKvx&2D*W+BUH!S;u)7OGLjVBZzeDRDvQ~v@n(1`9n%0g#$8i|r zfq{X__#cnMpMRE;lVYr@KScpF}fdNaoEQ8N?l9?go zj7B&NJ3FB3Fg4|%R-4d>|65&c%5G^I1OZIb!IEho9LIk_fT^iw*X{K5dE|EWz}XZK z0=v7V+qh=X-Q9wXO-ta6|MoUaPq%3#oq;p{JP*~6QZFU!?0daigIvpP^rB{ z-#=*8H_~?Bf2^&o`Fy@$Fh~d~8+TD+DKE9_P+q1geVjm1WnCPXFKR8@Io(uIUi|*0 zaJ5mi>~X(-{&BN78e%@A+KJ&qRwJzX-U(x&!0aRyFAAH{Cqy2 zUszZW1mU!Nd3iY=kH35OE}PAsZvVrF59{menx@Uq&ljl{vADQ6KR>T&+UDk_s;bBG z-QC?>F1NO}wz9Iay1IHS&*gIO-@pI(@uMV3-@bjT*r_ng0&2|BmCo$OEJF T9JK{U00000NkvXXu0mjf%Nj%? literal 0 HcmV?d00001 diff --git a/matlab/html/myfft3_01.png b/matlab/html/myfft3_01.png new file mode 100644 index 0000000000000000000000000000000000000000..840533fa4511bed3d8c9c8da25ff0835171e2ac8 GIT binary patch literal 26411 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 z z%Ka}u*8k_=b$?$_)`=XzGac-2Hdt5td ztbsuN2jc$xbT%-`gO9QQCV(9ZP|v{+%4M6ldQXCNjGI6Aq~y{8JQ_1C(^elsk9OA-y(| zNbB`kkQB`E$r2fj)Zr|Kfq}o?-#xL=4Jkm-E#&9tS5<8RgHjkZ3(}O&koAE_A`h*n zim|k`^!JzDD}6m37a!ky-UDt(ofRRR^E+E3r@sZnu4{gNPjhqotZ%2JYy-e{Y%BzH z{@~UiGQDd5VS1e>izhb5M!3ZQ5O(3ChE`U3VP~&Sg#*s=TQ4Ba<**~_X@Y>v1S1WV zupoRGt-GLQBrRD`Tznl6k@b5&NBndkYtI}ls?JL%`GU<-Z}*kVUQDshyy*;-Q69i zexswKH8xG8-OA91{!m5#cG1m9kadp|`4mY?+xahEcuzG(0JUxoD58o7Eptk7aZPKN zLclKsQWh`-WH#B{Q@Z}jxk;qbf(b);LGwJ2QsLp}>OT^HW;XllJUMgJTrp#H>aj{y z>TOWaxQMA$y@c-Du(#~xS-CSt)CxV|2I#CoPFFe*uV;XxyaqAWB!EZ{@dl`zwz9T9 z0KJ@|goM{@YjXG5O*m!MLT<+C_Qth}jtn^oSy}(S9Bm#R9{sZ$kU1Lxrw7&K4j(^d zw*|0sy?lLr$9&qw#M9gXesHO1qhi!kAjC_9k8>;O4k)^b)pf|Segj7JCtx5n@7+bB z;hRkJ=ILY91ukP_r!vjzf`G44bgJ4HpsXRjBS0}}GVEXv zj&O9Lo0XLnWOGIUoOk97m`DXf)upZK@^W9Wz^yw!+&rgFTRef^gwI2HJ5Twqde%_K zsj#Ep8V>dw_BToZ6b!gvwp%L=4E1&^wX6}(pAMctQFNe$AJ^3EKo_vSzQH=T*!SUl z{fdVIH-@r#wSpEja9d{pL%iVI_vlRJBpsTvcb;zH>sKy$-{X5`MS3j{r5Wotr~g|r zxb;A3i#2Mcjy1G|qWa9KFL;*KUag}b1Nlh|g7ox4q4-O%d~~92S=4=NlI>41zTY@C zX0yqNmb%-*8%VMsV*+PLS#@>b_$xp41dHhtWYMG7|0Z#8d(}<{;t#H`oS=-JJ24$B zcDf8_-J_PG4-y0CN7pNWL6M%G4lq{b^&Yj6_x(cE%c4dy)nWi1$Ed23j`Qoh-kB1n zoDMxjty_d&j_Uq z0Y&2{y_dnf_H{tGX8d`!qD;&sNber$%~=*b82vH-B*_W@xzH(mZ)+BRi%R3b?G$qW zdl_>1rX^N;eL50nK`96d#$B)I5?b7+>sw%a0xcsEgb#xP^mX7K;yoJ#-0iMS6rKb3 z{lxU9xr$S~icPB?4_GgeD9WhR&3+ddRdQWh4eD>;X$`fx!yedcJo|beabfTz;Gnu+%BCKv66?3Oy1w%Dqw_GVCA?QiluoB&Wmn=fXnN-rn45 zfEP8uB=&Kw6}Y^vGF*Wb59rWv-WdXgGsIzl2G*?l-E+Gwq~L`OMT2hA_dR4SG&SFX zxd5zR`dbq>RHR*`4S^d9gOAARmecDm6evsMQ1sHsazE#(mq@M6q?flw^i9fnW@6}M z!a(S@3$R4DtrU`KvGmD9&^^H63ioo0>y#S^1Fgbl{7;a!g_qzEbEf<~1imq9>%U`= zMiB*=m&wWV@j%yQWXw`kh2JVr)B8QOilG1h|6~O{-sKAy5jx*qQd7)rRyV~eG)lOet|gvB1ur?o*idch6N0i6uKD9JsH=OIjW?i$`d_3 zHq!S2W(mfvU;AE+2VVuhsOj!+=kahThw4~&ow0B5&xn(MaI3H|ufJ_;t@82lm!c(?ikfVue5%4xSLrAObZJ3jk> ztf(avp^H-?4H$m+j=Sp>T+8ceo0}A*5hbQ%TO?Ow$ycP$F~X%m1TyZKo_qb(t>ZVA z{exw=q~6BOhbV3C?3J*PZ+$3LBMmU)PrlbZS73a8Xv0_DvSdivROoh_A}@n>iW`CJ zo%iO>_~ORfPpg~$G%J=ixHI8x9QHRJUlC_ddiUBpb9fnXk1~QBfq<9+jX;!=lQSa_ vmq|%sof0Ma^LG_^uY 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 literal 0 HcmV?d00001 diff --git a/matlab/html/myfft3_03.png b/matlab/html/myfft3_03.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb4956c054ff7e1b89a0ad445c0ced5e0c13e3b GIT binary patch literal 13983 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 literal 0 HcmV?d00001 diff --git a/matlab/html/myfft3_06.png b/matlab/html/myfft3_06.png new file mode 100644 index 0000000000000000000000000000000000000000..b592bef020a34c65546773550fbdc856eba3094b GIT binary patch literal 14246 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 sfi(v,w,f) returns a signed fixed-point object with value v, word length w, and fraction length f. +Wr = sfi(real(W),data_length,data_length-2); +Wi = sfi(imag(W),data_length,data_length-2); + +st_real = sfi(real(stage) , data_length + 3 , 0); +st_imag = sfi(imag(stage) , data_length + 3 , 0); +% temp values for multiplaying with W twiddling factor +st_real_tmp = sfi(real(zeros(bits + 1,fftLength)) , data_length + 3 , 0); +st_imag_tmp = sfi(imag(zeros(bits + 1,fftLength)) , data_length + 3 , 0); + %% First stage -for i = 1 : 2^1 : fftLength +for n = 1 : 2^1 : fftLength % Even - stage(2,i) = stage(1,i) + stage(1,i+1); + stage(2,n) = stage(1,n) + stage(1,n+1); % Odd - stage(2,i+1) = stage(1,i) - stage(1,i+1); - + stage(2,n+1) = stage(1,n) - stage(1,n+1); +end + +% calculations using separate real and imaginary numbers +for n = 1 : 2^1 : fftLength + % Even + st_real(2,n) = st_real(1,n) + st_real(1,n+1); + % imag is 0 + % Odd + st_real(2,n+1) = st_real(1,n) - st_real(1,n+1); + % imag is 0 end %% Second stage % Calculating W twiddling factor -for i = 1 : 2 - Wn(i) = exp(-j * (i-1) * 2 * pi/ 4 ); +for n = 1 : 2 + Wn(n) = exp(-1i * (n-1) * 2 * pi/ 4 ); end % calculate next stage values -for i = 1 : 2^2 : fftLength +for n = 1 : 2^2 : fftLength % Even pair - stage(3,i+0) = stage(2,i+0) + Wn(1)*stage(2,i+2); - stage(3,i+1) = stage(2,i+1) + Wn(2)*stage(2,i+3); + stage(3,n+0) = stage(2,n+0) + Wn(1)*stage(2,n+2); + stage(3,n+1) = stage(2,n+1) + Wn(2)*stage(2,n+3); % Odd par - stage(3,i+2) = stage(2,i+0) - Wn(1)*stage(2,i+2); - stage(3,i+3) = stage(2,i+1) - Wn(2)*stage(2,i+3); + stage(3,n+2) = stage(2,n+0) - Wn(1)*stage(2,n+2); + stage(3,n+3) = stage(2,n+1) - Wn(2)*stage(2,n+3); end +% calculations using separate real and imaginary numbers +for n = 1 : 2^2 : fftLength + % Even pair + st_real(3,n+0) = st_real(2,n+0) + st_real(2,n+2); + % imag is 0 + st_real(3,n+1) = st_real(2,n+1) ; % real is 0 + st_imag(3,n+1) = -1 * st_real(2,n+3); % mult -j + % Odd par + st_real(3,n+2) = st_real(2,n+0) - st_real(2,n+2); + % imag is 0 + st_real(3,n+3) = st_real(2,n+1) ; % real is 0 + st_imag(3,n+3) = st_real(2,n+3); % mult -j +end + + %% Therd stage % Calculating W twiddling factor -for i = 1 : 4 - Wn(i) = exp(-j * (i-1) * 2 * pi/ 8 ); +for n = 1 : 4 + Wn(n) = exp(-1i * (n-1) * 2 * pi/ 8 ); end % calculate next stage values -for i = 1 : 2^3 : fftLength +for n = 1 : 2^3 : fftLength for k = 0 : 3 % Even pair - stage(4,i+k) = stage(3,i+k) + Wn(k+1)*stage(3,i+k+4); + stage(4,n+k) = stage(3,n+k) + Wn(k+1)*stage(3,n+k+4); % Odd par - stage(4,i+k+4) = stage(3,i+k) - Wn(k+1)*stage(3,i+k+4); + stage(4,n+k+4) = stage(3,n+k) - Wn(k+1)*stage(3,n+k+4); end end +% calculations using separate real and imaginary numbers +for n = 1 : 2^3 : fftLength + for k = 0 : 3 + st_real_tmp(3,n+k+4) = ( Wr(k*4+1) * st_real(3,n+k+4) ) - ( Wi(k*4+1) * st_imag(3,n+k+4) ); + st_imag_tmp(3,n+k+4) = ( Wi(k*4+1) * st_real(3,n+k+4) ) + ( Wr(k*4+1) * st_imag(3,n+k+4) ); + end +end +for n = 1 : 2^3 : fftLength + for k = 0 : 3 + % Even pair + st_real(4,n+k) = st_real(3,n+k) + st_real_tmp(3,n+k+4); + st_imag(4,n+k) = st_imag(3,n+k) + st_imag_tmp(3,n+k+4); + % Odd par + st_real(4,n+k+4) = st_real(3,n+k) - st_real_tmp(3,n+k+4); + st_imag(4,n+k+4) = st_imag(3,n+k) - st_imag_tmp(3,n+k+4); + end +end + + %% 4th stage % Calculating W twiddling factor -for i = 1 : 8 - Wn(i) = exp(-j * (i-1) * 2 * pi/ 16 ); +for n = 1 : 8 + Wn(n) = exp(-1i * (n-1) * 2 * pi/ 16 ); end % calculate next stage values -for i = 1 : 2^4 : fftLength +for n = 1 : 2^4 : fftLength for k = 0 : 7 % Even pair - stage(5,i+k) = stage(4,i+k) + Wn(k+1)*stage(4,i+k+8); + stage(5,n+k) = stage(4,n+k) + Wn(k+1)*stage(4,n+k+8); % Odd par - stage(5,i+k+8) = stage(4,i+k) - Wn(k+1)*stage(4,i+k+8); + stage(5,n+k+8) = stage(4,n+k) - Wn(k+1)*stage(4,n+k+8); + end +end + +% calculations using separate real and imaginary numbers +for n = 1 : 2^4 : fftLength + for k = 0 : 7 + st_real_tmp(4,n+k+8) = ( Wr(k*2+1) * st_real(4,n+k+8) ) - ( Wi(k*2+1) * st_imag(4,n+k+8) ); + st_imag_tmp(4,n+k+8) = ( Wi(k*2+1) * st_real(4,n+k+8) ) + ( Wr(k*2+1) * st_imag(4,n+k+8) ); + end +end +for n = 1 : 2^4 : fftLength + for k = 0 : 7 + % Even pair + st_real(5,n+k) = st_real(4,n+k) + st_real_tmp(4,n+k+8); + st_imag(5,n+k) = st_imag(4,n+k) + st_imag_tmp(4,n+k+8); + % Odd par + st_real(5,n+k+8) = st_real(4,n+k) - st_real_tmp(4,n+k+8); + st_imag(5,n+k+8) = st_imag(4,n+k) - st_imag_tmp(4,n+k+8); end end %% 5th stage % Calculating W twiddling factor -for i = 1 : 16 - Wn(i) = exp(-j * (i-1) * 2 * pi/ 32 ); +for n = 1 : 16 + Wn(n) = exp(-1i * (n-1) * 2 * pi/ 32 ); end % calculate next stage values -for i = 1 : 2^5 : fftLength +for n = 1 : 2^5 : fftLength for k = 0 : 15 % Even pair - stage(6,i+k) = stage(5,i+k) + Wn(k+1)*stage(5,i+k+16); + stage(6,n+k) = stage(5,n+k) + Wn(k+1)*stage(5,n+k+16); % Odd par - stage(6,i+k+16) = stage(5,i+k) - Wn(k+1)*stage(5,i+k+16); + stage(6,n+k+16) = stage(5,n+k) - Wn(k+1)*stage(5,n+k+16); end end +% calculations using separate real and imaginary numbers +for n = 1 : 2^5 : fftLength + for k = 0 : 15 + st_real_tmp(5,n+k+16) = ( Wr(k*1+1) * st_real(5,n+k+16) ) - ( Wi(k*1+1) * st_imag(5,n+k+16) ); + st_imag_tmp(5,n+k+16) = ( Wi(k*1+1) * st_real(5,n+k+16) ) + ( Wr(k*1+1) * st_imag(5,n+k+16) ); + end +end +for n = 1 : 2^5 : fftLength + for k = 0 : 15 + % Even pair + st_real(6,n+k) = st_real(5,n+k) + st_real_tmp(5,n+k+16); + st_imag(6,n+k) = st_imag(5,n+k) + st_imag_tmp(5,n+k+16); + % Odd par + st_real(6,n+k+16) = st_real(5,n+k) - st_real_tmp(5,n+k+16); + st_imag(6,n+k+16) = st_imag(5,n+k) - st_imag_tmp(5,n+k+16); + end +end + + %% Ploting out % slowly plot result figure(5) -for i = 1 : bits +1 +for n = 1 : bits +1 %plot( abs( real_n(i, :) + j.*imag_n(i, :) ) ); - plot( abs( stage(i,1:fftLength/2) ) ); - pause(1); + stem( abs( stage(n,1:fftLength/2) ) ); +% pause(1); end xt = xticks; % returns the current x-axis tick values as a vector fstep = fs/fftLength; % tick of f axis in f domain xtnew = round((xt-1)*fstep/1000, 1) ; % calculate new tick in kHz xticklabels(xtnew) % set new tick labels +title('FFT using custom function') +ylabel('magnitude'), xlabel('kHz') + +figure(6) +for n = 1 : bits +1 + %plot( abs( real_n(i, :) + j.*imag_n(i, :) ) ); + temp = st_real + 1i * st_imag; + stem( abs( temp(n,1:fftLength/2) ) ); +% pause(1); +end +xt = xticks; % returns the current x-axis tick values as a vector +fstep = fs/fftLength; % tick of f axis in f domain +xtnew = round((xt-1)*fstep/1000, 1) ; % calculate new tick in kHz +xticklabels(xtnew) % set new tick labels +title('FFT using custom function real/imag separate') +ylabel('magnitude'), xlabel('kHz') + +figure(7) +dif2 = 100* abs(temp(bits +1,1:fftLength/2) - ft(1:fftLength/2))./abs(ft(1:fftLength/2)) ; +plot(dif2, 'blue') +title('Difference in calculations') +xt = xticks; % returns the current x-axis tick values as a vector +fstep = fs/fftLength; % tick of f axis in f domain +xtnew = round((xt-1)*fstep/1000, 1) ; % calculate new tick in kHz +xticklabels(xtnew) % set new tick labels +ylabel('percents, %'), xlabel('kHz')