解释和绘制FFT结果

时间:2018-01-29 10:55:39

标签: c# math signal-processing fft

我正在尝试对从振动传感器获得的一些信号进行FFT。我的问题是我的输出错误或者我对输出的解释是错误的。

我正在使用Paul Bourke的FFT算法:

public static void FFT(short dir, int m, double[] x, double[] y) 
{ 
    int n, i, i1, j, k, i2, l, l1, l2; 
    double c1, c2, tx, ty, t1, t2, u1, u2, z; 

    // Calculate the number of points 

    n = 1; 

    for (i = 0; i < m; i++) 
        n *= 2; 

    // Do the bit reversal 

    i2 = n >> 1; 
    j = 0; 
    for (i = 0; i < n - 1; i++) 
    { 
        if (i < j) 
        { 
            tx = x[i]; 
            ty = y[i]; 
            x[i] = x[j]; 
            y[i] = y[j]; 
            x[j] = tx; 
            y[j] = ty; 
        } 
        k = i2; 

        while (k <= j) 
        { 
            j -= k; 
            k >>= 1; 
        } 

        j += k; 
    } 

    // Compute the FFT 

    c1 = -1.0; 
    c2 = 0.0; 
    l2 = 1; 

    for (l = 0; l < m; l++) 
    { 
        l1 = l2; 
        l2 <<= 1; 
        u1 = 1.0; 
        u2 = 0.0; 

        for (j = 0; j < l1; j++) 
        { 
            for (i = j; i < n; i += l2) 
            { 
                i1 = i + l1; 
                t1 = u1 * x[i1] - u2 * y[i1]; 
                t2 = u1 * y[i1] + u2 * x[i1]; 
                x[i1] = x[i] - t1; 
                y[i1] = y[i] - t2; 
                x[i] += t1; 
                y[i] += t2; 
            } 

            z = u1 * c1 - u2 * c2; 
            u2 = u1 * c2 + u2 * c1; 
            u1 = z; 
        } 

        c2 = Math.Sqrt((1.0 - c1) / 2.0); 

        if (dir == 1) 
            c2 = -c2; 

        c1 = Math.Sqrt((1.0 + c1) / 2.0); 
    } 

    // Scaling for forward transform 

    if (dir == 1) 
    { 
        for (i = 0; i < n; i++) 
        { 
            x[i] /= n; 
            y[i] /= n; 
        } 
    } 
}

要绘制Frequenzy/Amplitude Graph我从Im-和Re-Parts中计算Frequenzy和Amplitude数组:

public double[] Frequency(Vector2XYArray input, float intervall)//FrequenzArray of the Inputs
{ 
    int i = 0; //Position in array
    double Fs = 1 / intervall; //sampling rate in Hz
    int size = input.Count; //size of the  input
    double[] output = new double[size];
    foreach(var line in input)
    {
        double frequenzy = i * Fs / size; 
        //double frequenzy = i * Fs / (size / 2 - 1);
        output[i] = frequenzy;
        i++;
    }
    return output;
}

public double[] Magnitude(Vector2XYArray input) // Calculate Magnitude
{
    double[] output = new double[input.Count];
    int i = 0;//orginal 0
    foreach (var line in input)
    {
        output[i] = Math.Sqrt(line.X * line.X + line.Y * line.Y);
        i++;
    }       
    return output;
}

例如,我计算了正弦波的FFT。这是输入:

和输出:

这就是我的预期:

Something like this。 这是输入数据:

