我正在尝试对从振动传感器获得的一些信号进行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。这是输入:
和输出:
这就是我的预期:
。 这是输入数据:
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。这个:
应该是什么样子。
我做错了什么?
我希望你能帮助我,谢谢你的关注。