Troubleshooting FFT code with MATLAB

In summary, the individual is comparing their personal FFT class code to MatLab. Their test was successful in producing the same values in both programs. However, when comparing the FFT results, their code does not match MatLab's results.
  • #1
btb4198
572
10
ok I wrote my own FFT class and I now have MatLab on my computer. I am comparing my code to mat-lab.

so my test i used it this :

Code:
 for (int y = 0; y < 100; y++)
            {
                double temp8 = (2D * (Math.Sin(2D * Math.PI * 4D * (double)y / 100D)));
                buffer[y] = (float)temp8;      
            }
which in MatLab is this:
Code:
fo = 4;
 Fs = 100;
Ts = 1/Fs;
 0:Ts;1-Ts;
t = 0:Ts:1-Ts;
y = 2 * sin(2*pi*fo*t);

so that is working great, I am getting the same values in MatLab as in my program.

now the problem is the fft itself:

my code gets:

Code:
Real[ 0] =15.6438784003258
 Img[ 0] =0
 Real[ 1] =8.46128487984206
 Img[ 1] =1.40568933318413
 Real[ 2] =0
 Img[ 2] =0
 Real[ 3] =22.2310419428763
 Img[ 3] =5.40923846876197
 Real[ 4] =-1.80056660225914
 Img[ 4] =5.74956074821605
 Real[ 5] =0
 Img[ 5] =0
 Real[ 6] =-5.11379679263678
 Img[ 6] =-0.688387862482321
 Real[ 7] =-10.4312474863214
 Img[ 7] =-8.80658407162755
 Real[ 8] =0
 Img[ 8] =0
 Real[ 9] =7.79337236310158
 Img[ 9] =9.18587953709857
 Real[ 10] =-3.99240649537681
 Img[ 10] =-2.95715001320984
 Real[ 11] =0
 Img[ 11] =0
 Real[ 12] =-0.725325897426671
 Img[ 12] =0.363923889449184
 Real[ 13] =-3.48947495495046
 Img[ 13] =-3.17979218818627
 Real[ 14] =0
 Img[ 14] =0
 Real[ 15] =1.91405696078796
 Img[ 15] =1.41155752908299
 Real[ 16] =-4.65431128431017
 Img[ 16] =-2.55948892517805
 Real[ 17] =0
 Img[ 17] =0
 Real[ 18] =-2.66530083281111
 Img[ 18] =-3.2978120014703
 Real[ 19] =-2.18544418167612
 Img[ 19] =-3.16506874433514
 Real[ 20] =0
 Img[ 20] =0
 Real[ 21] =2.5183300759435
 Img[ 21] =3.27070622595888
 Real[ 22] =-1.91673308587846
 Img[ 22] =-4.28146090355363
 Real[ 23] =0
 Img[ 23] =0
 Real[ 24] =0
 Img[ 24] =0
 Real[ 25] =-0.127357929944991
 Img[ 25] =0.380064934492111
 Real[ 26] =-1.77076956563049
 Img[ 26] =-1.16238391836151
 Real[ 27] =0
 Img[ 27] =0
 Real[ 28] =1.33827428539545
 Img[ 28] =1.82705801865022
 Real[ 29] =-2.74387526172086
 Img[ 29] =1.6918766374459
 Real[ 30] =0
 Img[ 30] =0
 Real[ 31] =-1.23531162328276
 Img[ 31] =-0.344879676029618
 Real[ 32] =-0.490950246033762
 Img[ 32] =-2.50634463327099
 Real[ 33] =0
 Img[ 33] =0
 Real[ 34] =0.0616589288850338
 Img[ 34] =1.41281177829685
 Real[ 35] =-1.11021525078896
 Img[ 35] =-1.6384014200336
 Real[ 36] =0
 Img[ 36] =0
 Real[ 37] =-0.581764223242864
 Img[ 37] =-0.565565392364546
 Real[ 38] =-0.800557052119878
 Img[ 38] =0.24862692145541
 Real[ 39] =0
 Img[ 39] =0
 Real[ 40] =-0.155778218052648
 Img[ 40] =-4.08014192142325
 Real[ 41] =-1.59543284819159
 Img[ 41] =3.38035787631867
 Real[ 42] =0
 Img[ 42] =0
 Real[ 43] =-1.42509628490074
 Img[ 43] =-0.690852268756354
 Real[ 44] =-1.01489289175587
 Img[ 44] =1.30057672045934
 Real[ 45] =0
 Img[ 45] =0
 Real[ 46] =1.74167365638883
 Img[ 46] =-1.85709851794845
 Real[ 47] =-1.54097745212813
 Img[ 47] =-5.30373068481949
 Real[ 48] =0
 Img[ 48] =0
 Real[ 49] =0
 Img[ 49] =0
 Real[ 50] =0.124337077140807
 Img[ 50] =0
 Real[ 51] =-1.70945722097089
 Img[ 51] =0.765800478188799
 Real[ 52] =0
 Img[ 52] =0
 Real[ 53] =1.85429156562877
 Img[ 53] =1.52216544624097
 Real[ 54] =-3.37426422070059
 Img[ 54] =5.34550387538567
 Real[ 55] =0
 Img[ 55] =0
 Real[ 56] =-1.58324273924713
 Img[ 56] =0.709457373828966
 Real[ 57] =-0.509551690154068
 Img[ 57] =-4.13778842089745
 Real[ 58] =0
 Img[ 58] =0
 Real[ 59] =-0.111356595280117
 Img[ 59] =4.16938599825349
 Real[ 60] =-1.27006205100977
 Img[ 60] =-0.979250998498057
 Real[ 61] =0
 Img[ 61] =0
 Real[ 62] =-0.607477279265961
 Img[ 62] =0.474591108126309
 Real[ 63] =-0.789693160521237
 Img[ 63] =-0.304816584641161
 Real[ 64] =0
 Img[ 64] =0
 Real[ 65] =0.000684665428978715
 Img[ 65] =-1.22197350537954
 Real[ 66] =-1.43379200328076
 Img[ 66] =2.51523743989183
 Real[ 67] =0
 Img[ 67] =0
 Real[ 68] =-1.13493927974621
 Img[ 68] =-0.045628157166532
 Real[ 69] =-0.833622074048892
 Img[ 69] =0.249244154952255
 Real[ 70] =0
 Img[ 70] =0
 Real[ 71] =1.28236043172393
 Img[ 71] =-1.54307771477549
 Real[ 72] =-1.51791564293372
 Img[ 72] =-2.19078665228718
 Real[ 73] =0
 Img[ 73] =0
 Real[ 74] =0
 Img[ 74] =0
 Real[ 75] =-0.127357929944991
 Img[ 75] =-0.380064934492111
 Real[ 76] =-1.97025325016812
 Img[ 76] =2.00831845114145
 Real[ 77] =0
 Img[ 77] =0
 Real[ 78] =2.26040036086525
 Img[ 78] =-3.00689615389389
 Real[ 79] =-4.44019352391471
 Img[ 79] =8.29860006881245
 Real[ 80] =0
 Img[ 80] =0
 Real[ 81] =-2.58596181495194
 Img[ 81] =3.06647330142348
 Real[ 82] =-1.72270785043888
 Img[ 82] =0.11127351919887
 Real[ 83] =0
 Img[ 83] =0
 Real[ 84] =1.55682887842896
 Img[ 84] =-0.943199069986429
 Real[ 85] =-3.06412282603289
 Img[ 85] =1.05092164080382
 Real[ 86] =0
 Img[ 86] =0
 Real[ 87] =-0.856548737569082
 Img[ 87] =-0.272949605210947
 Real[ 88] =-3.91301515540254
 Img[ 88] =3.17141962717599
 Real[ 89] =0
 Img[ 89] =0
 Real[ 90] =6.30989470522789
 Img[ 90] =-8.7777282723593
 Real[ 91] =-10.2918483227761
 Img[ 91] =8.89927095595156
 Real[ 92] =0
 Img[ 92] =0
 Real[ 93] =-5.63808404993432
 Img[ 93] =1.29162929065268
 Real[ 94] =-12.8829923493748
 Img[ 94] =5.99948970692771
 Real[ 95] =0
 Img[ 95] =0
 Real[ 96] =20.9099985289662
 Img[ 96] =-6.77868784657761
 Real[ 97] =17.9336785221511
 Img[ 97] =-9.01871999661001
 Real[ 98] =0
 Img[ 98] =0
 Real[ 99] =0
 Img[ 99] =0