0 0
0.03142 0.03141
0.06283 0.06279
0.09425 0.09411
0.12566 0.12533
0.15708 0.15643
0.1885 0.18738
0.21991 0.21814
0.25133 0.24869
0.28274 0.27899
0.31416 0.30902
0.34558 0.33874
0.37699 0.36812
0.40841 0.39715
0.43982 0.42578
0.47124 0.45399
0.50265 0.48175
0.53407 0.50904
0.56549 0.53583
0.5969 0.56208
0.62832 0.58779
0.65973 0.61291
0.69115 0.63742
0.72257 0.66131
0.75398 0.68455
0.7854 0.70711
0.81681 0.72897
0.84823 0.75011
0.87965 0.77051
0.91106 0.79016
0.94248 0.80902
0.97389 0.82708
1.00531 0.84433
1.03673 0.86074
1.06814 0.87631
1.09956 0.89101
1.13097 0.90483
1.16239 0.91775
1.19381 0.92978
1.22522 0.94088
1.25664 0.95106
1.28805 0.96029
1.31947 0.96858
1.35088 0.97592
1.3823 0.98229
1.41372 0.98769
1.44513 0.99211
1.47655 0.99556
1.50796 0.99803
1.53938 0.99951
1.5708 1
1.60221 0.99951
1.63363   0.99803
1.66504   0.99556
1.69646   0.99211
1.72788   0.98769
1.75929   0.98229
1.79071   0.97592
1.82212   0.96858
1.85354   0.96029
1.88496   0.95106
1.91637   0.94088
1.94779   0.92978
1.9792   0.91775
2.01062   0.90483
2.04204   0.89101
2.07345   0.87631
2.10487   0.86074
2.13628   0.84433
2.1677   0.82708
2.19911  0.80902
2.23053  0.79016
2.26195   0.77051
2.29336   0.75011
2.32478   0.72897
2.35619   0.70711
2.38761   0.68455
2.41903   0.66131
2.45044   0.63742
2.48186   0.61291
2.51327   0.58779
2.54469   0.56208
2.57611   0.53583
2.60752   0.50904
2.63894   0.48175
2.67035   0.45399
2.70177   0.42578
2.73319   0.39715
2.7646   0.36812
2.79602   0.33874
2.82743   0.30902
2.85885   0.27899
2.89027   0.24869
2.92168   0.21814
2.9531   0.18738
2.98451   0.15643
3.01593   0.12533
3.04734   0.09411
3.07876   0.06279
3.11018   0.03141
3.14159   0
3.17301   -0.03141
3.20442   -0.06279
3.23584   -0.09411
3.26726   -0.12533
3.29867   -0.15643
3.33009   -0.18738
3.3615   -0.21814
3.39292   -0.24869
3.42434   -0.27899
3.45575   -0.30902
3.48717   -0.33874
3.51858   -0.36812
3.55   -0.39715
3.58142   -0.42578
3.61283   -0.45399
3.64425   -0.48175
3.67566   -0.50904
3.70708   -0.53583
3.7385   -0.56208
3.76991   -0.58779
3.80133   -0.61291
3.83274   -0.63742
3.86416   -0.66131
3.89557   -0.68455
3.92699   -0.70711
3.95841   -0.72897
3.98982   -0.75011
4.02124   -0.77051
4.05265   -0.79016
4.08407   -0.80902
4.11549   -0.82708
4.1469   -0.84433
4.17832   -0.86074
4.20973   -0.87631
4.24115   -0.89101
4.27257   -0.90483
4.30398   -0.91775
4.3354   -0.92978
4.36681   -0.94088
4.39823   -0.95106
4.42965   -0.96029
4.46106   -0.96858
4.49248   -0.97592
4.52389   -0.98229
4.55531   -0.98769
4.58673   -0.99211
4.61814   -0.99556
4.64956   -0.99803
4.68097   -0.99951
4.71239   -1
4.7438   -0.99951
4.77522   -0.99803
4.80664   -0.99556
4.83805   -0.99211
4.86947   -0.98769
4.90088   -0.98229
4.9323   -0.97592
4.96372   -0.96858
4.99513   -0.96029
5.02655   -0.95106
5.05796   -0.94088
5.08938   -0.92978
5.1208   -0.91775
5.15221   -0.90483
5.18363   -0.89101
5.21504   -0.87631
5.24646   -0.86074
5.27788   -0.84433
5.30929   -0.82708
5.34071   -0.80902
5.37212   -0.79016
5.40354   -0.77051
5.43496   -0.75011
5.46637   -0.72897
5.49779   -0.70711
5.5292   -0.68455
5.56062   -0.66131
5.59203   -0.63742
5.62345   -0.61291
5.65487   -0.58779
5.68628   -0.56208
5.7177   -0.53583
5.74911   -0.50904
5.78053   -0.48175
5.81195   -0.45399
5.84336   -0.42578
5.87478   -0.39715
5.90619   -0.36812
5.93761   -0.33874
5.96903   -0.30902
6.00044   -0.27899
6.03186   -0.24869
6.06327   -0.21814
6.09469   -0.18738
6.12611   -0.15643
6.15752   -0.12533
6.18894   -0.09411
6.22035   -0.06279
6.25177   -0.03141
6.28319   0