and this is what Mat Lab has

Code:
YfreqDomain =

   1.0e+02 *

  Columns 1 through 2

   0.0000 + 0.0000i  -0.0000 + 0.0000i

  Columns 3 through 4

  -0.0000 - 0.0000i   0.0000 + 0.0000i

  Columns 5 through 6

  -0.0000 - 1.0000i   0.0000 - 0.0000i

  Columns 7 through 8

   0.0000 - 0.0000i   0.0000 + 0.0000i

  Columns 9 through 10

   0.0000 - 0.0000i   0.0000 + 0.0000i

  Columns 11 through 12

  -0.0000 - 0.0000i   0.0000 - 0.0000i

  Columns 13 through 14

   0.0000 - 0.0000i  -0.0000 - 0.0000i

  Columns 15 through 16

   0.0000 - 0.0000i   0.0000 + 0.0000i

  Columns 17 through 18

  -0.0000 + 0.0000i   0.0000 + 0.0000i

  Columns 19 through 20

  -0.0000 + 0.0000i   0.0000 - 0.0000i

  Columns 21 through 22

  -0.0000 + 0.0000i  -0.0000 + 0.0000i

  Columns 23 through 24

   0.0000 - 0.0000i   0.0000 + 0.0000i

  Columns 25 through 26

  -0.0000 - 0.0000i   0.0000 + 0.0000i

  Columns 27 through 28

   0.0000 - 0.0000i  -0.0000 - 0.0000i

  Columns 29 through 30

   0.0000 + 0.0000i  -0.0000 + 0.0000i

  Columns 31 through 32

  -0.0000 + 0.0000i   0.0000 + 0.0000i

  Columns 33 through 34

  -0.0000 + 0.0000i  -0.0000 - 0.0000i

  Columns 35 through 36

   0.0000 - 0.0000i   0.0000 - 0.0000i

  Columns 37 through 38

   0.0000 + 0.0000i  -0.0000 - 0.0000i

  Columns 39 through 40

  -0.0000 - 0.0000i   0.0000 + 0.0000i

  Columns 41 through 42

   0.0000 + 0.0000i  -0.0000 + 0.0000i

  Columns 43 through 44

   0.0000 - 0.0000i   0.0000 + 0.0000i

  Columns 45 through 46

  -0.0000 + 0.0000i  -0.0000 + 0.0000i

  Columns 47 through 48

  -0.0000 - 0.0000i  -0.0000 - 0.0000i

  Columns 49 through 50

  -0.0000 - 0.0000i   0.0000 - 0.0000i

  Columns 51 through 52

   0.0000 + 0.0000i   0.0000 + 0.0000i

  Columns 53 through 54

  -0.0000 + 0.0000i  -0.0000 + 0.0000i

  Columns 55 through 56

  -0.0000 + 0.0000i  -0.0000 - 0.0000i

  Columns 57 through 58

  -0.0000 - 0.0000i   0.0000 - 0.0000i

  Columns 59 through 60

   0.0000 + 0.0000i  -0.0000 - 0.0000i

  Columns 61 through 62

   0.0000 - 0.0000i   0.0000 - 0.0000i

  Columns 63 through 64

  -0.0000 + 0.0000i  -0.0000 + 0.0000i

  Columns 65 through 66

   0.0000 - 0.0000i   0.0000 + 0.0000i

  Columns 67 through 68

   0.0000 + 0.0000i  -0.0000 + 0.0000i

  Columns 69 through 70

  -0.0000 - 0.0000i   0.0000 - 0.0000i

  Columns 71 through 72

  -0.0000 - 0.0000i  -0.0000 - 0.0000i

  Columns 73 through 74

   0.0000 - 0.0000i  -0.0000 + 0.0000i

  Columns 75 through 76

   0.0000 + 0.0000i   0.0000 - 0.0000i

  Columns 77 through 78

  -0.0000 + 0.0000i   0.0000 - 0.0000i

  Columns 79 through 80

   0.0000 + 0.0000i  -0.0000 - 0.0000i

  Columns 81 through 82

  -0.0000 - 0.0000i   0.0000 + 0.0000i

  Columns 83 through 84

  -0.0000 - 0.0000i   0.0000 - 0.0000i

  Columns 85 through 86

  -0.0000 + 0.0000i   0.0000 - 0.0000i

  Columns 87 through 88

   0.0000 + 0.0000i  -0.0000 + 0.0000i

  Columns 89 through 90

   0.0000 + 0.0000i   0.0000 + 0.0000i

  Columns 91 through 92

  -0.0000 + 0.0000i   0.0000 - 0.0000i

  Columns 93 through 94

   0.0000 + 0.0000i   0.0000 - 0.0000i

  Columns 95 through 96

   0.0000 + 0.0000i   0.0000 + 0.0000i

  Columns 97 through 98

  -0.0000 + 1.0000i   0.0000 - 0.0000i

  Columns 99 through 100

  -0.0000 + 0.0000i  -0.0000 - 0.0000i

so how should I go about troubleshooting my c# fft code?

is there a way to get Matlab to print out the steps it is during where it does the FFT?

is there a better way of troubleshooting my ftt code ?
 
Physics news on Phys.org
  • #2
btb4198 said:
so how should I go about troubleshooting my c# fft code?
Start with very short sequences, such as y[0]=1, y[1]=0 or y[0]=i, y[1]=0, and build up from there.

btb4198 said:
is there a way to get Matlab to print out the steps it is during where it does the FFT?
No. Even if it were possible, I don't see how you could get useful information from that.
 
  • #3
As DrClaude said, test with an impulse and then figure out why you get the wrong answer. With a short impulse you can go step by step by hand. Do you have a standalone c program that you started from that works? Can you compare intermediate results with that?
 
  • #4
but I do not know what the outcome of that sequence should be...
 
  • #5
btb4198 said:
but I do not know what the outcome of that sequence should be...

You can calculate it by hand or use Matlab.
 
  • #6
ok i did

y = 1,0,i,0

math lab got :
Code:
YfreqDomain =

  Columns 1 through 3

   1.0000 + 1.0000i   1.0000 - 1.0000i   1.0000 + 1.0000i

  Column 4

   1.0000 - 1.0000i
by hand I got the same as math lab
and my code got:
Code:
 Real[ 0] =1
 Img[ 0] =0
 Real[ 1] =1
 Img[ 1] =0
 Real[ 2] =0
 Img[ 2] =0
 Real[ 3] =1
 Img[ 3] =0