这里是我的FFt的输出,其中包括重新组合部分:

[0]     {[ X      64.500000000000  Y       0.404150873423 ]}
[1]     {[ X      -0.278555512428  Y      20.092735290527 ]}
[2]     {[ X      -0.427216023207  Y      10.135166168213 ]}
[3]     {[ X      -0.454415380955  Y       6.762391567230 ]}
[4]     {[ X      -0.466557115316  Y       5.069226741791 ]}
[5]     {[ X      -0.473544538021  Y       4.050390243530 ]}
[6]     {[ X      -0.478114247322  Y       3.369287729263 ]}
[7]     {[ X      -0.481347471476  Y       2.881366968155 ]}
[8]     {[ X      -0.483760744333  Y       2.514262914658 ]}
[9]     {[ X      -0.485634654760  Y       2.227739095688 ]}
[10]    {[ X      -0.487134367228  Y       1.997638821602 ]}
[11]    {[ X      -0.488363116980  Y       1.808581709862 ]}
[12]    {[ X      -0.489389568567  Y       1.650311112404 ]}
[13]    {[ X      -0.490261167288  Y       1.515723109245 ]}
[14]    {[ X      -0.491011261940  Y       1.399742126465 ]}
[15]    {[ X      -0.491664320230  Y       1.298645377159 ]}
[16]    {[ X      -0.492238879204  Y       1.209639668465 ]}
[17]    {[ X      -0.492749184370  Y       1.130587935448 ]}
[18]    {[ X      -0.493205547333  Y       1.059828639030 ]}
[19]    {[ X      -0.493616372347  Y       0.996048748493 ]}
[20]    {[ X      -0.493989378214  Y       0.938197791576 ]}
[21]    {[ X      -0.494329094887  Y       0.885425508022 ]}
[22]    {[ X      -0.494640737772  Y       0.837034225464 ]}
[23]    {[ X      -0.494927674532  Y       0.792449653149 ]}
[24]    {[ X      -0.495193183422  Y       0.751191437244 ]}
[25]    {[ X      -0.495440214872  Y       0.712855517864 ]}
[26]    {[ X      -0.495669990778  Y       0.677102446556 ]}
[27]    {[ X      -0.495885282755  Y       0.643638551235 ]}
[28]    {[ X      -0.496086686850  Y       0.612215101719 ]}
[29]    {[ X      -0.496277689934  Y       0.582615792751 ]}
[30]    {[ X      -0.496457248926  Y       0.554655015469 ]}
[31]    {[ X      -0.496627360582  Y       0.528167366982 ]}
[32]    {[ X      -0.496789306402  Y       0.503011226654 ]}
[33]    {[ X      -0.496942907572  Y       0.479060232639 ]}
[34]    {[ X      -0.497089982033  Y       0.456202059984 ]}
[35]    {[ X      -0.497230142355  Y       0.434339284897 ]}
[36]    {[ X      -0.497365087271  Y       0.413383096457 ]}
[37]    {[ X      -0.497494697571  Y       0.393253803253 ]}
[38]    {[ X      -0.497618973255  Y       0.373881310225 ]}
[39]    {[ X      -0.497739076614  Y       0.355201095343 ]}
[40]    {[ X      -0.497855097055  Y       0.337155520916 ]}
[41]    {[ X      -0.497966945171  Y       0.319692194462 ]}
[42]    {[ X      -0.498075932264  Y       0.302763164043 ]}
[43]    {[ X      -0.498181402683  Y       0.286324679852 ]}
[44]    {[ X      -0.498284250498  Y       0.270337581635 ]}
[45]    {[ X      -0.498384326696  Y       0.254763960838 ]}
[46]    {[ X      -0.498481482267  Y       0.239570736885 ]}
[47]    {[ X      -0.498577028513  Y       0.224725276232 ]}
[48]    {[ X      -0.498670279980  Y       0.210199967027 ]}
[49]    {[ X      -0.498761832714  Y       0.195966750383 ]}
[50]    {[ X      -0.498851388693  Y       0.182000353932 ]}
[51]    {[ X      -0.498939424753  Y       0.168277233839 ]}
[52]    {[ X      -0.499026447535  Y       0.154774993658 ]}
[53]    {[ X      -0.499111831188  Y       0.141471460462 ]}
[54]    {[ X      -0.499196022749  Y       0.128347560763 ]}
[55]    {[ X      -0.499279111624  Y       0.115384347737 ]}
[56]    {[ X      -0.499361395836  Y       0.102562248707 ]}
[57]    {[ X      -0.499442815781  Y       0.089865408838 ]}
[58]    {[ X      -0.499524056911  Y       0.077276006341 ]}
[59]    {[ X      -0.499603927135  Y       0.064778119326 ]}
[60]    {[ X      -0.499683767557  Y       0.052354805171 ]}
[61]    {[ X      -0.499763309956  Y       0.039992045611 ]}
[62]    {[ X      -0.499842256308  Y       0.027673484758 ]}
[63]    {[ X      -0.499921083450  Y       0.015384667553 ]}
[64]    {[ X      -0.500000000000  Y       0.003110077232 ]}
[65]    {[ X      -0.500078916550  Y      -0.009163955227 ]}
[66]    {[ X      -0.500157713890  Y      -0.021453363821 ]}
[67]    {[ X      -0.500236690044  Y      -0.033772386611 ]}
[68]    {[ X      -0.500316202641  Y      -0.046136599034 ]}
[69]    {[ X      -0.500396072865  Y      -0.058560118079 ]}
[70]    {[ X      -0.500475943089  Y      -0.071059986949 ]}
[71]    {[ X      -0.500557184219  Y      -0.083651058376 ]}
[72]    {[ X      -0.500638604164  Y      -0.096350118518 ]}
[73]    {[ X      -0.500720918179  Y      -0.109173156321 ]}
[74]    {[ X      -0.500803947449  Y      -0.122139394283 ]}
[75]    {[ X      -0.500888168812  Y      -0.135265812278 ]}
[76]    {[ X      -0.500973582268  Y      -0.148571684957 ]}
[77]    {[ X      -0.501060605049  Y      -0.162078142166 ]}
[78]    {[ X      -0.501148641109  Y      -0.175805360079 ]}
[79]    {[ X      -0.501238167286  Y      -0.189775809646 ]}
[80]    {[ X      -0.501329720020  Y      -0.204013600945 ]}
[81]    {[ X      -0.501422941685  Y      -0.218544244766 ]}
[82]    {[ X      -0.501518487930  Y      -0.233394041657 ]}
[83]    {[ X      -0.501615643501  Y      -0.248593732715 ]}
[84]    {[ X      -0.501715779305  Y      -0.264173567295 ]}
[85]    {[ X      -0.501818597317  Y      -0.280168324709 ]}
[86]    {[ X      -0.501924037933  Y      -0.296613782644 ]}
[87]    {[ X      -0.502033054829  Y      -0.313550800085 ]}
[88]    {[ X      -0.502144873142  Y      -0.331023126841 ]}
[89]    {[ X      -0.502260923386  Y      -0.349078357220 ]}
[90]    {[ X      -0.502381026745  Y      -0.367769241333 ]}
[91]    {[ X      -0.502505302429  Y      -0.387153834105 ]}
[92]    {[ X      -0.502634882927  Y      -0.407295674086 ]}
[93]    {[ X      -0.502769887447  Y      -0.428266674280 ]}
[94]    {[ X      -0.502910017967  Y      -0.450145125389 ]}
[95]    {[ X      -0.503057062626  Y      -0.473018914461 ]}
[96]    {[ X      -0.503210723400  Y      -0.496988743544 ]}
[97]    {[ X      -0.503372609615  Y      -0.522165477276 ]}
[98]    {[ X      -0.503542780876  Y      -0.548675000668 ]}
[99]    {[ X      -0.503722310066  Y      -0.576662123203 ]}
[100]   {[ X      -0.503913283348  Y      -0.606288433075 ]}
[101]   {[ X      -0.504114747047  Y      -0.637743055820 ]}
[102]   {[ X      -0.504329979420  Y      -0.671241462231 ]}
[103]   {[ X      -0.504559814930  Y      -0.707035362720 ]}
[104]   {[ X      -0.504806816578  Y      -0.745414316654 ]}
[105]   {[ X      -0.505072295666  Y      -0.786722958088 ]}
[106]   {[ X      -0.505359232426  Y      -0.831364929676 ]}
[107]   {[ X      -0.505670905113  Y      -0.879821360111 ]}
[108]   {[ X      -0.506010591984  Y      -0.932670652866 ]}
[109]   {[ X      -0.506383597851  Y      -0.990610063076 ]}
[110]   {[ X      -0.506794452667  Y      -1.054493665695 ]}
[111]   {[ X      -0.507250845432  Y      -1.125375986099 ]}
[112]   {[ X      -0.507761120796  Y      -1.204573869705 ]}
[113]   {[ X      -0.508335649967  Y      -1.293757200241 ]}
[114]   {[ X      -0.508988738060  Y      -1.395070672035 ]}
[115]   {[ X      -0.509738802910  Y      -1.511319994926 ]}
[116]   {[ X      -0.510610461235  Y      -1.646247148514 ]}
[117]   {[ X      -0.511636853218  Y      -1.804953932762 ]}
[118]   {[ X      -0.512865602970  Y      -1.994584918022 ]}
[119]   {[ X      -0.514365315437  Y      -2.225463151932 ]}
[120]   {[ X      -0.516239285469  Y      -2.513076543808 ]}
[121]   {[ X      -0.518652498722  Y      -2.881775140762 ]}
[122]   {[ X      -0.521885752678  Y      -3.372164726257 ]}
[123]   {[ X      -0.526455461979  Y      -4.057395458221 ]}
[124]   {[ X      -0.533442914486  Y      -5.083943843842 ]}
[125]   {[ X      -0.545584619045  Y      -6.794277667999 ]}
[126]   {[ X      -0.572783946991  Y     -10.220301628113 ]}
[127]   {[ X      -0.721444487572  Y     -20.642747879028 ]}
[128]   {[ X     129.000000000000  Y      -0.790160000324 ]}
[129]   {[ X     130.000000000000  Y      -0.809019982815 ]}
[130]   {[ X     131.000000000000  Y      -0.827080011368 ]}
[131]   {[ X     132.000000000000  Y      -0.844330012798 ]}
[132]   {[ X     133.000000000000  Y      -0.860740005970 ]}
[133]   {[ X     134.000000000000  Y      -0.876309990883 ]}
[134]   {[ X     135.000000000000  Y      -0.891009986401 ]}
[135]   {[ X     136.000000000000  Y      -0.904829978943 ]}
[136]   {[ X     137.000000000000  Y      -0.917750000954 ]}
[137]   {[ X     138.000000000000  Y      -0.929780006409 ]}
[138]   {[ X     139.000000000000  Y      -0.940880000591 ]}
[139]   {[ X     140.000000000000  Y      -0.951059997082 ]}
[140]   {[ X     141.000000000000  Y      -0.960290014744 ]}
[141]   {[ X     142.000000000000  Y      -0.968580007553 ]}
[142]   {[ X     143.000000000000  Y      -0.975920021534 ]}
[143]   {[ X     144.000000000000  Y      -0.982290029526 ]}
[144]   {[ X     145.000000000000  Y      -0.987689971924 ]}
[145]   {[ X     146.000000000000  Y      -0.992110013962 ]}
[146]   {[ X     147.000000000000  Y      -0.995559990406 ]}
[147]   {[ X     148.000000000000  Y      -0.998030006886 ]}
[148]   {[ X     149.000000000000  Y      -0.999509990215 ]}
[149]   {[ X     150.000000000000  Y      -1.000000000000 ]}
[150]   {[ X     151.000000000000  Y      -0.999509990215 ]}
[151]   {[ X     152.000000000000  Y      -0.998030006886 ]}
[152]   {[ X     153.000000000000  Y      -0.995559990406 ]}
[153]   {[ X     154.000000000000  Y      -0.992110013962 ]}
[154]   {[ X     155.000000000000  Y      -0.987689971924 ]}
[155]   {[ X     156.000000000000  Y      -0.982290029526 ]}
[156]   {[ X     157.000000000000  Y      -0.975920021534 ]}
[157]   {[ X     158.000000000000  Y      -0.968580007553 ]}
[158]   {[ X     159.000000000000  Y      -0.960290014744 ]}
[159]   {[ X     160.000000000000  Y      -0.951059997082 ]}
[160]   {[ X     161.000000000000  Y      -0.940880000591 ]}
[161]   {[ X     162.000000000000  Y      -0.929780006409 ]}
[162]   {[ X     163.000000000000  Y      -0.917750000954 ]}
[163]   {[ X     164.000000000000  Y      -0.904829978943 ]}
[164]   {[ X     165.000000000000  Y      -0.891009986401 ]}
[165]   {[ X     166.000000000000  Y      -0.876309990883 ]}
[166]   {[ X     167.000000000000  Y      -0.860740005970 ]}
[167]   {[ X     168.000000000000  Y      -0.844330012798 ]}
[168]   {[ X     169.000000000000  Y      -0.827080011368 ]}
[169]   {[ X     170.000000000000  Y      -0.809019982815 ]}
[170]   {[ X     171.000000000000  Y      -0.790160000324 ]}
[171]   {[ X     172.000000000000  Y      -0.770510017872 ]}
[172]   {[ X     173.000000000000  Y      -0.750109970570 ]}
[173]   {[ X     174.000000000000  Y      -0.728969991207 ]}
[174]   {[ X     175.000000000000  Y      -0.707109987736 ]}
[175]   {[ X     176.000000000000  Y      -0.684549987316 ]}
[176]   {[ X     177.000000000000  Y      -0.661310017109 ]}
[177]   {[ X     178.000000000000  Y      -0.637419998646 ]}
[178]   {[ X     179.000000000000  Y      -0.612909972668 ]}
[179]   {[ X     180.000000000000  Y      -0.587790012360 ]}
[180]   {[ X     181.000000000000  Y      -0.562080025673 ]}
[181]   {[ X     182.000000000000  Y      -0.535830020905 ]}
[182]   {[ X     183.000000000000  Y      -0.509039998055 ]}
[183]   {[ X     184.000000000000  Y      -0.481750011444 ]}
[184]   {[ X     185.000000000000  Y      -0.453990012407 ]}
[185]   {[ X     186.000000000000  Y      -0.425779998302 ]}
[186]   {[ X     187.000000000000  Y      -0.397150009871 ]}
[187]   {[ X     188.000000000000  Y      -0.368120014668 ]}
[188]   {[ X     189.000000000000  Y      -0.338739991188 ]}
[189]   {[ X     190.000000000000  Y      -0.309020012617 ]}
[190]   {[ X     191.000000000000  Y      -0.278990000486 ]}
[191]   {[ X     192.000000000000  Y      -0.248689994216 ]}
[192]   {[ X     193.000000000000  Y      -0.218140006065 ]}
[193]   {[ X     194.000000000000  Y      -0.187380000949 ]}
[194]   {[ X     195.000000000000  Y      -0.156430006027 ]}
[195]   {[ X     196.000000000000  Y      -0.125330001116 ]}
[196]   {[ X     197.000000000000  Y      -0.094109997153 ]}
[197]   {[ X     198.000000000000  Y      -0.062789998949 ]}
[198]   {[ X     199.000000000000  Y      -0.031410001218 ]}
[199]   {[ X     200.000000000000  Y       0.000000000000 ]}

我的输出中的x值非常高,我不知道为什么,但我确定我的FFt工作正常......

这里有10kHz和11个周期:输入:

输出:

最终项目应使用1792000个数据集从输入进行FFT。我已经获得了数据并且知道最终信号的输出应该是什么样子,但是我的计算输出甚至没有接近。 在这里你可以看到最终输入:

我的输出:

,51kHz。这个:

应该是什么样子。

我做错了什么?

我希望你能帮助我,谢谢你的关注。

0 个答案:

没有答案
相关问题