i walk in the code and I think the problem is here
Code:
            Y_Even = FFT(even);
           Y_Odd = FFT(odd);
           polar1 temp4;
           for (int k = 0; k < (N2 / 2); k++)
           {
               temp4 = Complex1(k, N2);
               X[k].real = Y_Even[k].real + (Y_Odd[k].real * temp4.real);
               X[k + (N2 / 2)].real = Y_Even[k].real - (Y_Odd[k].real * temp4.real);  
               X[k].img = Y_Even[k].img + (Y_Odd[k].real * temp4.img);
                X[k + (N2 / 2)].img = Y_Even[k].img - (Y_Odd[k].real * temp4.img);
               }
return x;
I am not sure how to fix it.
that is after I get a0 and a2 alone and add then and subject them .
the 1st time we get to that code it should be
x(0) = a0 + a2 = 1 + i
x(1)= a0 - a2 = 1 - i
right?
but i am getting
x(0) = 1
x(0) = 1
I think it is because the temp4 is wrong..
the 1st Complex1 is called is returns 1

but I do not know how to fix it
here is the function
Code:
  public polar1 Complex1(int K, int N3)
        {
           polar1 temp;
            double temp1;
            temp1 = (2D * Math.PI *K) / N3;
                    temp.real =  Math.Cos(temp1);
                    temp.img =  Math.Sin(temp1);
            return temp;

        }
but I am not sure
can you help
I know it is something wrong with that part of the code
 
  • #7
in fft

does WKN = (e-i (2π/N))K

where K is the x[K] or the index of that point
and N is the over all number of samples taking
I am new to FFT and I am not sure if I am right
 
  • #8
can someone please tell me how to get WKn?

when you are doing a 8 or a 4 point

say you have x = [ 2 , 1, -1, -3, 0, 1 ,2 , 1]

x[0] 2 2
butterfly diagram
x[4] 0 2



x[2] -1 1
butterfly diagram
x[6] 2 -3

ok now how do you get 1 and -3 ?
(-1 + 6 W68) right ? and that should be a i?
can someone please help me
I am so lost right now
 
  • #10
I would focus on the DC component. Your code is producing a DC component of 15.64. The FFT is indicating 0 DC. The DC component is just the mean value of the waveform samples. Walk through your code and see if you can see why that is happening.
 
  • #11
I need to know how Wkn
is pick or set..
my code works but only for 4 points and I can only do 4 points by hand
i need to know
how k and n or know for the W
i can see it if i look up a picture of a butterflies diagram on Google
but I do not know how they pick/know what k and n is along the butterflies diagram
can someone please help me??
can someone please explain that to me?
 
  • #12
I didn't realize you had another thread on this.
btb4198 said:
ok i did

y = 1,0,i,0

math lab got :
Code:
YfreqDomain =

  Columns 1 through 3

   1.0000 + 1.0000i   1.0000 - 1.0000i   1.0000 + 1.0000i

  Column 4

   1.0000 - 1.0000i
by hand I got the same as math lab
and my code got:
Code:
 Real[ 0] =1
 Img[ 0] =0
 Real[ 1] =1
 Img[ 1] =0
 Real[ 2] =0
 Img[ 2] =0
 Real[ 3] =1
 Img[ 3] =0
How are you seeing these as the same?
Matlab results (1 through 4)
1.0000 + 1.0000i
1.0000 - 1.0000i
1.0000 + 1.0000i
1.0000 - 1.0000i

Your results (1 through 4)
1 + 1i OK
1 + 0i Different
0 + 0i Different
1 + 0i Different

It might be easier to spot the differences if you format the two sets of results in the same way.
 

1. How do I troubleshoot my FFT code in MATLAB?

To troubleshoot your FFT code in MATLAB, you should start by checking your input data and making sure it is in the correct format. Then, check for any errors in your code, such as typos or missing variables. You can also use the debugger tool to step through your code and identify any issues. Additionally, you can compare your code to examples or tutorials online to see if there are any discrepancies.

2. Why am I getting incorrect results from my FFT code in MATLAB?

There are a few possible reasons for incorrect results from your FFT code in MATLAB. First, make sure your input data is accurate and in the correct format. Next, check for any errors in your code, such as using the wrong function or forgetting to include necessary operations. It is also possible that your code is using incorrect parameters or settings for the FFT function. You may need to consult the MATLAB documentation or seek help from other users to troubleshoot further.

3. How can I optimize the performance of my FFT code in MATLAB?

To optimize the performance of your FFT code in MATLAB, you can experiment with different parameters and settings for the FFT function. This includes the size of your input data, the windowing function used, and the options for the FFT algorithm. You can also try using the parallel computing toolbox or optimizing your code for vectorization to speed up calculations.

4. What should I do if my FFT code in MATLAB is taking a long time to run?

If your FFT code in MATLAB is taking a long time to run, there are a few things you can try. First, check for any inefficiencies or unnecessary operations in your code that could be slowing it down. You can also try optimizing your code for vectorization or using the parallel computing toolbox to speed up calculations. Additionally, you can try using a faster computer or running your code on a cluster or cloud computing platform.

5. How can I visualize the results of my FFT code in MATLAB?

To visualize the results of your FFT code in MATLAB, you can use the plot function to create a graph of your data. You can also use other visualization tools in MATLAB, such as the spectrogram function, to display the frequency content of your signal. Additionally, you can export your results to other software programs, such as Excel or Python, for further analysis and visualization.

Similar threads

  • MATLAB, Maple, Mathematica, LaTeX
Replies
16
Views
2K
Replies
3
Views
2K
  • Engineering and Comp Sci Homework Help
Replies
3
Views
2K
  • Engineering and Comp Sci Homework Help
Replies
3
Views
2K
  • Engineering and Comp Sci Homework Help
Replies
6
Views
2K
  • General Discussion
Replies
18
Views
11K
Replies
1
Views
1K
  • Programming and Computer Science
2
Replies
41
Views
4K
Replies
6
Views
1K
  • Engineering and Comp Sci Homework Help
Replies
12
Views
2K
Back
Top